You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mi...@apache.org on 2016/02/05 05:32:11 UTC

[01/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 326728849 -> a8725a460


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.ScannerListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.ScannerListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.ScannerListener.html
index 4434339..0a8fce1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.ScannerListener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.ScannerListener.html
@@ -1155,1706 +1155,1717 @@
 <span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
 <span class="sourceLineNo">1148</span>  Region getRegion(<a name="line.1148"></a>
 <span class="sourceLineNo">1149</span>      final RegionSpecifier regionSpecifier) throws IOException {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    return regionServer.getRegionByEncodedName(regionSpecifier.getValue().toByteArray(),<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        ProtobufUtil.getRegionEncodedName(regionSpecifier));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  @VisibleForTesting<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  public PriorityFunction getPriority() {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return priority;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  @VisibleForTesting<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public Configuration getConfiguration() {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    return regionServer.getConfiguration();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private RegionServerQuotaManager getQuotaManager() {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    return regionServer.getRegionServerQuotaManager();<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  void start() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    rpcServer.start();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  void stop() {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    closeAllScanners();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    rpcServer.stop();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span><a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   * Called to verify that this server is up and running.<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   *<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>   * @throws IOException<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>   */<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>  protected void checkOpen() throws IOException {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    if (regionServer.isAborted()) {<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      throw new RegionServerAbortedException("Server " + regionServer.serverName + " aborting");<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    if (regionServer.isStopped()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      throw new RegionServerStoppedException("Server " + regionServer.serverName + " stopping");<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (!regionServer.fsOk) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      throw new RegionServerStoppedException("File system not available");<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    if (!regionServer.isOnline()) {<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      throw new ServerNotRunningYetException("Server is not running yet");<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  /**<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>   * @return list of blocking services and their security info classes that this server supports<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>   */<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>  protected List&lt;BlockingServiceAndInterface&gt; getServices() {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    List&lt;BlockingServiceAndInterface&gt; bssi = new ArrayList&lt;BlockingServiceAndInterface&gt;(2);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      ClientService.newReflectiveBlockingService(this),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      ClientService.BlockingInterface.class));<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      AdminService.newReflectiveBlockingService(this),<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      AdminService.BlockingInterface.class));<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    return bssi;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span><a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  public InetSocketAddress getSocketAddress() {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    return isa;<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span><a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>  @Override<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    return priority.getPriority(header, param, user);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>  @Override<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    return priority.getDeadline(header, param);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>  }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  /*<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * Check if an OOME and, if so, abort immediately to avoid creating more objects.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   *<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @param e<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   *<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>   * @return True if we OOME'd and are aborting.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>   */<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  @Override<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  public boolean checkOOME(final Throwable e) {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    boolean stop = false;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    try {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      if (e instanceof OutOfMemoryError<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          || (e.getCause() != null &amp;&amp; e.getCause() instanceof OutOfMemoryError)<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>          || (e.getMessage() != null &amp;&amp; e.getMessage().contains(<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>              "java.lang.OutOfMemoryError"))) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>        stop = true;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        LOG.fatal("Run out of memory; " + getClass().getSimpleName()<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>          + " will abort itself immediately", e);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    } finally {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>      if (stop) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>        Runtime.getRuntime().halt(1);<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      }<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    }<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    return stop;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>  }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>  /**<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>   * Close a region on the region server.<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   *<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>   * @param controller the RPC controller<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>   * @param request the request<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>   * @throws ServiceException<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>   */<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  @Override<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  public CloseRegionResponse closeRegion(final RpcController controller,<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      final CloseRegionRequest request) throws ServiceException {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    final ServerName sn = (request.hasDestinationServer() ?<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      ProtobufUtil.toServerName(request.getDestinationServer()) : null);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    try {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      checkOpen();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>      if (request.hasServerStartCode()) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>        // check that we are the same server that this RPC is intended for.<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        long serverStartCode = request.getServerStartCode();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>        if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>              "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>              + regionServer.serverName));<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion());<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span><a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      // Can be null if we're calling close on a region that's not online<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      final Region region = regionServer.getFromOnlineRegions(encodedRegionName);<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if ((region  != null) &amp;&amp; (region .getCoprocessorHost() != null)) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        region.getCoprocessorHost().preClose(false);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      requestCount.increment();<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      LOG.info("Close " + encodedRegionName + ", moving to " + sn);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      boolean closed = regionServer.closeRegion(encodedRegionName, false, sn);<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed);<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      return builder.build();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    } catch (IOException ie) {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      throw new ServiceException(ie);<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>  }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>  /**<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * Compact a region on the region server.<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   *<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * @param controller the RPC controller<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * @param request the request<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * @throws ServiceException<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   */<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  @Override<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      final CompactRegionRequest request) throws ServiceException {<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    try {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>      checkOpen();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      requestCount.increment();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      Region region = getRegion(request.getRegion());<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      region.startRegionOperation(Operation.COMPACT_REGION);<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString());<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      boolean major = false;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      byte [] family = null;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      Store store = null;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      if (request.hasFamily()) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        family = request.getFamily().toByteArray();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>        store = region.getStore(family);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>        if (store == null) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>          throw new ServiceException(new IOException("column family " + Bytes.toString(family)<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>            + " does not exist in region " + region.getRegionInfo().getRegionNameAsString()));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>        }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      if (request.hasMajor()) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>        major = request.getMajor();<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      }<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      if (major) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>        if (family != null) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>          store.triggerMajorCompaction();<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        } else {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          region.triggerMajorCompaction();<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>        }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):"";<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      if (LOG.isTraceEnabled()) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        LOG.trace("User-triggered compaction requested for region "<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>          + region.getRegionInfo().getRegionNameAsString() + familyLogMsg);<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg;<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if(family != null) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        regionServer.compactSplitThread.requestCompaction(region, store, log,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      } else {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        regionServer.compactSplitThread.requestCompaction(region, log,<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      }<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      return CompactRegionResponse.newBuilder().build();<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    } catch (IOException ie) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      throw new ServiceException(ie);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Flush a region on the region server.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param controller the RPC controller<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param request the request<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @throws ServiceException<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>  public FlushRegionResponse flushRegion(final RpcController controller,<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>      final FlushRegionRequest request) throws ServiceException {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    try {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      checkOpen();<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      requestCount.increment();<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      Region region = getRegion(request.getRegion());<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString());<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      boolean shouldFlush = true;<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      if (request.hasIfOlderThanTs()) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>        shouldFlush = region.getEarliestFlushTimeForAllStores() &lt; request.getIfOlderThanTs();<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder();<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (shouldFlush) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        boolean writeFlushWalMarker =  request.hasWriteFlushWalMarker() ?<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>            request.getWriteFlushWalMarker() : false;<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        // Go behind the curtain so we can manage writing of the flush WAL marker<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl)<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>            ((HRegion)region).flushcache(true, writeFlushWalMarker);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        if (flushResult.isFlushSucceeded()) {<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>          regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>        }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>        boolean compactionNeeded = flushResult.isCompactionNeeded();<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        if (compactionNeeded) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          regionServer.compactSplitThread.requestSystemCompaction(region,<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>            "Compaction through user triggered flush");<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        builder.setFlushed(flushResult.isFlushSucceeded());<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores());<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      return builder.build();<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    } catch (DroppedSnapshotException ex) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>      // is required. Currently the only way to do this is a restart of<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      // the server.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>      throw new ServiceException(ex);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    } catch (IOException ie) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      throw new ServiceException(ie);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span><a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>  @Override<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>  public GetOnlineRegionResponse getOnlineRegion(final RpcController controller,<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      final GetOnlineRegionRequest request) throws ServiceException {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    try {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      checkOpen();<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      requestCount.increment();<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      Map&lt;String, Region&gt; onlineRegions = regionServer.onlineRegions;<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      List&lt;HRegionInfo&gt; list = new ArrayList&lt;HRegionInfo&gt;(onlineRegions.size());<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      for (Region region: onlineRegions.values()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>        list.add(region.getRegionInfo());<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      }<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      Collections.sort(list);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      return ResponseConverter.buildGetOnlineRegionResponse(list);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    } catch (IOException ie) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      throw new ServiceException(ie);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>  @Override<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      final GetRegionInfoRequest request) throws ServiceException {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      checkOpen();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      requestCount.increment();<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>      Region region = getRegion(request.getRegion());<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      HRegionInfo info = region.getRegionInfo();<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      builder.setRegionInfo(HRegionInfo.convert(info));<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        builder.setCompactionState(region.getCompactionState());<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      builder.setIsRecovering(region.isRecovering());<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      return builder.build();<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    } catch (IOException ie) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      throw new ServiceException(ie);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span><a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>  /**<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * Get some information of the region server.<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   *<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   * @param controller the RPC controller<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>   * @param request the request<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>   * @throws ServiceException<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>   */<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>  @Override<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>  public GetServerInfoResponse getServerInfo(final RpcController controller,<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      final GetServerInfoRequest request) throws ServiceException {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    try {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      checkOpen();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    } catch (IOException ie) {<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      throw new ServiceException(ie);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    requestCount.increment();<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1;<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>  }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>  @Override<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  public GetStoreFileResponse getStoreFile(final RpcController controller,<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      final GetStoreFileRequest request) throws ServiceException {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    try {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      checkOpen();<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      Region region = getRegion(request.getRegion());<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      requestCount.increment();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Set&lt;byte[]&gt; columnFamilies;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      if (request.getFamilyCount() == 0) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>        columnFamilies = region.getTableDesc().getFamiliesKeys();<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      } else {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>        columnFamilies = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        for (ByteString cf: request.getFamilyList()) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          columnFamilies.add(cf.toByteArray());<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        }<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      int nCF = columnFamilies.size();<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      List&lt;String&gt;  fileList = region.getStoreFileList(<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        columnFamilies.toArray(new byte[nCF][]));<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>      GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder();<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      builder.addAllStoreFile(fileList);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      return builder.build();<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    } catch (IOException ie) {<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      throw new ServiceException(ie);<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  /**<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   * Merge regions on the region server.<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>   *<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>   * @param controller the RPC controller<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>   * @param request the request<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>   * @return merge regions response<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>   * @throws ServiceException<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>   */<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  @Override<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>  @QosPriority(priority = HConstants.ADMIN_QOS)<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>  public MergeRegionsResponse mergeRegions(final RpcController controller,<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      final MergeRegionsRequest request) throws ServiceException {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    try {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      checkOpen();<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      requestCount.increment();<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>      Region regionA = getRegion(request.getRegionA());<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      Region regionB = getRegion(request.getRegionB());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>      boolean forcible = request.getForcible();<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>      long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      regionA.startRegionOperation(Operation.MERGE_REGION);<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      regionB.startRegionOperation(Operation.MERGE_REGION);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (regionA.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID ||<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>          regionB.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) {<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        throw new ServiceException(new MergeRegionException("Can't merge non-default replicas"));<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      LOG.info("Receiving merging request for  " + regionA + ", " + regionB<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          + ",forcible=" + forcible);<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>      long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>      FlushResult flushResult = regionA.flush(true);<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      if (flushResult.isFlushSucceeded()) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      }<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      startTime = EnvironmentEdgeManager.currentTime();<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      flushResult = regionB.flush(true);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      if (flushResult.isFlushSucceeded()) {<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>        long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>      regionServer.compactSplitThread.requestRegionsMerge(regionA, regionB, forcible,<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          masterSystemTime, RpcServer.getRequestUser());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      return MergeRegionsResponse.newBuilder().build();<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    } catch (DroppedSnapshotException ex) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      throw new ServiceException(ex);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>    } catch (IOException ie) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      throw new ServiceException(ie);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>  }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span><a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  /**<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>   * Open asynchronously a region or a set of regions on the region server.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>   *<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>   * The opening is coordinated by ZooKeeper, and this method requires the znode to be created<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>   *  before being called. As a consequence, this method should be called only from the master.<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>   * &lt;p&gt;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>   * Different manages states for the region are:<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>   * &lt;/p&gt;&lt;ul&gt;<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>   *  &lt;li&gt;region not opened: the region opening will start asynchronously.&lt;/li&gt;<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>   *  &lt;li&gt;a close is already in progress: this is considered as an error.&lt;/li&gt;<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>   *  &lt;li&gt;an open is already in progress: this new open request will be ignored. This is important<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>   *  because the Master can do multiple requests if it crashes.&lt;/li&gt;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>   *  &lt;li&gt;the region is already opened:  this new open request will be ignored.&lt;/li&gt;<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>   *  &lt;/ul&gt;<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>   * &lt;p&gt;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>   * Bulk assign: If there are more than 1 region to open, it will be considered as a bulk assign.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>   * For a single region opening, errors are sent through a ServiceException. For bulk assign,<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>   * errors are put in the response as FAILED_OPENING.<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>   * &lt;/p&gt;<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * @param controller the RPC controller<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @param request the request<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   * @throws ServiceException<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>   */<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  @Override<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>  public OpenRegionResponse openRegion(final RpcController controller,<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      final OpenRegionRequest request) throws ServiceException {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    requestCount.increment();<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    if (request.hasServerStartCode()) {<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      // check that we are the same server that this RPC is intended for.<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>      long serverStartCode = request.getServerStartCode();<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>            "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>            + regionServer.serverName));<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    OpenRegionResponse.Builder builder = OpenRegionResponse.newBuilder();<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    final int regionCount = request.getOpenInfoCount();<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    final Map&lt;TableName, HTableDescriptor&gt; htds =<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>        new HashMap&lt;TableName, HTableDescriptor&gt;(regionCount);<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    final boolean isBulkAssign = regionCount &gt; 1;<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    try {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      checkOpen();<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    } catch (IOException ie) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>      TableName tableName = null;<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>      if (regionCount == 1) {<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>        RegionInfo ri = request.getOpenInfo(0).getRegion();<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>        if (ri != null) {<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          tableName = ProtobufUtil.toTableName(ri.getTableName());<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>        }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      if (!TableName.META_TABLE_NAME.equals(tableName)) {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>        throw new ServiceException(ie);<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>      // We are assigning meta, wait a little for regionserver to finish initialization.<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>      int timeout = regionServer.conf.getInt(HConstants.HBASE_RPC_TIMEOUT_KEY,<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        HConstants.DEFAULT_HBASE_RPC_TIMEOUT) &gt;&gt; 2; // Quarter of RPC timeout<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      long endTime = System.currentTimeMillis() + timeout;<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>      synchronized (regionServer.online) {<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>        try {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>          while (System.currentTimeMillis() &lt;= endTime<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>              &amp;&amp; !regionServer.isStopped() &amp;&amp; !regionServer.isOnline()) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>            regionServer.online.wait(regionServer.msgInterval);<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          }<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          checkOpen();<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        } catch (InterruptedException t) {<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          Thread.currentThread().interrupt();<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          throw new ServiceException(t);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>        } catch (IOException e) {<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          throw new ServiceException(e);<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>        }<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>      }<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    }<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1;<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>    for (RegionOpenInfo regionOpenInfo : request.getOpenInfoList()) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>      final HRegionInfo region = HRegionInfo.convert(regionOpenInfo.getRegion());<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>      HTableDescriptor htd;<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>      try {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>        String encodedName = region.getEncodedName();<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        byte[] encodedNameBytes = region.getEncodedNameAsBytes();<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>        final Region onlineRegion = regionServer.getFromOnlineRegions(encodedName);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>        if (onlineRegion != null) {<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>          // The region is already online. This should not happen any more.<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>          String error = "Received OPEN for the region:"<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            + region.getRegionNameAsString() + ", which is already online";<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>          regionServer.abort(error);<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>          throw new IOException(error);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>        }<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        LOG.info("Open " + region.getRegionNameAsString());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        htd = htds.get(region.getTable());<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        if (htd == null) {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          htd = regionServer.tableDescriptors.get(region.getTable());<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>          htds.put(region.getTable(), htd);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>        }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>        final Boolean previous = regionServer.regionsInTransitionInRS.putIfAbsent(<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          encodedNameBytes, Boolean.TRUE);<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        if (Boolean.FALSE.equals(previous)) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          if (regionServer.getFromOnlineRegions(encodedName) != null) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            // There is a close in progress. This should not happen any more.<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>            String error = "Received OPEN for the region:"<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              + region.getRegionNameAsString() + ", which we are already trying to CLOSE";<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            regionServer.abort(error);<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>            throw new IOException(error);<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>          }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          regionServer.regionsInTransitionInRS.put(encodedNameBytes, Boolean.TRUE);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        }<a name="line.1657"></a>
+<span class="sourceLineNo">1150</span>    ByteString value = regionSpecifier.getValue();<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    RegionSpecifierType type = regionSpecifier.getType();<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    switch (type) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      case REGION_NAME:<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        byte[] regionName = value.toByteArray();<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>        String encodedRegionName = HRegionInfo.encodeRegionName(regionName);<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>        return regionServer.getRegionByEncodedName(regionName, encodedRegionName);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      case ENCODED_REGION_NAME:<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        return regionServer.getRegionByEncodedName(value.toStringUtf8());<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      default:<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        throw new DoNotRetryIOException(<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          "Unsupported region specifier type: " + type);<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span><a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  @VisibleForTesting<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>  public PriorityFunction getPriority() {<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    return priority;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span><a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>  @VisibleForTesting<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  public Configuration getConfiguration() {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    return regionServer.getConfiguration();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  private RegionServerQuotaManager getQuotaManager() {<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    return regionServer.getRegionServerQuotaManager();<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span><a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>  void start() {<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    rpcServer.start();<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  }<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span><a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>  void stop() {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    closeAllScanners();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    rpcServer.stop();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>  }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span><a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>  /**<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   * Called to verify that this server is up and running.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   *<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @throws IOException<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   */<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  protected void checkOpen() throws IOException {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    if (regionServer.isAborted()) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      throw new RegionServerAbortedException("Server " + regionServer.serverName + " aborting");<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regionServer.isStopped()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      throw new RegionServerStoppedException("Server " + regionServer.serverName + " stopping");<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    if (!regionServer.fsOk) {<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      throw new RegionServerStoppedException("File system not available");<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!regionServer.isOnline()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      throw new ServerNotRunningYetException("Server is not running yet");<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>  }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span><a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  /**<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * @return list of blocking services and their security info classes that this server supports<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   */<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>  protected List&lt;BlockingServiceAndInterface&gt; getServices() {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    List&lt;BlockingServiceAndInterface&gt; bssi = new ArrayList&lt;BlockingServiceAndInterface&gt;(2);<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      ClientService.newReflectiveBlockingService(this),<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      ClientService.BlockingInterface.class));<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      AdminService.newReflectiveBlockingService(this),<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      AdminService.BlockingInterface.class));<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    return bssi;<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>  public InetSocketAddress getSocketAddress() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return isa;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  @Override<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    return priority.getPriority(header, param, user);<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return priority.getDeadline(header, param);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  /*<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>   * Check if an OOME and, if so, abort immediately to avoid creating more objects.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>   *<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>   * @param e<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   *<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * @return True if we OOME'd and are aborting.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  public boolean checkOOME(final Throwable e) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    boolean stop = false;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>      if (e instanceof OutOfMemoryError<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>          || (e.getCause() != null &amp;&amp; e.getCause() instanceof OutOfMemoryError)<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>          || (e.getMessage() != null &amp;&amp; e.getMessage().contains(<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>              "java.lang.OutOfMemoryError"))) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        stop = true;<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>        LOG.fatal("Run out of memory; " + getClass().getSimpleName()<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>          + " will abort itself immediately", e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    } finally {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      if (stop) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        Runtime.getRuntime().halt(1);<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    return stop;<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span><a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>  /**<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   * Close a region on the region server.<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>   *<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>   * @param controller the RPC controller<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>   * @param request the request<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>   * @throws ServiceException<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>   */<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>  public CloseRegionResponse closeRegion(final RpcController controller,<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      final CloseRegionRequest request) throws ServiceException {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    final ServerName sn = (request.hasDestinationServer() ?<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      ProtobufUtil.toServerName(request.getDestinationServer()) : null);<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    try {<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>      checkOpen();<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      if (request.hasServerStartCode()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        // check that we are the same server that this RPC is intended for.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        long serverStartCode = request.getServerStartCode();<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>        if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>              "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>              + regionServer.serverName));<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion());<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // Can be null if we're calling close on a region that's not online<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      final Region region = regionServer.getFromOnlineRegions(encodedRegionName);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      if ((region  != null) &amp;&amp; (region .getCoprocessorHost() != null)) {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>        region.getCoprocessorHost().preClose(false);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      requestCount.increment();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      LOG.info("Close " + encodedRegionName + ", moving to " + sn);<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      boolean closed = regionServer.closeRegion(encodedRegionName, false, sn);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return builder.build();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    } catch (IOException ie) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      throw new ServiceException(ie);<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span><a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  /**<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * Compact a region on the region server.<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   *<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   * @param controller the RPC controller<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * @param request the request<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * @throws ServiceException<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  @Override<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>      final CompactRegionRequest request) throws ServiceException {<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    try {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>      checkOpen();<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>      requestCount.increment();<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      Region region = getRegion(request.getRegion());<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      region.startRegionOperation(Operation.COMPACT_REGION);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString());<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      boolean major = false;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      byte [] family = null;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>      Store store = null;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>      if (request.hasFamily()) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>        family = request.getFamily().toByteArray();<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>        store = region.getStore(family);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>        if (store == null) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>          throw new ServiceException(new IOException("column family " + Bytes.toString(family)<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>            + " does not exist in region " + region.getRegionInfo().getRegionNameAsString()));<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>        }<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      if (request.hasMajor()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        major = request.getMajor();<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      if (major) {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        if (family != null) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>          store.triggerMajorCompaction();<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        } else {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>          region.triggerMajorCompaction();<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span><a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):"";<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (LOG.isTraceEnabled()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        LOG.trace("User-triggered compaction requested for region "<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          + region.getRegionInfo().getRegionNameAsString() + familyLogMsg);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      if(family != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>        regionServer.compactSplitThread.requestCompaction(region, store, log,<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>      } else {<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>        regionServer.compactSplitThread.requestCompaction(region, log,<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return CompactRegionResponse.newBuilder().build();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    } catch (IOException ie) {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      throw new ServiceException(ie);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span><a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>  /**<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * Flush a region on the region server.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   *<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * @param controller the RPC controller<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * @param request the request<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * @throws ServiceException<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   */<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  @Override<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  public FlushRegionResponse flushRegion(final RpcController controller,<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>      final FlushRegionRequest request) throws ServiceException {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    try {<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      checkOpen();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      requestCount.increment();<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      Region region = getRegion(request.getRegion());<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>      LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString());<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>      boolean shouldFlush = true;<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      if (request.hasIfOlderThanTs()) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        shouldFlush = region.getEarliestFlushTimeForAllStores() &lt; request.getIfOlderThanTs();<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      if (shouldFlush) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        boolean writeFlushWalMarker =  request.hasWriteFlushWalMarker() ?<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>            request.getWriteFlushWalMarker() : false;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>        // Go behind the curtain so we can manage writing of the flush WAL marker<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl)<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            ((HRegion)region).flushcache(true, writeFlushWalMarker);<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        if (flushResult.isFlushSucceeded()) {<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        boolean compactionNeeded = flushResult.isCompactionNeeded();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>        if (compactionNeeded) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>          regionServer.compactSplitThread.requestSystemCompaction(region,<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>            "Compaction through user triggered flush");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        }<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        builder.setFlushed(flushResult.isFlushSucceeded());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker);<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores());<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return builder.build();<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    } catch (DroppedSnapshotException ex) {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>      // is required. Currently the only way to do this is a restart of<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      // the server.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>      throw new ServiceException(ex);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    } catch (IOException ie) {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      throw new ServiceException(ie);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>  }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>  @Override<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>  public GetOnlineRegionResponse getOnlineRegion(final RpcController controller,<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      final GetOnlineRegionRequest request) throws ServiceException {<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    try {<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>      checkOpen();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      requestCount.increment();<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>      Map&lt;String, Region&gt; onlineRegions = regionServer.onlineRegions;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      List&lt;HRegionInfo&gt; list = new ArrayList&lt;HRegionInfo&gt;(onlineRegions.size());<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      for (Region region: onlineRegions.values()) {<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        list.add(region.getRegionInfo());<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      }<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>      Collections.sort(list);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      return ResponseConverter.buildGetOnlineRegionResponse(list);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    } catch (IOException ie) {<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      throw new ServiceException(ie);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    }<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>  }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      final GetRegionInfoRequest request) throws ServiceException {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>    try {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>      checkOpen();<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      requestCount.increment();<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      Region region = getRegion(request.getRegion());<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      HRegionInfo info = region.getRegionInfo();<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      builder.setRegionInfo(HRegionInfo.convert(info));<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>        builder.setCompactionState(region.getCompactionState());<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>      }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>      builder.setIsRecovering(region.isRecovering());<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>      return builder.build();<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    } catch (IOException ie) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throw new ServiceException(ie);<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    }<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span><a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>  /**<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>   * Get some information of the region server.<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>   *<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>   * @param controller the RPC controller<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>   * @param request the request<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * @throws ServiceException<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  @Override<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>  public GetServerInfoResponse getServerInfo(final RpcController controller,<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      final GetServerInfoRequest request) throws ServiceException {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    try {<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      checkOpen();<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    } catch (IOException ie) {<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      throw new ServiceException(ie);<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>    }<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    requestCount.increment();<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>  }<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span><a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>  @Override<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>  public GetStoreFileResponse getStoreFile(final RpcController controller,<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      final GetStoreFileRequest request) throws ServiceException {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    try {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      checkOpen();<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      Region region = getRegion(request.getRegion());<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      requestCount.increment();<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>      Set&lt;byte[]&gt; columnFamilies;<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>      if (request.getFamilyCount() == 0) {<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>        columnFamilies = region.getTableDesc().getFamiliesKeys();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      } else {<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>        columnFamilies = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>        for (ByteString cf: request.getFamilyList()) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>          columnFamilies.add(cf.toByteArray());<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>      }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>      int nCF = columnFamilies.size();<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      List&lt;String&gt;  fileList = region.getStoreFileList(<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        columnFamilies.toArray(new byte[nCF][]));<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder();<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      builder.addAllStoreFile(fileList);<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      return builder.build();<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    } catch (IOException ie) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>      throw new ServiceException(ie);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>    }<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span><a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>  /**<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>   * Merge regions on the region server.<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   *<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   * @param controller the RPC controller<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>   * @param request the request<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>   * @return merge regions response<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>   * @throws ServiceException<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>   */<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  @Override<a name="line.1515"></a>
+<span class="sourceLineNo">

<TRUNCATED>

[26/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
index f72db18..621c781 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
@@ -104,346 +104,350 @@
 <span class="sourceLineNo">096</span>  @Override<a name="line.96"></a>
 <span class="sourceLineNo">097</span>  protected void chore() {<a name="line.97"></a>
 <span class="sourceLineNo">098</span>    try {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      if (this.enabled.get()) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        scan();<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      } else {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>        LOG.warn("CatalogJanitor disabled! Not running scan.");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      }<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    } catch (IOException e) {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      LOG.warn("Failed scan of catalog table", e);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  /**<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * Scans hbase:meta and returns a number of scanned rows, and a map of merged<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * regions, and an ordered map of split parents.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * @return triple of scanned rows, map of merged regions and map of split<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   *         parent regioninfos<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * @throws IOException<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   */<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    getMergedRegionsAndSplitParents() throws IOException {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    return getMergedRegionsAndSplitParents(null);<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>  /**<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * Scans hbase:meta and returns a number of scanned rows, and a map of merged<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * regions, and an ordered map of split parents. if the given table name is<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * null, return merged regions and split parents of all tables, else only the<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   * specified table<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   * @param tableName null represents all tables<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * @return triple of scanned rows, and map of merged regions, and map of split<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   *         parent regioninfos<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   * @throws IOException<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   */<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    getMergedRegionsAndSplitParents(final TableName tableName) throws IOException {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    final boolean isTableSpecified = (tableName != null);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    // TODO: Only works with single hbase:meta region currently.  Fix.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    // Keep Map of found split parents.  There are candidates for cleanup.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // Use a comparator that has split parents come before its daughters.<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    final Map&lt;HRegionInfo, Result&gt; splitParents =<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      new TreeMap&lt;HRegionInfo, Result&gt;(new SplitParentFirstComparator());<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    final Map&lt;HRegionInfo, Result&gt; mergedRegions = new TreeMap&lt;HRegionInfo, Result&gt;();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    // This visitor collects split parents and counts rows in the hbase:meta table<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>    MetaTableAccessor.Visitor visitor = new MetaTableAccessor.Visitor() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      @Override<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      public boolean visit(Result r) throws IOException {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        if (r == null || r.isEmpty()) return true;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        count.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        HRegionInfo info = MetaTableAccessor.getHRegionInfo(r);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        if (info == null) return true; // Keep scanning<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        if (isTableSpecified<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            &amp;&amp; info.getTable().compareTo(tableName) &gt; 0) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          // Another table, stop scanning<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          return false;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        if (info.isSplitParent()) splitParents.put(info, r);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        if (r.getValue(HConstants.CATALOG_FAMILY, HConstants.MERGEA_QUALIFIER) != null) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>          mergedRegions.put(info, r);<a name="line.157"></a>
+<span class="sourceLineNo">099</span>      AssignmentManager am = this.services.getAssignmentManager();<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      if (this.enabled.get()<a name="line.100"></a>
+<span class="sourceLineNo">101</span>          &amp;&amp; am != null<a name="line.101"></a>
+<span class="sourceLineNo">102</span>          &amp;&amp; am.isFailoverCleanupDone()<a name="line.102"></a>
+<span class="sourceLineNo">103</span>          &amp;&amp; am.getRegionStates().getRegionsInTransition().size() == 0) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        scan();<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      } else {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        LOG.warn("CatalogJanitor disabled! Not running scan.");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      }<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    } catch (IOException e) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      LOG.warn("Failed scan of catalog table", e);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<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>   * Scans hbase:meta and returns a number of scanned rows, and a map of merged<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * regions, and an ordered map of split parents.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * @return triple of scanned rows, map of merged regions and map of split<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   *         parent regioninfos<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * @throws IOException<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    getMergedRegionsAndSplitParents() throws IOException {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    return getMergedRegionsAndSplitParents(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>   * Scans hbase:meta and returns a number of scanned rows, and a map of merged<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   * regions, and an ordered map of split parents. if the given table name is<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * null, return merged regions and split parents of all tables, else only the<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * specified table<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * @param tableName null represents all tables<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * @return triple of scanned rows, and map of merged regions, and map of split<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   *         parent regioninfos<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @throws IOException<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    getMergedRegionsAndSplitParents(final TableName tableName) throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    final boolean isTableSpecified = (tableName != null);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    // TODO: Only works with single hbase:meta region currently.  Fix.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    // Keep Map of found split parents.  There are candidates for cleanup.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    // Use a comparator that has split parents come before its daughters.<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    final Map&lt;HRegionInfo, Result&gt; splitParents =<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      new TreeMap&lt;HRegionInfo, Result&gt;(new SplitParentFirstComparator());<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    final Map&lt;HRegionInfo, Result&gt; mergedRegions = new TreeMap&lt;HRegionInfo, Result&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // This visitor collects split parents and counts rows in the hbase:meta table<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    MetaTableAccessor.Visitor visitor = new MetaTableAccessor.Visitor() {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      public boolean visit(Result r) throws IOException {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        if (r == null || r.isEmpty()) return true;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        count.incrementAndGet();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        HRegionInfo info = MetaTableAccessor.getHRegionInfo(r);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        if (info == null) return true; // Keep scanning<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        if (isTableSpecified<a name="line.154"></a>
+<span class="sourceLineNo">155</span>            &amp;&amp; info.getTable().compareTo(tableName) &gt; 0) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          // Another table, stop scanning<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          return false;<a name="line.157"></a>
 <span class="sourceLineNo">158</span>        }<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        // Returning true means "keep scanning"<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        return true;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      }<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    };<a name="line.162"></a>
-<span class="sourceLineNo">163</span><a name="line.163"></a>
-<span class="sourceLineNo">164</span>    // Run full scan of hbase:meta catalog table passing in our custom visitor with<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    // the start row<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    MetaTableAccessor.scanMetaForTableRegions(this.connection, visitor, tableName);<a name="line.166"></a>
+<span class="sourceLineNo">159</span>        if (info.isSplitParent()) splitParents.put(info, r);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        if (r.getValue(HConstants.CATALOG_FAMILY, HConstants.MERGEA_QUALIFIER) != null) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>          mergedRegions.put(info, r);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        }<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        // Returning true means "keep scanning"<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        return true;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    };<a name="line.166"></a>
 <span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    return new Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;(<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        count.get(), mergedRegions, splitParents);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">168</span>    // Run full scan of hbase:meta catalog table passing in our custom visitor with<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    // the start row<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    MetaTableAccessor.scanMetaForTableRegions(this.connection, visitor, tableName);<a name="line.170"></a>
 <span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * If merged region no longer holds reference to the merge regions, archive<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * merge region on hdfs and perform deleting references in hbase:meta<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param mergedRegion<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @param regionA<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @param regionB<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @return true if we delete references in merged region on hbase:meta and archive<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   *         the files on the file system<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @throws IOException<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  boolean cleanMergeRegion(final HRegionInfo mergedRegion,<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      final HRegionInfo regionA, final HRegionInfo regionB) throws IOException {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    Path tabledir = FSUtils.getTableDir(rootdir, mergedRegion.getTable());<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    HTableDescriptor htd = getTableDescriptor(mergedRegion.getTable());<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    HRegionFileSystem regionFs = null;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    try {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.190"></a>
-<span class="sourceLineNo">191</span>          this.services.getConfiguration(), fs, tabledir, mergedRegion, true);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    } catch (IOException e) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      LOG.warn("Merged region does not exist: " + mergedRegion.getEncodedName());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (regionFs == null || !regionFs.hasReferences(htd)) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      LOG.debug("Deleting region " + regionA.getRegionNameAsString() + " and "<a name="line.196"></a>
-<span class="sourceLineNo">197</span>          + regionB.getRegionNameAsString()<a name="line.197"></a>
-<span class="sourceLineNo">198</span>          + " from fs because merged region no longer holds references");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, regionA);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, regionB);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      MetaTableAccessor.deleteMergeQualifiers(server.getConnection(),<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        mergedRegion);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      return true;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    return false;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  /**<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   * Run janitorial scan of catalog &lt;code&gt;hbase:meta&lt;/code&gt; table looking for<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * garbage to collect.<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * @return number of cleaned regions<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * @throws IOException<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  int scan() throws IOException {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    try {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      if (!alreadyRunning.compareAndSet(false, true)) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        LOG.debug("CatalogJanitor already running");<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        return 0;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt; scanTriple =<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        getMergedRegionsAndSplitParents();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      int count = scanTriple.getFirst();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      /**<a name="line.223"></a>
-<span class="sourceLineNo">224</span>       * clean merge regions first<a name="line.224"></a>
-<span class="sourceLineNo">225</span>       */<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      int mergeCleaned = 0;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      Map&lt;HRegionInfo, Result&gt; mergedRegions = scanTriple.getSecond();<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : mergedRegions.entrySet()) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        PairOfSameType&lt;HRegionInfo&gt; p = MetaTableAccessor.getMergeRegions(e.getValue());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        HRegionInfo regionA = p.getFirst();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        HRegionInfo regionB = p.getSecond();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        if (regionA == null || regionB == null) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          LOG.warn("Unexpected references regionA="<a name="line.233"></a>
-<span class="sourceLineNo">234</span>              + (regionA == null ? "null" : regionA.getRegionNameAsString())<a name="line.234"></a>
-<span class="sourceLineNo">235</span>              + ",regionB="<a name="line.235"></a>
-<span class="sourceLineNo">236</span>              + (regionB == null ? "null" : regionB.getRegionNameAsString())<a name="line.236"></a>
-<span class="sourceLineNo">237</span>              + " in merged region " + e.getKey().getRegionNameAsString());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        } else {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          if (cleanMergeRegion(e.getKey(), regionA, regionB)) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            mergeCleaned++;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      /**<a name="line.244"></a>
-<span class="sourceLineNo">245</span>       * clean split parents<a name="line.245"></a>
-<span class="sourceLineNo">246</span>       */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      Map&lt;HRegionInfo, Result&gt; splitParents = scanTriple.getThird();<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>      // Now work on our list of found parents. See if any we can clean up.<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      int splitCleaned = 0;<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      // regions whose parents are still around<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      HashSet&lt;String&gt; parentNotCleaned = new HashSet&lt;String&gt;();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : splitParents.entrySet()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        if (!parentNotCleaned.contains(e.getKey().getEncodedName()) &amp;&amp;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            cleanParent(e.getKey(), e.getValue())) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          splitCleaned++;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } else {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          // We could not clean the parent, so it's daughters should not be<a name="line.258"></a>
-<span class="sourceLineNo">259</span>          // cleaned either (HBASE-6160)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          PairOfSameType&lt;HRegionInfo&gt; daughters =<a name="line.260"></a>
-<span class="sourceLineNo">261</span>              MetaTableAccessor.getDaughterRegions(e.getValue());<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          parentNotCleaned.add(daughters.getFirst().getEncodedName());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          parentNotCleaned.add(daughters.getSecond().getEncodedName());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      if ((mergeCleaned + splitCleaned) != 0) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        LOG.info("Scanned " + count + " catalog row(s), gc'd " + mergeCleaned<a name="line.267"></a>
-<span class="sourceLineNo">268</span>            + " unreferenced merged region(s) and " + splitCleaned<a name="line.268"></a>
-<span class="sourceLineNo">269</span>            + " unreferenced parent region(s)");<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } else if (LOG.isTraceEnabled()) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.trace("Scanned " + count + " catalog row(s), gc'd " + mergeCleaned<a name="line.271"></a>
+<span class="sourceLineNo">172</span>    return new Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        count.get(), mergedRegions, splitParents);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  }<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span>  /**<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * If merged region no longer holds reference to the merge regions, archive<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   * merge region on hdfs and perform deleting references in hbase:meta<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * @param mergedRegion<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param regionA<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * @param regionB<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @return true if we delete references in merged region on hbase:meta and archive<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   *         the files on the file system<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @throws IOException<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  boolean cleanMergeRegion(final HRegionInfo mergedRegion,<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      final HRegionInfo regionA, final HRegionInfo regionB) throws IOException {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    Path tabledir = FSUtils.getTableDir(rootdir, mergedRegion.getTable());<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    HTableDescriptor htd = getTableDescriptor(mergedRegion.getTable());<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    HRegionFileSystem regionFs = null;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    try {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          this.services.getConfiguration(), fs, tabledir, mergedRegion, true);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    } catch (IOException e) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      LOG.warn("Merged region does not exist: " + mergedRegion.getEncodedName());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (regionFs == null || !regionFs.hasReferences(htd)) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      LOG.debug("Deleting region " + regionA.getRegionNameAsString() + " and "<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          + regionB.getRegionNameAsString()<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          + " from fs because merged region no longer holds references");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, regionA);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, regionB);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      MetaTableAccessor.deleteMergeQualifiers(server.getConnection(),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        mergedRegion);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      return true;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return false;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Run janitorial scan of catalog &lt;code&gt;hbase:meta&lt;/code&gt; table looking for<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * garbage to collect.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @return number of cleaned regions<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * @throws IOException<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   */<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  int scan() throws IOException {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    try {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (!alreadyRunning.compareAndSet(false, true)) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        LOG.debug("CatalogJanitor already running");<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        return 0;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt; scanTriple =<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        getMergedRegionsAndSplitParents();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      int count = scanTriple.getFirst();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      /**<a name="line.227"></a>
+<span class="sourceLineNo">228</span>       * clean merge regions first<a name="line.228"></a>
+<span class="sourceLineNo">229</span>       */<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      int mergeCleaned = 0;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      Map&lt;HRegionInfo, Result&gt; mergedRegions = scanTriple.getSecond();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : mergedRegions.entrySet()) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        PairOfSameType&lt;HRegionInfo&gt; p = MetaTableAccessor.getMergeRegions(e.getValue());<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        HRegionInfo regionA = p.getFirst();<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        HRegionInfo regionB = p.getSecond();<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        if (regionA == null || regionB == null) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>          LOG.warn("Unexpected references regionA="<a name="line.237"></a>
+<span class="sourceLineNo">238</span>              + (regionA == null ? "null" : regionA.getRegionNameAsString())<a name="line.238"></a>
+<span class="sourceLineNo">239</span>              + ",regionB="<a name="line.239"></a>
+<span class="sourceLineNo">240</span>              + (regionB == null ? "null" : regionB.getRegionNameAsString())<a name="line.240"></a>
+<span class="sourceLineNo">241</span>              + " in merged region " + e.getKey().getRegionNameAsString());<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        } else {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          if (cleanMergeRegion(e.getKey(), regionA, regionB)) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>            mergeCleaned++;<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>      }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      /**<a name="line.248"></a>
+<span class="sourceLineNo">249</span>       * clean split parents<a name="line.249"></a>
+<span class="sourceLineNo">250</span>       */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      Map&lt;HRegionInfo, Result&gt; splitParents = scanTriple.getThird();<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>      // Now work on our list of found parents. See if any we can clean up.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      int splitCleaned = 0;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      // regions whose parents are still around<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      HashSet&lt;String&gt; parentNotCleaned = new HashSet&lt;String&gt;();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : splitParents.entrySet()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        if (!parentNotCleaned.contains(e.getKey().getEncodedName()) &amp;&amp;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            cleanParent(e.getKey(), e.getValue())) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          splitCleaned++;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        } else {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>          // We could not clean the parent, so it's daughters should not be<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          // cleaned either (HBASE-6160)<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          PairOfSameType&lt;HRegionInfo&gt; daughters =<a name="line.264"></a>
+<span class="sourceLineNo">265</span>              MetaTableAccessor.getDaughterRegions(e.getValue());<a name="line.265"></a>
+<span class="sourceLineNo">266</span>          parentNotCleaned.add(daughters.getFirst().getEncodedName());<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          parentNotCleaned.add(daughters.getSecond().getEncodedName());<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      if ((mergeCleaned + splitCleaned) != 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        LOG.info("Scanned " + count + " catalog row(s), gc'd " + mergeCleaned<a name="line.271"></a>
 <span class="sourceLineNo">272</span>            + " unreferenced merged region(s) and " + splitCleaned<a name="line.272"></a>
 <span class="sourceLineNo">273</span>            + " unreferenced parent region(s)");<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      return mergeCleaned + splitCleaned;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } finally {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      alreadyRunning.set(false);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  }<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>  /**<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * Compare HRegionInfos in a way that has split parents sort BEFORE their<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * daughters.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   */<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  static class SplitParentFirstComparator implements Comparator&lt;HRegionInfo&gt; {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Comparator&lt;byte[]&gt; rowEndKeyComparator = new Bytes.RowEndKeyComparator();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    @Override<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    public int compare(HRegionInfo left, HRegionInfo right) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      // This comparator differs from the one HRegionInfo in that it sorts<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      // parent before daughters.<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      if (left == null) return -1;<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      if (right == null) return 1;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // Same table name.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int result = left.getTable().compareTo(right.getTable());<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      if (result != 0) return result;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      // Compare start keys.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      result = Bytes.compareTo(left.getStartKey(), right.getStartKey());<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      if (result != 0) return result;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      // Compare end keys, but flip the operands so parent comes first<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      result = rowEndKeyComparator.compare(right.getEndKey(), left.getEndKey());<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      return result;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
+<span class="sourceLineNo">274</span>      } else if (LOG.isTraceEnabled()) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        LOG.trace("Scanned " + count + " catalog row(s), gc'd " + mergeCleaned<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            + " unreferenced merged region(s) and " + splitCleaned<a name="line.276"></a>
+<span class="sourceLineNo">277</span>            + " unreferenced parent region(s)");<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return mergeCleaned + splitCleaned;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      alreadyRunning.set(false);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<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>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Compare HRegionInfos in a way that has split parents sort BEFORE their<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * daughters.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  static class SplitParentFirstComparator implements Comparator&lt;HRegionInfo&gt; {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    Comparator&lt;byte[]&gt; rowEndKeyComparator = new Bytes.RowEndKeyComparator();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    @Override<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    public int compare(HRegionInfo left, HRegionInfo right) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      // This comparator differs from the one HRegionInfo in that it sorts<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      // parent before daughters.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      if (left == null) return -1;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      if (right == null) return 1;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      // Same table name.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      int result = left.getTable().compareTo(right.getTable());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      if (result != 0) return result;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      // Compare start keys.<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      result = Bytes.compareTo(left.getStartKey(), right.getStartKey());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      if (result != 0) return result;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      // Compare end keys, but flip the operands so parent comes first<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      result = rowEndKeyComparator.compare(right.getEndKey(), left.getEndKey());<a name="line.304"></a>
 <span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  /**<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * If daughters no longer hold reference to the parents, delete the parent.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   * @param parent HRegionInfo of split offlined parent<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   * @param rowContent Content of &lt;code&gt;parent&lt;/code&gt; row in<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   * &lt;code&gt;metaRegionName&lt;/code&gt;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * @return True if we removed &lt;code&gt;parent&lt;/code&gt; from meta table and from<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * the filesystem.<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @throws IOException<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  boolean cleanParent(final HRegionInfo parent, Result rowContent)<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  throws IOException {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    boolean result = false;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    // Check whether it is a merged region and not clean reference<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    // No necessary to check MERGEB_QUALIFIER because these two qualifiers will<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    // be inserted/deleted together<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (rowContent.getValue(HConstants.CATALOG_FAMILY,<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        HConstants.MERGEA_QUALIFIER) != null) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // wait cleaning merge region first<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      return result;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    // Run checks on each daughter split.<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    PairOfSameType&lt;HRegionInfo&gt; daughters = MetaTableAccessor.getDaughterRegions(rowContent);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    Pair&lt;Boolean, Boolean&gt; a = checkDaughterInFs(parent, daughters.getFirst());<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Pair&lt;Boolean, Boolean&gt; b = checkDaughterInFs(parent, daughters.getSecond());<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (hasNoReferences(a) &amp;&amp; hasNoReferences(b)) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      LOG.debug("Deleting region " + parent.getRegionNameAsString() +<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        " because daughter splits no longer hold references");<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      if (LOG.isTraceEnabled()) LOG.trace("Archiving parent region: " + parent);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, parent);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      MetaTableAccessor.deleteRegion(this.connection, parent);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      result = true;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return result;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  /**<a name="line.342"></a>
-<span class="sourceLineNo">343</span>   * @param p A pair where the first boolean says whether or not the daughter<a name="line.343"></a>
-<span class="sourceLineNo">344</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.344"></a>
-<span class="sourceLineNo">345</span>   * whether the daughter has references to the parent.<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * @return True the passed &lt;code&gt;p&lt;/code&gt; signifies no references.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private boolean hasNoReferences(final Pair&lt;Boolean, Boolean&gt; p) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    return !p.getFirst() || !p.getSecond();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>  /**<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * Checks if a daughter region -- either splitA or splitB -- still holds<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * references to parent.<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param parent Parent region<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @param daughter Daughter region<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @return A pair where the first boolean says whether or not the daughter<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   * whether the daughter has references to the parent.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * @throws IOException<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  Pair&lt;Boolean, Boolean&gt; checkDaughterInFs(final HRegionInfo parent, final HRegionInfo daughter)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    if (daughter == null)  {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    Path tabledir = FSUtils.getTableDir(rootdir, daughter.getTable());<a name="line.370"></a>
+<span class="sourceLineNo">306</span>      return result;<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * If daughters no longer hold reference to the parents, delete the parent.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   * @param parent HRegionInfo of split offlined parent<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   * @param rowContent Content of &lt;code&gt;parent&lt;/code&gt; row in<a name="line.313"></a>
+<span class="sourceLineNo">314</span>   * &lt;code&gt;metaRegionName&lt;/code&gt;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * @return True if we removed &lt;code&gt;parent&lt;/code&gt; from meta table and from<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   * the filesystem.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * @throws IOException<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  boolean cleanParent(final HRegionInfo parent, Result rowContent)<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  throws IOException {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    boolean result = false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    // Check whether it is a merged region and not clean reference<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    // No necessary to check MERGEB_QUALIFIER because these two qualifiers will<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    // be inserted/deleted together<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    if (rowContent.getValue(HConstants.CATALOG_FAMILY,<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        HConstants.MERGEA_QUALIFIER) != null) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      // wait cleaning merge region first<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return result;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    // Run checks on each daughter split.<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    PairOfSameType&lt;HRegionInfo&gt; daughters = MetaTableAccessor.getDaughterRegions(rowContent);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    Pair&lt;Boolean, Boolean&gt; a = checkDaughterInFs(parent, daughters.getFirst());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    Pair&lt;Boolean, Boolean&gt; b = checkDaughterInFs(parent, daughters.getSecond());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (hasNoReferences(a) &amp;&amp; hasNoReferences(b)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      LOG.debug("Deleting region " + parent.getRegionNameAsString() +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        " because daughter splits no longer hold references");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      if (LOG.isTraceEnabled()) LOG.trace("Archiving parent region: " + parent);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, parent);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      MetaTableAccessor.deleteRegion(this.connection, parent);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      result = true;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    return result;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  /**<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * @param p A pair where the first boolean says whether or not the daughter<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.348"></a>
+<span class="sourceLineNo">349</span>   * whether the daughter has references to the parent.<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * @return True the passed &lt;code&gt;p&lt;/code&gt; signifies no references.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private boolean hasNoReferences(final Pair&lt;Boolean, Boolean&gt; p) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return !p.getFirst() || !p.getSecond();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  /**<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * Checks if a daughter region -- either splitA or splitB -- still holds<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * references to parent.<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @param parent Parent region<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   * @param daughter Daughter region<a name="line.360"></a>
+<span class="sourceLineNo">361</span>   * @return A pair where the first boolean says whether or not the daughter<a name="line.361"></a>
+<span class="sourceLineNo">362</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * whether the daughter has references to the parent.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @throws IOException<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   */<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  Pair&lt;Boolean, Boolean&gt; checkDaughterInFs(final HRegionInfo parent, final HRegionInfo daughter)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  throws IOException {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    if (daughter == null)  {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
 <span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>    Path daughterRegionDir = new Path(tabledir, daughter.getEncodedName());<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>    HRegionFileSystem regionFs = null;<a name="line.374"></a>
+<span class="sourceLineNo">372</span>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    Path tabledir = FSUtils.getTableDir(rootdir, daughter.getTable());<a name="line.374"></a>
 <span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    try {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      if (!FSUtils.isExists(fs, daughterRegionDir)) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        return new Pair&lt;Boolean, Boolean&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    } catch (IOException ioe) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      LOG.warn("Error trying to determine if daughter region exists, " +<a name="line.381"></a>
-<span class="sourceLineNo">382</span>               "assuming exists and has references", ioe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          this.services.getConfiguration(), fs, tabledir, daughter, true);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    } catch (IOException e) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      LOG.warn("Error trying to determine referenced files from : " + daughter.getEncodedName()<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          + ", to: " + parent.getEncodedName() + " assuming has references", e);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>    boolean references = false;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor parentDescriptor = getTableDescriptor(parent.getTable());<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    for (HColumnDescriptor family: parentDescriptor.getFamilies()) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      if ((references = regionFs.hasReferences(family.getNameAsString()))) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        break;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.valueOf(references));<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  private HTableDescriptor getTableDescriptor(final TableName tableName)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      throws FileNotFoundException, IOException {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return this.services.getTableDescriptors().get(tableName);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /**<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Checks if the specified region has merge qualifiers, if so, try to clean<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * them<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   * @param region<a name="line.413"></a>
-<span class="sourceLineNo">414</span>   * @return true if the specified region doesn't have merge qualifier now<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   * @throws IOException<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public boolean cleanMergeQualifier(final HRegionInfo region)<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      throws IOException {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Get merge regions if it is a merged region and already has merge<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    // qualifier<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Pair&lt;HRegionInfo, HRegionInfo&gt; mergeRegions = MetaTableAccessor<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        .getRegionsFromMergeQualifier(this.services.getConnection(),<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          region.getRegionName());<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    if (mergeRegions == null<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        || (mergeRegions.getFirst() == null &amp;&amp; mergeRegions.getSecond() == null)) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      // It doesn't have merge qualifier, no need to clean<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      return true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    // It shouldn't happen, we must insert/delete these two qualifiers together<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (mergeRegions.getFirst() == null || mergeRegions.getSecond() == null) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      LOG.error("Merged region " + region.getRegionNameAsString()<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          + " has only one merge qualifier in META.");<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      return false;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    return cleanMergeRegion(region, mergeRegions.getFirst(),<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        mergeRegions.getSecond());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>}<a name="line.438"></a>
+<span class="sourceLineNo">376</span>    Path daughterRegionDir = new Path(tabledir, daughter.getEncodedName());<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>    HRegionFileSystem regionFs = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    try {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      if (!FSUtils.isExists(fs, daughterRegionDir)) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        return new Pair&lt;Boolean, Boolean&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    } catch (IOException ioe) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      LOG.warn("Error trying to determine if daughter region exists, " +<a name="line.385"></a>
+<span class="sourceLineNo">386</span>               "assuming exists and has references", ioe);<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>    try {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          this.services.getConfiguration(), fs, tabledir, daughter, true);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } catch (IOException e) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      LOG.warn("Error trying to determine referenced files from : " + daughter.getEncodedName()<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          + ", to: " + parent.getEncodedName() + " assuming has references", e);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    boolean references = false;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor parentDescriptor = getTableDescriptor(parent.getTable());<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (HColumnDescriptor family: parentDescriptor.getFamilies()) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      if ((references = regionFs.hasReferences(family.getNameAsString()))) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        break;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      }<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.valueOf(references));<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  private HTableDescriptor getTableDescriptor(final TableName tableName)<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      throws FileNotFoundException, IOException {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    return this.services.getTableDescriptors().get(tableName);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>  /**<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * Checks if the specified region has merge qualifiers, if so, try to clean<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * them<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * @param region<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   * @return true if the specified region doesn't have merge qualifier now<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * @throws IOException<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   */<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  public boolean cleanMergeQualifier(final HRegionInfo region)<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      throws IOException {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    // Get merge regions if it is a merged region and already has merge<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // qualifier<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Pair&lt;HRegionInfo, HRegionInfo&gt; mergeRegions = MetaTableAccessor<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        .getRegionsFromMergeQualifier(this.services.getConnection(),<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          region.getRegionName());<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    if (mergeRegions == null<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        || (mergeRegions.getFirst() == null &amp;&amp; mergeRegions.getSecond() == null)) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      // It doesn't have merge qualifier, no need to clean<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      return true;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    // It shouldn't happen, we must insert/delete these two qualifiers together<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    if (mergeRegions.getFirst() == null || mergeRegions.getSecond() == null) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      LOG.error("Merged region " + region.getRegionNameAsString()<a name="line.435"></a>
+<span class="sourceLineNo">436</span>          + " has only one merge qualifier in META.");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      return false;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return cleanMergeRegion(region, mergeRegions.getFirst(),<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        mergeRegions.getSecond());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>}<a name="line.442"></a>
 
 
 


[48/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/io/ByteBufferInputStream.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/ByteBufferInputStream.html b/devapidocs/org/apache/hadoop/hbase/io/ByteBufferInputStream.html
new file mode 100644
index 0000000..7d3cf83
--- /dev/null
+++ b/devapidocs/org/apache/hadoop/hbase/io/ByteBufferInputStream.html
@@ -0,0 +1,390 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>ByteBufferInputStream (Apache HBase 2.0.0-SNAPSHOT API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<script type="text/javascript"><!--
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="ByteBufferInputStream (Apache HBase 2.0.0-SNAPSHOT API)";
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+<!--   -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/ByteBufferInputStream.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteArrayOutputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferOutputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Next Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/io/ByteBufferInputStream.html" target="_top">Frames</a></li>
+<li><a href="ByteBufferInputStream.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field_detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_detail">Method</a></li>
+</ul>
+</div>
+<a name="skip-navbar_top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.io</div>
+<h2 title="Class ByteBufferInputStream" class="title">Class ByteBufferInputStream</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">java.io.InputStream</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.io.ByteBufferInputStream</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>All Implemented Interfaces:</dt>
+<dd><a href="http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html?is-external=true" title="class or interface in java.lang">AutoCloseable</a></dd>
+</dl>
+<hr>
+<br>
+<pre><a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Private</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html#line.32">ByteBufferInputStream</a>
+extends <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a></pre>
+<div class="block">Not thread safe!
+ <p>
+ Please note that the reads will cause position movement on wrapped ByteBuffer.</div>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field_summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a></code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html#buf">buf</a></strong></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor_summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html#ByteBufferInputStream(java.nio.ByteBuffer)">ByteBufferInputStream</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf)</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method_summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>int</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html#available()">available</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>int</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html#read()">read</a></strong>()</code>
+<div class="block">Reads the next byte of data from this input stream.</div>
+</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>int</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html#read(byte[],%20int,%20int)">read</a></strong>(byte[]&nbsp;b,
+        int&nbsp;off,
+        int&nbsp;len)</code>
+<div class="block">Reads up to next <code>len</code> bytes of data from buffer into passed array(starting from
+ given offset).</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>long</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html#skip(long)">skip</a></strong>(long&nbsp;n)</code>
+<div class="block">Skips <code>n</code> bytes of input from this input stream.</div>
+</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods_inherited_from_class_java.io.InputStream">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a></h3>
+<code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true#close()" title="class or interface in java.io">close</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true#mark(int)" title="class or interface in java.io">mark</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true#markSupported()" title="class or interface in java.io">markSupported</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true#read(byte[])" title="class or interface in java.io">read</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true#reset()" title="class or interface in java.io">reset</a></code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
+<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#clone()" title="class or interface in java.lang">clone</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#finalize()" title="class or interface in java.lang">finalize</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang">hashCode</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#notify()" title="class or interface in java.lang">notify</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang
 /Object.html?is-external=true#notifyAll()" title="class or interface in java.lang">notifyAll</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#wait()" title="class or interface in java.lang">wait</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="class or interface in java.lang">wait</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#wait(long,%20int)" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field_detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="buf">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>buf</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html#line.34">buf</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor_detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="ByteBufferInputStream(java.nio.ByteBuffer)">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>ByteBufferInputStream</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html#line.36">ByteBufferInputStream</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf)</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method_detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="read()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>read</h4>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html#line.47">read</a>()</pre>
+<div class="block">Reads the next byte of data from this input stream. The value byte is returned as an
+ <code>int</code> in the range <code>0</code> to <code>255</code>. If no byte is available
+ because the end of the stream has been reached, the value <code>-1</code> is returned.</div>
+<dl>
+<dt><strong>Specified by:</strong></dt>
+<dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true#read()" title="class or interface in java.io">read</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a></code></dd>
+<dt><span class="strong">Returns:</span></dt><dd>the next byte of data, or <code>-1</code> if the end of the stream has been reached.</dd></dl>
+</li>
+</ul>
+<a name="read(byte[], int, int)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>read</h4>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html#line.64">read</a>(byte[]&nbsp;b,
+       int&nbsp;off,
+       int&nbsp;len)</pre>
+<div class="block">Reads up to next <code>len</code> bytes of data from buffer into passed array(starting from
+ given offset).</div>
+<dl>
+<dt><strong>Overrides:</strong></dt>
+<dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true#read(byte[],%20int,%20int)" title="class or interface in java.io">read</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a></code></dd>
+<dt><span class="strong">Parameters:</span></dt><dd><code>b</code> - the array into which the data is read.</dd><dd><code>off</code> - the start offset in the destination array <code>b</code></dd><dd><code>len</code> - the maximum number of bytes to read.</dd>
+<dt><span class="strong">Returns:</span></dt><dd>the total number of bytes actually read into the buffer, or <code>-1</code> if not even
+         1 byte can be read because the end of the stream has been reached.</dd></dl>
+</li>
+</ul>
+<a name="skip(long)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>skip</h4>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html#line.90">skip</a>(long&nbsp;n)</pre>
+<div class="block">Skips <code>n</code> bytes of input from this input stream. Fewer bytes might be skipped if the
+ end of the input stream is reached. The actual number <code>k</code> of bytes to be skipped is
+ equal to the smaller of <code>n</code> and remaining bytes in the stream.</div>
+<dl>
+<dt><strong>Overrides:</strong></dt>
+<dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true#skip(long)" title="class or interface in java.io">skip</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a></code></dd>
+<dt><span class="strong">Parameters:</span></dt><dd><code>n</code> - the number of bytes to be skipped.</dd>
+<dt><span class="strong">Returns:</span></dt><dd>the actual number of bytes skipped.</dd></dl>
+</li>
+</ul>
+<a name="available()">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>available</h4>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html#line.104">available</a>()</pre>
+<dl>
+<dt><strong>Overrides:</strong></dt>
+<dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true#available()" title="class or interface in java.io">available</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a></code></dd>
+<dt><span class="strong">Returns:</span></dt><dd>the number of remaining bytes that can be read (or skipped
+          over) from this input stream.</dd></dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+<!--   -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/ByteBufferInputStream.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteArrayOutputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferOutputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Next Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/io/ByteBufferInputStream.html" target="_top">Frames</a></li>
+<li><a href="ByteBufferInputStream.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field_detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_detail">Method</a></li>
+</ul>
+</div>
+<a name="skip-navbar_bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2016 <a href="http://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/io/ByteBufferOutputStream.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/ByteBufferOutputStream.html b/devapidocs/org/apache/hadoop/hbase/io/ByteBufferOutputStream.html
index 16aedcf..e915ce2 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/ByteBufferOutputStream.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/ByteBufferOutputStream.html
@@ -35,7 +35,7 @@
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteArrayOutputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Prev Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferSupportDataOutputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -549,7 +549,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferSupportO
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteArrayOutputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Prev Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferSupportDataOutputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/io/class-use/ByteBufferInputStream.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/class-use/ByteBufferInputStream.html b/devapidocs/org/apache/hadoop/hbase/io/class-use/ByteBufferInputStream.html
new file mode 100644
index 0000000..0969a99
--- /dev/null
+++ b/devapidocs/org/apache/hadoop/hbase/io/class-use/ByteBufferInputStream.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.io.ByteBufferInputStream (Apache HBase 2.0.0-SNAPSHOT API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<script type="text/javascript"><!--
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.apache.hadoop.hbase.io.ByteBufferInputStream (Apache HBase 2.0.0-SNAPSHOT API)";
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+<!--   -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/io/class-use/ByteBufferInputStream.html" target="_top">Frames</a></li>
+<li><a href="ByteBufferInputStream.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip-navbar_top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.io.ByteBufferInputStream" class="title">Uses of Class<br>org.apache.hadoop.hbase.io.ByteBufferInputStream</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.io.ByteBufferInputStream</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+<!--   -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/io/class-use/ByteBufferInputStream.html" target="_top">Frames</a></li>
+<li><a href="ByteBufferInputStream.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip-navbar_bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2016 <a href="http://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index 940f7b7..2017317 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -270,11 +270,11 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">HFileBlock.Writer.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">BlockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">BlockPriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">BlockType.BlockCategory</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">CacheConfig.ExternalBlockCaches</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">BlockPriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">Cacheable.MemoryType</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/io/package-frame.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/package-frame.html b/devapidocs/org/apache/hadoop/hbase/io/package-frame.html
index 80af5b2..c61d445 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/package-frame.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/package-frame.html
@@ -21,6 +21,7 @@
 <ul title="Classes">
 <li><a href="BoundedByteBufferPool.html" title="class in org.apache.hadoop.hbase.io" target="classFrame">BoundedByteBufferPool</a></li>
 <li><a href="ByteArrayOutputStream.html" title="class in org.apache.hadoop.hbase.io" target="classFrame">ByteArrayOutputStream</a></li>
+<li><a href="ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io" target="classFrame">ByteBufferInputStream</a></li>
 <li><a href="ByteBufferOutputStream.html" title="class in org.apache.hadoop.hbase.io" target="classFrame">ByteBufferOutputStream</a></li>
 <li><a href="ByteBufferSupportDataOutputStream.html" title="class in org.apache.hadoop.hbase.io" target="classFrame">ByteBufferSupportDataOutputStream</a></li>
 <li><a href="ByteBuffInputStream.html" title="class in org.apache.hadoop.hbase.io" target="classFrame">ByteBuffInputStream</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/io/package-summary.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/package-summary.html b/devapidocs/org/apache/hadoop/hbase/io/package-summary.html
index 19eb39b..b99592c 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/package-summary.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/package-summary.html
@@ -129,44 +129,50 @@
 </td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferOutputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferOutputStream</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferInputStream</a></td>
 <td class="colLast">
 <div class="block">Not thread safe!</div>
 </td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferOutputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferOutputStream</a></td>
+<td class="colLast">
+<div class="block">Not thread safe!</div>
+</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferSupportDataOutputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferSupportDataOutputStream</a></td>
 <td class="colLast">
 <div class="block">Our extension of DataOutputStream which implements ByteBufferSupportOutputStream</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/ByteBuffInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBuffInputStream</a></td>
 <td class="colLast">
 <div class="block">Not thread safe!</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/FileLink.html" title="class in org.apache.hadoop.hbase.io">FileLink</a></td>
 <td class="colLast">
 <div class="block">The FileLink is a sort of hardlink, that allows access to a file given a set of locations.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/FileLink.FileLinkInputStream.html" title="class in org.apache.hadoop.hbase.io">FileLink.FileLinkInputStream</a></td>
 <td class="colLast">
 <div class="block">FileLink InputStream that handles the switch between the original path
  and the alternative locations, when the file is moved.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.html" title="class in org.apache.hadoop.hbase.io">FSDataInputStreamWrapper</a></td>
 <td class="colLast">
 <div class="block">Wrapper for input stream(s) that takes care of the interaction of FS and HBase checksums,
  as well as closing streams.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/HalfStoreFileReader.html" title="class in org.apache.hadoop.hbase.io">HalfStoreFileReader</a></td>
 <td class="colLast">
 <div class="block">A facade for a <a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile"><code>HFile.Reader</code></a> that serves up
@@ -175,32 +181,32 @@
  of the file with keys that sort greater than those of the bottom half.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/HFileLink.html" title="class in org.apache.hadoop.hbase.io">HFileLink</a></td>
 <td class="colLast">
 <div class="block">HFileLink describes a link to an hfile.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a></td>
 <td class="colLast">
 <div class="block">A byte sequence that is usable as a key or value.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.Comparator.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable.Comparator</a></td>
 <td class="colLast">
 <div class="block">A Comparator optimized for ImmutableBytesWritable.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/LimitInputStream.html" title="class in org.apache.hadoop.hbase.io">LimitInputStream</a></td>
 <td class="colLast">
 <div class="block">Copied from guava source code v15 (LimitedInputStream)
  Guava deprecated LimitInputStream in v14 and removed it in v15.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/Reference.html" title="class in org.apache.hadoop.hbase.io">Reference</a></td>
 <td class="colLast">
 <div class="block">A reference to the top or bottom half of a store file where 'bottom' is the first half
@@ -208,19 +214,19 @@
  of the file with keys that sort greater than those of the bottom half.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/TagCompressionContext.html" title="class in org.apache.hadoop.hbase.io">TagCompressionContext</a></td>
 <td class="colLast">
 <div class="block">Context that holds the dictionary for Tag compression and doing the compress/uncompress.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></td>
 <td class="colLast">
 <div class="block">Represents an interval of version timestamps.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/io/WALLink.html" title="class in org.apache.hadoop.hbase.io">WALLink</a></td>
 <td class="colLast">
 <div class="block">WALLink describes a link to a WAL.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/io/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/package-tree.html
index cb18ac8..2193ecb 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/package-tree.html
@@ -84,6 +84,7 @@
 <li type="circle">org.apache.hadoop.hbase.io.<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">ImmutableBytesWritable</span></a> (implements org.apache.hadoop.io.WritableComparable&lt;T&gt;)</li>
 <li type="circle">java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io"><span class="strong">InputStream</span></a> (implements java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.io.<a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">ByteBufferInputStream</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.<a href="../../../../../org/apache/hadoop/hbase/io/ByteBuffInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">ByteBuffInputStream</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.<a href="../../../../../org/apache/hadoop/hbase/io/FileLink.FileLinkInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">FileLink.FileLinkInputStream</span></a> (implements org.apache.hadoop.fs.PositionedReadable, org.apache.hadoop.fs.Seekable)</li>
 <li type="circle">java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/FilterInputStream.html?is-external=true" title="class or interface in java.io"><span class="strong">FilterInputStream</span></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
index 9acc117..4ae89fb 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.729">AsyncRpcChannel.CallWriteListener</a>
+<pre>private static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.730">AsyncRpcChannel.CallWriteListener</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements io.netty.channel.ChannelFutureListener</pre>
 <div class="block">Listens to call writes and fails if write failed</div>
@@ -205,7 +205,7 @@ implements io.netty.channel.ChannelFutureListener</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcChannel</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.730">rpcChannel</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.731">rpcChannel</a></pre>
 </li>
 </ul>
 <a name="id">
@@ -214,7 +214,7 @@ implements io.netty.channel.ChannelFutureListener</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>id</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.731">id</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.732">id</a></pre>
 </li>
 </ul>
 </li>
@@ -231,7 +231,7 @@ implements io.netty.channel.ChannelFutureListener</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncRpcChannel.CallWriteListener</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.733">AsyncRpcChannel.CallWriteListener</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a>&nbsp;asyncRpcChannel,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.734">AsyncRpcChannel.CallWriteListener</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a>&nbsp;asyncRpcChannel,
                                  int&nbsp;id)</pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ implements io.netty.channel.ChannelFutureListener</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>operationComplete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.739">operationComplete</a>(io.netty.channel.ChannelFuture&nbsp;future)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.740">operationComplete</a>(io.netty.channel.ChannelFuture&nbsp;future)
                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
index 4a34815..53eb6dc 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
@@ -840,7 +840,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getConnectionHashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.702">getConnectionHashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.703">getConnectionHashCode</a>()</pre>
 </li>
 </ul>
 <a name="hashCode()">
@@ -849,7 +849,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.707">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.708">hashCode</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -862,7 +862,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.712">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;obj)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.713">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;obj)</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -875,7 +875,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.722">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.723">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/DelegatingPayloadCarryingRpcController.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/DelegatingPayloadCarryingRpcController.html b/devapidocs/org/apache/hadoop/hbase/ipc/DelegatingPayloadCarryingRpcController.html
index a52b8e5..fb65cf0 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/DelegatingPayloadCarryingRpcController.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/DelegatingPayloadCarryingRpcController.html
@@ -138,6 +138,13 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcCo
 </tr>
 </table>
 <ul class="blockList">
+<li class="blockList"><a name="fields_inherited_from_class_org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#PRIORITY_UNSET">PRIORITY_UNSET</a></code></li>
+</ul>
+<ul class="blockList">
 <li class="blockList"><a name="fields_inherited_from_class_org.apache.hadoop.hbase.ipc.TimeLimitedRpcController">
 <!--   -->
 </a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/IPCUtil.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/IPCUtil.html b/devapidocs/org/apache/hadoop/hbase/ipc/IPCUtil.html
index 2c5c64f..c48fd5b 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/IPCUtil.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/IPCUtil.html
@@ -215,11 +215,9 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a></code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/IPCUtil.html#createCellScanner(org.apache.hadoop.hbase.codec.Codec,%20org.apache.hadoop.io.compress.CompressionCodec,%20byte[],%20int,%20int)">createCellScanner</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec">Codec</a>&nbsp;codec,
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/IPCUtil.html#createCellScanner(org.apache.hadoop.hbase.codec.Codec,%20org.apache.hadoop.io.compress.CompressionCodec,%20java.nio.ByteBuffer)">createCellScanner</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec">Codec</a>&nbsp;codec,
                                   org.apache.hadoop.io.compress.CompressionCodec&nbsp;compressor,
-                                  byte[]&nbsp;cellBlock,
-                                  int&nbsp;offset,
-                                  int&nbsp;length)</code>&nbsp;</td>
+                                  <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;cellBlock)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a></code></td>
@@ -399,19 +397,18 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
 </li>
 </ul>
-<a name="createCellScanner(org.apache.hadoop.hbase.codec.Codec, org.apache.hadoop.io.compress.CompressionCodec, byte[], int, int)">
+<a name="createCellScanner(org.apache.hadoop.hbase.codec.Codec, org.apache.hadoop.io.compress.CompressionCodec, java.nio.ByteBuffer)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>createCellScanner</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.194">createCellScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec">Codec</a>&nbsp;codec,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.193">createCellScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec">Codec</a>&nbsp;codec,
                             org.apache.hadoop.io.compress.CompressionCodec&nbsp;compressor,
-                            byte[]&nbsp;cellBlock,
-                            int&nbsp;offset,
-                            int&nbsp;length)
+                            <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;cellBlock)
                               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
-<dl><dt><span class="strong">Parameters:</span></dt><dd><code>codec</code> - </dd><dd><code>cellBlock</code> - </dd><dd><code>offset</code> - </dd><dd><code>length</code> - </dd>
+<dl><dt><span class="strong">Parameters:</span></dt><dd><code>codec</code> - </dd><dd><code>cellBlock</code> - ByteBuffer containing the cells written by the Codec. The buffer should be
+ position()'ed at the start of the cell block and limit()'ed at the end.</dd>
 <dt><span class="strong">Returns:</span></dt><dd>CellScanner to work against the content of <code>cellBlock</code></dd>
 <dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -423,7 +420,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getDelimitedMessageAsByteBuffer</h4>
-<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.235">getDelimitedMessageAsByteBuffer</a>(com.google.protobuf.Message&nbsp;m)
+<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.233">getDelimitedMessageAsByteBuffer</a>(com.google.protobuf.Message&nbsp;m)
                                                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>m</code> - Message to serialize delimited; i.e. w/ a vint of its size preceeding its
  serialization.</dd>
@@ -438,7 +435,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>write</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.258">write</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</a>&nbsp;dos,
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.256">write</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</a>&nbsp;dos,
         com.google.protobuf.Message&nbsp;header,
         com.google.protobuf.Message&nbsp;param,
         <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;cellBlock)
@@ -456,7 +453,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>write</h4>
-<pre>private static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.269">write</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</a>&nbsp;dos,
+<pre>private static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.267">write</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</a>&nbsp;dos,
         com.google.protobuf.Message&nbsp;header,
         com.google.protobuf.Message&nbsp;param,
         <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;cellBlock,
@@ -472,7 +469,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>readChunked</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.290">readChunked</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;in,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.288">readChunked</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;in,
                byte[]&nbsp;dest,
                int&nbsp;offset,
                int&nbsp;len)
@@ -489,7 +486,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getTotalSizeWhenWrittenDelimited</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.302">getTotalSizeWhenWrittenDelimited</a>(com.google.protobuf.Message...&nbsp;messages)</pre>
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html#line.300">getTotalSizeWhenWrittenDelimited</a>(com.google.protobuf.Message...&nbsp;messages)</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>Size on the wire when the two messages are written with writeDelimitedTo</dd></dl>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html b/devapidocs/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html
index 1eda9d8..c7ac00b 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html
@@ -147,6 +147,10 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <div class="block">Priority to set on this request.</div>
 </td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>static int</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#PRIORITY_UNSET">PRIORITY_UNSET</a></strong></code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="fields_inherited_from_class_org.apache.hadoop.hbase.ipc.TimeLimitedRpcController">
@@ -245,6 +249,16 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <!--   -->
 </a>
 <h3>Field Detail</h3>
+<a name="PRIORITY_UNSET">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>PRIORITY_UNSET</h4>
+<pre>public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.39">PRIORITY_UNSET</a></pre>
+<dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController.PRIORITY_UNSET">Constant Field Values</a></dd></dl>
+</li>
+</ul>
 <a name="priority">
 <!--   -->
 </a>
@@ -319,7 +333,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>cellScanner</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.70">cellScanner</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.71">cellScanner</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/CellScannable.html#cellScanner()">cellScanner</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" title="interface in org.apache.hadoop.hbase">CellScannable</a></code></dd>
@@ -332,7 +346,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>setCellScanner</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.74">setCellScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;cellScanner)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.75">setCellScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;cellScanner)</pre>
 </li>
 </ul>
 <a name="setPriority(int)">
@@ -341,7 +355,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>setPriority</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.82">setPriority</a>(int&nbsp;priority)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.83">setPriority</a>(int&nbsp;priority)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>priority</code> - Priority for this request; should fall roughly in the range
  <a href="../../../../../org/apache/hadoop/hbase/HConstants.html#NORMAL_QOS"><code>HConstants.NORMAL_QOS</code></a> to <a href="../../../../../org/apache/hadoop/hbase/HConstants.html#HIGH_QOS"><code>HConstants.HIGH_QOS</code></a></dd></dl>
 </li>
@@ -352,7 +366,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>setPriority</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.89">setPriority</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tn)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.90">setPriority</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tn)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>tn</code> - Set priority based off the table we are going against.</dd></dl>
 </li>
 </ul>
@@ -362,7 +376,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>getPriority</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.97">getPriority</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.98">getPriority</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>The priority of this request</dd></dl>
 </li>
 </ul>
@@ -372,7 +386,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockListLast">
 <li class="blockList">
 <h4>reset</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.101">reset</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#line.102">reset</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code>reset</code>&nbsp;in interface&nbsp;<code>com.google.protobuf.RpcController</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html
index a3cc241..fea565c 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html
@@ -874,7 +874,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>doNotify</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.947">doNotify</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.949">doNotify</a>()</pre>
 </li>
 </ul>
 <a name="readResponse()">
@@ -883,7 +883,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>readResponse</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.956">readResponse</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.958">readResponse</a>()</pre>
 </li>
 </ul>
 <a name="isFatalConnectionException(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse)">
@@ -892,7 +892,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>isFatalConnectionException</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.1034">isFatalConnectionException</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse&nbsp;e)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.1036">isFatalConnectionException</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse&nbsp;e)</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>True if the exception is a fatal connection exception.</dd></dl>
 </li>
 </ul>
@@ -902,7 +902,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createRemoteException</h4>
-<pre>private&nbsp;org.apache.hadoop.ipc.RemoteException&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.1043">createRemoteException</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse&nbsp;e)</pre>
+<pre>private&nbsp;org.apache.hadoop.ipc.RemoteException&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.1045">createRemoteException</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse&nbsp;e)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>e</code> - exception to be wrapped</dd>
 <dt><span class="strong">Returns:</span></dt><dd>RemoteException made from passed <code>e</code></dd></dl>
 </li>
@@ -913,7 +913,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>markClosed</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.1054">markClosed</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;e)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.1056">markClosed</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;e)</pre>
 </li>
 </ul>
 <a name="cleanupCalls(boolean)">
@@ -922,7 +922,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cleanupCalls</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.1075">cleanupCalls</a>(boolean&nbsp;allCalls)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#line.1077">cleanupCalls</a>(boolean&nbsp;allCalls)</pre>
 <div class="block">Cleanup the calls older than a given timeout, in milli seconds.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>allCalls</code> - true for all calls, false for only the calls in timeout</dd></dl>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
index 92e9dea..2fb5855 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
@@ -413,7 +413,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>RpcClientImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1108">RpcClientImpl</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1110">RpcClientImpl</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
              <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clusterId,
              <a href="http://docs.oracle.com/javase/7/docs/api/javax/net/SocketFactory.html?is-external=true" title="class or interface in javax.net">SocketFactory</a>&nbsp;factory)</pre>
 <div class="block">Used in test only. Construct an IPC cluster client whose values are of the
@@ -427,7 +427,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>RpcClientImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1120">RpcClientImpl</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1122">RpcClientImpl</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
              <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clusterId,
              <a href="http://docs.oracle.com/javase/7/docs/api/javax/net/SocketFactory.html?is-external=true" title="class or interface in javax.net">SocketFactory</a>&nbsp;factory,
              <a href="http://docs.oracle.com/javase/7/docs/api/java/net/SocketAddress.html?is-external=true" title="class or interface in java.net">SocketAddress</a>&nbsp;localAddr,
@@ -442,7 +442,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>RpcClientImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1134">RpcClientImpl</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1136">RpcClientImpl</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
              <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clusterId)</pre>
 <div class="block">Used in test only. Construct an IPC client for the cluster <code>clusterId</code> with
  the default SocketFactory</div>
@@ -454,7 +454,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RpcClientImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1148">RpcClientImpl</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1150">RpcClientImpl</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
              <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clusterId,
              <a href="http://docs.oracle.com/javase/7/docs/api/java/net/SocketAddress.html?is-external=true" title="class or interface in java.net">SocketAddress</a>&nbsp;localAddr,
              <a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection</a>&nbsp;metrics)</pre>
@@ -494,7 +494,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1156">close</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1158">close</a>()</pre>
 <div class="block">Stop all threads related to this client.  No further calls may be made
  using this client.</div>
 </li>
@@ -505,7 +505,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>call</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;com.google.protobuf.Message,<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1212">call</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a>&nbsp;pcrc,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;com.google.protobuf.Message,<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1214">call</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a>&nbsp;pcrc,
                                                  com.google.protobuf.Descriptors.MethodDescriptor&nbsp;md,
                                                  com.google.protobuf.Message&nbsp;param,
                                                  com.google.protobuf.Message&nbsp;returnType,
@@ -537,7 +537,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>cancelConnections</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1288">cancelConnections</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1290">cancelConnections</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
 <div class="block">Interrupt the connections to the given ip:port server. This should be called if the server
   is known as actually dead. This will not prevent current operation to be retried, and,
   depending on their own behavior, they may retry on the same server. This can be a feature,
@@ -553,7 +553,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getConnection</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcClientImpl.Connection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1307">getConnection</a>(<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;ticket,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcClientImpl.Connection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#line.1309">getConnection</a>(<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;ticket,
                                      <a href="../../../../../org/apache/hadoop/hbase/ipc/Call.html" title="class in org.apache.hadoop.hbase.ipc">Call</a>&nbsp;call,
                                      <a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;addr)
                                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html
index e19c970..b5c3aaa 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.1971">RpcServer.BlockingServiceAndInterface</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2016">RpcServer.BlockingServiceAndInterface</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Datastructure for passing a <code>BlockingService</code> and its associated class of
  protobuf service interface.  For example, a server that fielded what is defined
@@ -200,7 +200,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>service</h4>
-<pre>private final&nbsp;com.google.protobuf.BlockingService <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html#line.1972">service</a></pre>
+<pre>private final&nbsp;com.google.protobuf.BlockingService <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html#line.2017">service</a></pre>
 </li>
 </ul>
 <a name="serviceInterface">
@@ -209,7 +209,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>serviceInterface</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html#line.1973">serviceInterface</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html#line.2018">serviceInterface</a></pre>
 </li>
 </ul>
 </li>
@@ -226,7 +226,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RpcServer.BlockingServiceAndInterface</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html#line.1974">RpcServer.BlockingServiceAndInterface</a>(com.google.protobuf.BlockingService&nbsp;service,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html#line.2019">RpcServer.BlockingServiceAndInterface</a>(com.google.protobuf.BlockingService&nbsp;service,
                                      <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;serviceInterface)</pre>
 </li>
 </ul>
@@ -244,7 +244,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getServiceInterface</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html#line.1979">getServiceInterface</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html#line.2024">getServiceInterface</a>()</pre>
 </li>
 </ul>
 <a name="getBlockingService()">
@@ -253,7 +253,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getBlockingService</h4>
-<pre>public&nbsp;com.google.protobuf.BlockingService&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html#line.1982">getBlockingService</a>()</pre>
+<pre>public&nbsp;com.google.protobuf.BlockingService&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html#line.2027">getBlockingService</a>()</pre>
 </li>
 </ul>
 </li>


[09/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
index e2c4389..d03724e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
@@ -5185,3056 +5185,3058 @@
 <span class="sourceLineNo">5177</span>   * @param readLock is the lock reader or writer. True indicates that a non-exlcusive<a name="line.5177"></a>
 <span class="sourceLineNo">5178</span>   *                 lock is requested<a name="line.5178"></a>
 <span class="sourceLineNo">5179</span>   */<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    // Make sure the row is inside of this region before getting the lock for it.<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    checkRow(row, "row lock");<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    // create an object to use a a key in the row lock map<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    HashedBytes rowKey = new HashedBytes(row);<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    RowLockContext rowLockContext = null;<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    RowLockImpl result = null;<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    TraceScope traceScope = null;<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span><a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    // If we're tracing start a span to show how long this took.<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>    if (Trace.isTracing()) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>      traceScope = Trace.startSpan("HRegion.getRowLock");<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>      traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock"));<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>    }<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span><a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    try {<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>      // Keep trying until we have a lock or error out.<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>      // TODO: do we need to add a time component here?<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>      while (result == null) {<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span><a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>        // Try adding a RowLockContext to the lockedRows.<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>        // If we can add it then there's no other transactions currently running.<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        rowLockContext = new RowLockContext(rowKey);<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span><a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>        // if there was a running transaction then there's already a context.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>        if (existingContext != null) {<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>          rowLockContext = existingContext;<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>        }<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span><a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>        // Now try an get the lock.<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>        //<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>        // This can fail as<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>        if (readLock) {<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>          result = rowLockContext.newReadLock();<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>        } else {<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>          result = rowLockContext.newWriteLock();<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>        }<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      }<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      if (!result.getLock().tryLock(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>        if (traceScope != null) {<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>          traceScope.getSpan().addTimelineAnnotation("Failed to get row lock");<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>        }<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>        result = null;<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>        // Clean up the counts just in case this was the thing keeping the context alive.<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        rowLockContext.cleanUp();<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        throw new IOException("Timed out waiting for lock for row: " + rowKey);<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>      }<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>      return result;<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>    } catch (InterruptedException ie) {<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>      LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>      iie.initCause(ie);<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>      if (traceScope != null) {<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>        traceScope.getSpan().addTimelineAnnotation("Interrupted exception getting row lock");<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>      }<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>      Thread.currentThread().interrupt();<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>      throw iie;<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    } finally {<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>      if (traceScope != null) {<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>        traceScope.close();<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>      }<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    }<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>  }<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span><a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>  @Override<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>  public void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>    if (rowLocks != null) {<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>      for (RowLock rowLock : rowLocks) {<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span>        rowLock.release();<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>      }<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>      rowLocks.clear();<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    }<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>  }<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span><a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>  @VisibleForTesting<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>  class RowLockContext {<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span>    private final HashedBytes row;<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    final AtomicBoolean usable = new AtomicBoolean(true);<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    final Object lock = new Object();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    RowLockContext(HashedBytes row) {<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>      this.row = row;<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    }<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span><a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    RowLockImpl newWriteLock() {<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>      Lock l = readWriteLock.writeLock();<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>      return getRowLock(l);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    }<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    RowLockImpl newReadLock() {<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>      Lock l = readWriteLock.readLock();<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>      return getRowLock(l);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    private RowLockImpl getRowLock(Lock l) {<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>      count.incrementAndGet();<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>      synchronized (lock) {<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        if (usable.get()) {<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>          return new RowLockImpl(this, l);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        } else {<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>          return null;<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        }<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>      }<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    }<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span><a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    void cleanUp() {<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>      long c = count.decrementAndGet();<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>      if (c &lt;= 0) {<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        synchronized (lock) {<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>          if (count.get() &lt;= 0 ){<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>            usable.set(false);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>            RowLockContext removed = lockedRows.remove(row);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>            assert removed == this: "we should never remove a different context";<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>          }<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        }<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>      }<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    }<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span><a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    @Override<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    public String toString() {<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>      return "RowLockContext{" +<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>          "row=" + row +<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>          ", readWriteLock=" + readWriteLock +<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>          ", count=" + count +<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>          '}';<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    }<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>  }<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span><a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>  /**<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>   * Class used to represent a lock on a row.<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>   */<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>  public static class RowLockImpl implements RowLock {<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    private final RowLockContext context;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    private final Lock lock;<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span><a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    public RowLockImpl(RowLockContext context, Lock lock) {<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>      this.context = context;<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>      this.lock = lock;<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    }<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span><a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    public Lock getLock() {<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>      return lock;<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    }<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span><a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    @VisibleForTesting<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>    public RowLockContext getContext() {<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      return context;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    }<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span><a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    @Override<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    public void release() {<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>      lock.unlock();<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>      context.cleanUp();<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>    }<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span><a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    @Override<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    public String toString() {<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>      return "RowLockImpl{" +<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>          "context=" + context +<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>          ", lock=" + lock +<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>          '}';<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>    }<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  }<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span><a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>  /**<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>   * Determines whether multiple column families are present<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>   * Precondition: familyPaths is not null<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>   *<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>   * @param familyPaths List of (column family, hfilePath)<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>   */<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    boolean multipleFamilies = false;<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    byte[] family = null;<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    for (Pair&lt;byte[], String&gt; pair : familyPaths) {<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>      byte[] fam = pair.getFirst();<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>      if (family == null) {<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>        family = fam;<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>      } else if (!Bytes.equals(family, fam)) {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>        multipleFamilies = true;<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>        break;<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>      }<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    }<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    return multipleFamilies;<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>  }<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span><a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  @Override<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>  public boolean bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, boolean assignSeqId,<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      BulkLoadListener bulkLoadListener) throws IOException {<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>    long seqId = -1;<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;byte[], List&lt;Path&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    Preconditions.checkNotNull(familyPaths);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    // we need writeLock for multi-family bulk load<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    try {<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      this.writeRequestsCount.increment();<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      // There possibly was a split that happened between when the split keys<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // were gathered and before the HRegion's write lock was taken.  We need<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      // to validate the HFile region before attempting to bulk load all of them<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>      List&lt;IOException&gt; ioes = new ArrayList&lt;IOException&gt;();<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;Pair&lt;byte[], String&gt;&gt;();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>        byte[] familyName = p.getFirst();<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>        String path = p.getSecond();<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span><a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>        Store store = getStore(familyName);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>        if (store == null) {<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>          IOException ioe = new org.apache.hadoop.hbase.DoNotRetryIOException(<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>              "No such column family " + Bytes.toStringBinary(familyName));<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>          ioes.add(ioe);<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>        } else {<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>          try {<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>            store.assertBulkLoadHFileOk(new Path(path));<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>          } catch (WrongRegionException wre) {<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>            // recoverable (file doesn't fit in region)<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>            failures.add(p);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>          } catch (IOException ioe) {<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>            // unrecoverable (hdfs problem)<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>            ioes.add(ioe);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>          }<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>        }<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>      }<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span><a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>      // validation failed because of some sort of IO problem.<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>      if (ioes.size() != 0) {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>        IOException e = MultipleIOException.createIOException(ioes);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>        LOG.error("There were one or more IO errors when checking if the bulk load is ok.", e);<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>        throw e;<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>      }<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span><a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>      // validation failed, bail out before doing anything permanent.<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>      if (failures.size() != 0) {<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>        StringBuilder list = new StringBuilder();<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>        for (Pair&lt;byte[], String&gt; p : failures) {<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>              .append(p.getSecond());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>        }<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        // problem when validating<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>        LOG.warn("There was a recoverable bulk load failure likely due to a" +<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>            " split.  These (family, HFile) pairs were not loaded: " + list);<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>        return false;<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>      }<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span><a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>      // We need to assign a sequential ID that's in between two memstores in order to preserve<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>      // the guarantee that all the edits lower than the highest sequential ID from all the<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>      // HFiles are flushed on disk. See HBASE-10958.  The sequence id returned when we flush is<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>      // a sequence id that we can be sure is beyond the last hfile written).<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>      if (assignSeqId) {<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        FlushResult fs = flushcache(true, false);<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>        if (fs.isFlushSucceeded()) {<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>        } else {<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>          throw new IOException("Could not bulk load with an assigned sequential ID because the "+<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>            "flush didn't run. Reason for not flushing: " + ((FlushResultImpl)fs).failureReason);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>        }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span>      }<a name="line.5441"></a>
-<span class="sourceLineNo">5442</span><a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        byte[] familyName = p.getFirst();<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>        String path = p.getSecond();<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>        Store store = getStore(familyName);<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>        try {<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>          String finalPath = path;<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>          if (bulkLoadListener != null) {<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path);<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>          }<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>          Path commitedStoreFile = store.bulkLoadHFile(finalPath, seqId);<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span><a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>          if(storeFiles.containsKey(familyName)) {<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>            storeFiles.get(familyName).add(commitedStoreFile);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>          } else {<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>            List&lt;Path&gt; storeFileNames = new ArrayList&lt;Path&gt;();<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>            storeFileNames.add(commitedStoreFile);<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>            storeFiles.put(familyName, storeFileNames);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>          }<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>          if (bulkLoadListener != null) {<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>            bulkLoadListener.doneBulkLoad(familyName, path);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>          }<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>        } catch (IOException ioe) {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>          // A failure here can cause an atomicity violation that we currently<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>          // cannot recover from since it is likely a failed HDFS operation.<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span><a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>          // TODO Need a better story for reverting partial failures due to HDFS.<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>          LOG.error("There was a partial failure due to IO when attempting to" +<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>              " load " + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>          if (bulkLoadListener != null) {<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>            try {<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>              bulkLoadListener.failedBulkLoad(familyName, path);<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>            } catch (Exception ex) {<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>              LOG.error("Error while calling failedBulkLoad for family " +<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>                  Bytes.toString(familyName) + " with path " + path, ex);<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>            }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>          }<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>          throw ioe;<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>        }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>      }<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span><a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>      return true;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    } finally {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        // write a bulk load event when not all hfiles are loaded<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        try {<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>          WALProtos.BulkLoadDescriptor loadDescriptor = ProtobufUtil.toBulkLoadDescriptor(<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>              this.getRegionInfo().getTable(),<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>              ByteStringer.wrap(this.getRegionInfo().getEncodedNameAsBytes()), storeFiles, seqId);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>          WALUtil.writeBulkLoadMarkerAndSync(wal, this.htableDescriptor, getRegionInfo(),<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>              loadDescriptor, mvcc);<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span>        } catch (IOException ioe) {<a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>          if (this.rsServices != null) {<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>            // Have to abort region server because some hfiles has been loaded but we can't write<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>            // the event into WAL<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>          }<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>        }<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>      }<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span><a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>      closeBulkRegionOperation();<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    }<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>  }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span><a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  @Override<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>  public boolean equals(Object o) {<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>                                                ((HRegion) o).getRegionInfo().getRegionName());<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>  }<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span><a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>  @Override<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>  public int hashCode() {<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    return Bytes.hashCode(getRegionInfo().getRegionName());<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>  }<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span><a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>  @Override<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>  public String toString() {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>    return getRegionInfo().getRegionNameAsString();<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>  }<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span><a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>  /**<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>   * RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>   */<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>  class RegionScannerImpl implements RegionScanner, org.apache.hadoop.hbase.ipc.RpcCallback {<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    // Package local for testability<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>    KeyValueHeap storeHeap = null;<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>    /** Heap of key-values that are not essential for the provided filters and are thus read<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>     * on demand, if on-demand column family loading is enabled.*/<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>    KeyValueHeap joinedHeap = null;<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>    /**<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>     * If the joined heap data gathering is interrupted due to scan limits, this will<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>     * contain the row for which we are populating the values.*/<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>    protected Cell joinedContinuationRow = null;<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    private boolean filterClosed = false;<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span><a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>    protected final int isScan;<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    protected final byte[] stopRow;<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    protected final HRegion region;<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    protected final CellComparator comparator;<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>    protected boolean copyCellsFromSharedMem = false;<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span><a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>    private final long readPt;<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>    private final long maxResultSize;<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>    private final ScannerContext defaultScannerContext;<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>    private final FilterWrapper filter;<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span><a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    @Override<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    public HRegionInfo getRegionInfo() {<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>      return region.getRegionInfo();<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>    }<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span><a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    public void setCopyCellsFromSharedMem(boolean copyCells) {<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>      this.copyCellsFromSharedMem = copyCells;<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    }<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span><a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    RegionScannerImpl(Scan scan, List&lt;KeyValueScanner&gt; additionalScanners, HRegion region,<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        boolean copyCellsFromSharedMem)<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>        throws IOException {<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>      this.region = region;<a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      this.maxResultSize = scan.getMaxResultSize();<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>      if (scan.hasFilter()) {<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        this.filter = new FilterWrapper(scan.getFilter());<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>      } else {<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>        this.filter = null;<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>      }<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      this.comparator = region.getCellCompartor();<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>      /**<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>       * By default, calls to next/nextRaw must enforce the batch limit. Thus, construct a default<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>       * scanner context that can be used to enforce the batch limit in the event that a<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>       * ScannerContext is not specified during an invocation of next/nextRaw<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>       */<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>      defaultScannerContext = ScannerContext.newBuilder()<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>          .setBatchLimit(scan.getBatch()).build();<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span><a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) &amp;&amp; !scan.isGetScan()) {<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>        this.stopRow = null;<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span>      } else {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        this.stopRow = scan.getStopRow();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>      }<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      // If we are doing a get, we want to be [startRow,endRow]. Normally<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>      // it is [startRow,endRow) and if startRow=endRow we get nothing.<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      this.isScan = scan.isGetScan() ? 1 : 0;<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span><a name="line.5584"></a>
-<span class="sourceLineNo">5585</span>      // synchronize on scannerReadPoints so that nobody calculates<a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>      // getSmallestReadPoint, before scannerReadPoints is updated.<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      IsolationLevel isolationLevel = scan.getIsolationLevel();<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      synchronized(scannerReadPoints) {<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>        this.readPt = getReadpoint(isolationLevel);<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        scannerReadPoints.put(this, this.readPt);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>      }<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span><a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>      // Here we separate all scanners into two lists - scanner that provide data required<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      // by the filter to operate (scanners list) and all others (joinedScanners list).<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>      List&lt;KeyValueScanner&gt; scanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>      List&lt;KeyValueScanner&gt; joinedScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>      if (additionalScanners != null) {<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>        scanners.addAll(additionalScanners);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>      }<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span><a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>      for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; entry : scan.getFamilyMap().entrySet()) {<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>        Store store = stores.get(entry.getKey());<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>        KeyValueScanner scanner;<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span>        try {<a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>          scanner = store.getScanner(scan, entry.getValue(), this.readPt);<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>        } catch (FileNotFoundException e) {<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>          throw handleFileNotFound(e);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>        }<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>        if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand()<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>          || this.filter.isFamilyEssential(entry.getKey())) {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>          scanners.add(scanner);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>        } else {<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>          joinedScanners.add(scanner);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>        }<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      }<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>      this.copyCellsFromSharedMem = copyCellsFromSharedMem;<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      initializeKVHeap(scanners, joinedScanners, region);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    }<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span><a name="line.5619"></a>
-<span class="sourceLineNo">5620</span>    protected void initializeKVHeap(List&lt;KeyValueScanner&gt; scanners,<a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>        List&lt;KeyValueScanner&gt; joinedScanners, HRegion region)<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>        throws IOException {<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      this.storeHeap = new KeyValueHeap(scanners, comparator);<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      if (!joinedScanners.isEmpty()) {<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>        this.joinedHeap = new KeyValueHeap(joinedScanners, comparator);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span>      }<a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    }<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span><a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    @Override<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    public long getMaxResultSize() {<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>      return maxResultSize;<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    @Override<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    public long getMvccReadPoint() {<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      return this.readPt;<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span>    }<a name="line.5637"></a>
-<span class="sourceLineNo">5638</span><a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>    @Override<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>    public int getBatch() {<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      return this.defaultScannerContext.getBatchLimit();<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>    }<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    /**<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>     * Reset both the filter and the old filter.<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>     *<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>     * @throws IOException in case a filter raises an I/O exception.<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>     */<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    protected void resetFilters() throws IOException {<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>      if (filter != null) {<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>        filter.reset();<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span>      }<a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    }<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span><a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    @Override<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>    public boolean next(List&lt;Cell&gt; outResults)<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>        throws IOException {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>      // apply the batching limit by default<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>      return next(outResults, defaultScannerContext);<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>    }<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span><a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    @Override<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    public synchronized boolean next(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    throws IOException {<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>      if (this.filterClosed) {<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>        throw new UnknownScannerException("Scanner was closed (timed out?) " +<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>            "after we renewed it. Could be caused by a very slow scanner " +<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>            "or a lengthy garbage collection");<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>      }<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>      startRegionOperation(Operation.SCAN);<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>      readRequestsCount.increment();<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>      try {<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>        return nextRaw(outResults, scannerContext);<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>      } finally {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>        closeRegionOperation(Operation.SCAN);<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>      }<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>    }<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span><a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    @Override<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    public boolean nextRaw(List&lt;Cell&gt; outResults) throws IOException {<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      // Use the RegionScanner's context by default<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return nextRaw(outResults, defaultScannerContext);<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span><a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>    @Override<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>    public boolean nextRaw(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        throws IOException {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>      if (storeHeap == null) {<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        // scanner is closed<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>        throw new UnknownScannerException("Scanner was closed");<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      }<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      boolean moreValues = false;<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      try {<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>        if (outResults.isEmpty()) {<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>          // Usually outResults is empty. This is true when next is called<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>          // to handle scan or get operation.<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>          moreValues = nextInternal(outResults, scannerContext);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        } else {<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>          List&lt;Cell&gt; tmpList = new ArrayList&lt;Cell&gt;();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>          moreValues = nextInternal(tmpList, scannerContext);<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>          outResults.addAll(tmpList);<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        }<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span><a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        // If the size limit was reached it means a partial Result is being<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>        // returned. Returning a<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        // partial Result means that we should not reset the filters; filters<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>        // should only be reset in<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>        // between rows<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>        if (!scannerContext.partialResultFormed()) resetFilters();<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span><a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>        if (isFilterDoneInternal()) {<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>          moreValues = false;<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>        }<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span><a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        // If copyCellsFromSharedMem = true, then we need to copy the cells. Otherwise<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>        // it is a call coming from the RsRpcServices.scan().<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        if (copyCellsFromSharedMem &amp;&amp; !outResults.isEmpty()) {<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>          // Do the copy of the results here.<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          ListIterator&lt;Cell&gt; listItr = outResults.listIterator();<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          Cell cell = null;<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          while (listItr.hasNext()) {<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>            cell = listItr.next();<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>            if (cell instanceof ShareableMemory) {<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>              listItr.set(((ShareableMemory) cell).cloneToCell());<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>            }<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>          }<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>        }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>      } finally {<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        if (copyCellsFromSharedMem) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          // In case of copyCellsFromSharedMem==true (where the CPs wrap a scanner) we return<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          // the blocks then and there (for wrapped CPs)<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>          this.shipped();<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>      return moreValues;<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    }<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    /**<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>     * @return true if more cells exist after this batch, false if scanner is done<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>     */<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>    private boolean populateFromJoinedHeap(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>            throws IOException {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      assert joinedContinuationRow != null;<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>      boolean moreValues = populateResult(results, this.joinedHeap, scannerContext,<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>          joinedContinuationRow);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      if (!scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>        // We are done with this row, reset the continuation.<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>        joinedContinuationRow = null;<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span>      }<a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>      // As the data is obtained from two independent heaps, we need to<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>      // ensure that result list is sorted, because Result relies on that.<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>      Collections.sort(results, comparator);<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>      return moreValues;<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>    }<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    /**<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>     * Fetches records with currentRow into results list, until next row, batchLimit (if not -1) is<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>     * reached, or remainingResultSize (if not -1) is reaced<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>     * @param heap KeyValueHeap to fetch data from.It must be positioned on correct row before call.<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>     * @param scannerContext<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>     * @param currentRowCell<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>     * @return state of last call to {@link KeyValueHeap#next()}<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>     */<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    private boolean populateResult(List&lt;Cell&gt; results, KeyValueHeap heap,<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>        ScannerContext scannerContext, Cell currentRowCell) throws IOException {<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      Cell nextKv;<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      boolean moreCellsInRow = false;<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      boolean tmpKeepProgress = scannerContext.getKeepProgress();<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      // Scanning between column families and thus the scope is between cells<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      LimitScope limitScope = LimitScope.BETWEEN_CELLS;<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      try {<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>        do {<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>          // We want to maintain any progress that is made towards the limits while scanning across<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>          // different column families. To do this, we toggle the keep progress flag on during calls<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>          // to the StoreScanner to ensure that any progress made thus far is not wiped away.<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>          scannerContext.setKeepProgress(true);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>          heap.next(results, scannerContext);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>          scannerContext.setKeepProgress(tmpKeepProgress);<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>          nextKv = heap.peek();<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>          moreCellsInRow = moreCellsInRow(nextKv, currentRowCell);<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>          if (!moreCellsInRow) incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>          if (scannerContext.checkBatchLimit(limitScope)) {<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>            return scannerContext.setScannerState(NextState.BATCH_LIMIT_REACHED).hasMoreValues();<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>          } else if (scannerContext.checkSizeLimit(limitScope)) {<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>            ScannerContext.NextState state =<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>              moreCellsInRow? NextState.SIZE_LIMIT_REACHED_MID_ROW: NextState.SIZE_LIMIT_REACHED;<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>          } else if (scannerContext.checkTimeLimit(limitScope)) {<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>            ScannerContext.NextState state =<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>              moreCellsInRow? NextState.TIME_LIMIT_REACHED_MID_ROW: NextState.TIME_LIMIT_REACHED;<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>          }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>        } while (moreCellsInRow);<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>      } catch (FileNotFoundException e) {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>        throw handleFileNotFound(e);<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>      }<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      return nextKv != null;<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    }<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span><a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    /**<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>     * Based on the nextKv in the heap, and the current row, decide whether or not there are more<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>     * cells to be read in the heap. If the row of the nextKv in the heap matches the current row<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>     * then there are more cells to be read in the row.<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>     * @param nextKv<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>     * @param currentRowCell<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>     * @return true When there are more cells in the row to be read<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>     */<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>    private boolean moreCellsInRow(final Cell nextKv, Cell currentRowCell) {<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      return nextKv != null &amp;&amp; CellUtil.matchingRow(nextKv, currentRowCell);<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>    }<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span><a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>    /*<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>     * @return True if a filter rules the scanner is over, done.<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>     */<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    @Override<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    public synchronized boolean isFilterDone() throws IOException {<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      return isFilterDoneInternal();<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    }<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span><a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>    private boolean isFilterDoneInternal() throws IOException {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      return this.filter != null &amp;&amp; this.filter.filterAllRemaining();<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>    }<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span><a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    private boolean nextInternal(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>        throws IOException {<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>      if (!results.isEmpty()) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>        throw new IllegalArgumentException("First parameter should be an empty list");<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>      }<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      if (scannerContext == null) {<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>        throw new IllegalArgumentException("Scanner context cannot be null");<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      RpcCallContext rpcCall = RpcServer.getCurrentCall();<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span><a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>      // Save the initial progress from the Scanner context in these local variables. The progress<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      // may need to be reset a few times if rows are being filtered out so we save the initial<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      // progress.<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      int initialBatchProgress = scannerContext.getBatchProgress();<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>      long initialSizeProgress = scannerContext.getSizeProgress();<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>      long initialTimeProgress = scannerContext.getTimeProgress();<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      // The loop here is used only when at some point during the next we determine<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      // that due to effects of filters or otherwise, we have an empty row in the result.<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>      // Then we loop and try again. Otherwise, we must get out on the first iteration via return,<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>      // "true" if there's more data to read, "false" if there isn't (storeHeap is at a stop row,<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>      // and joinedHeap has no more data to read for the last row (if set, joinedContinuationRow).<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>      while (true) {<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>        // Starting to scan a new row. Reset the scanner progress according to whether or not<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>        // progress should be kept.<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>        if (scannerContext.getKeepProgress()) {<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>          // Progress should be kept. Reset to initial values seen at start of method invocation.<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>          scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>            initialTimeProgress);<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        } else {<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>          scannerContext.clearProgress();<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        }<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>        if (rpcCall != null) {<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>          // If a user specifies a too-restrictive or too-slow scanner, the<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>          // client might time out and disconnect while the server side<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>          // is still processing the request. We should abort aggressively<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>          // in that case.<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>          long afterTime = rpcCall.disconnectSince();<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>          if (afterTime &gt;= 0) {<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>            throw new CallerDisconnectedException(<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>                "Aborting on region " + getRegionInfo().getRegionNameAsString() + ", call " +<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>                    this + " after " + afterTime + " ms, since " +<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>                    "caller disconnected");<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          }<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span><a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>        // Let's see what we have in the storeHeap.<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>        Cell current = this.storeHeap.peek();<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span><a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>        boolean stopRow = isStopRow(current);<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // When has filter row is true it means that the all the cells for a particular row must be<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        // read before a filtering decision can be made. This means that filters where hasFilterRow<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>        // run the risk of encountering out of memory errors in the case that they are applied to a<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>        // table that has very large rows.<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>        boolean hasFilterRow = this.filter != null &amp;&amp; this.filter.hasFilterRow();<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span><a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>        // If filter#hasFilterRow is true, partial results are not allowed since allowing them<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>        // would prevent the filters from being evaluated. Thus, if it is true, change the<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>        // scope of any limits that could potentially create partial results to<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>        // LimitScope.BETWEEN_ROWS so that those limits are not reached mid-row<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>        if (hasFilterRow) {<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>          if (LOG.isTraceEnabled()) {<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>            LOG.trace("filter#hasFilterRow is true which prevents partial results from being "<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>                + " formed. Changing scope of limits that may create partials");<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span>          }<a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>          scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>          scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>        }<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span><a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>        // Check if we were getting data from the joinedHeap and hit the limit.<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>        // If not, then it's main path - getting results from storeHeap.<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>        if (joinedContinuationRow == null) {<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>          // First, check if we are at a stop row. If so, there are no more results.<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>          if (stopRow) {<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>            if (hasFilterRow) {<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>              filter.filterRowCells(results);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>            }<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>          }<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span><a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>          // Check if rowkey filter wants to exclude this row. If so, loop to next.<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>          // Technically, if we hit limits before on this row, we don't need this call.<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>          if (filterRowKey(current)) {<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>            // Typically the count of rows scanned is incremented inside #populateResult. However,<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>            // here we are filtering a row based purely on its row key, preventing us from calling<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>            // #populateResult. Thus, perform the necessary increment here to rows scanned metric<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>            incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>            if (!moreRows) {<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>            }<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>            results.clear();<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>            continue;<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>          }<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span><a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>          // Ok, we are good, let's try to get some results from the main heap.<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>          populateResult(results, this.storeHeap, scannerContext, current);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>            if (hasFilterRow) {<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>              throw new IncompatibleFilterException(<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>                  "Filter whose hasFilterRow() returns true is incompatible with scans that must "<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>                      + " stop mid-row because of a limit. ScannerContext:" + scannerContext);<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>            }<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>            return true;<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>          }<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span><a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>          Cell nextKv = this.storeHeap.peek();<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>          stopRow = nextKv == null || isStopRow(nextKv);<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>          // save that the row was empty before filters applied to it.<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>          final boolean isEmptyRow = results.isEmpty();<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span><a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>          // We have the part of the row necessary for filtering (all of it, usually).<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>          // First filter with the filterRow(List).<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>          FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>          if (hasFilterRow) {<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>            ret = filter.filterRowCellsWithRet(results);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span><a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>            // We don't know how the results have changed after being filtered. Must set progress<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>            // according to contents of results now. However, a change in the results should not<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>            // affect the time progress. Thus preserve whatever time progress has been made<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>            long timeProgress = scannerContext.getTimeProgress();<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>            if (scannerContext.getKeepProgress()) {<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>              scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>                initialTimeProgress);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>            } else {<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>              scannerContext.clearProgress();<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>            }<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>            scannerContext.setTimeProgress(timeProgress);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>            scannerContext.incrementBatchProgress(results.size());<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>            for (Cell cell : results) {<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>              scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOf(cell));<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>            }<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>          }<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span><a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>          if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>            results.clear();<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>            if (!moreRows) {<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>            }<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>            // This row was totally filtered out, if this is NOT the last row,<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>            // we should continue on. Otherwise, nothing else to do.<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>            if (!stopRow) continue;<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>          }<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>          // Ok, we are done with storeHeap for this row.<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>          // Now we may need to fetch additional, non-essential data into row.<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>          // These values are not needed for filter to work, so we postpone their<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>          // fetch to (possibly) reduce amount of data loads from disk.<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>          if (this.joinedHeap != null) {<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>            boolean mayHaveData = joinedHeapMayHaveData(current);<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>            if (mayHaveData) {<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>              joinedContinuationRow = current;<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>              populateFromJoinedHeap(results, scannerContext);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span><a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>              if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>                return true;<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>              }<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>            }<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>          }<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>        } else {<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>          // Populating from the joined heap was stopped by limits, populate some more.<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>          populateFromJoinedHeap(results, scannerContext);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>            return true;<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>          }<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>        }<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>        // We may have just called populateFromJoinedMap and hit the limits. If that is<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>        // the case, we need to call it again on the next next() invocation.<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span>        if (joinedContinuationRow != null) {<a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>        }<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span><a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>        // Finally, we are done with both joinedHeap and storeHeap.<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>        // Double check to prevent empty rows from appearing in result. It could be<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>        // the case when SingleColumnValueExcludeFilter is used.<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>        if (results.isEmpty()) {<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>          incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>          boolean moreRows = nextRow(scannerContext, current);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>          if (!moreRows) {<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>          }<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>          if (!stopRow) continue;<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>        }<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>        if (stopRow) {<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>        } else {<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>        }<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      }<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    }<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span><a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    protected void incrementCountOfRowsFilteredMetric(ScannerContext scannerContext) {<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span><a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      scannerContext.getMetrics().countOfRowsFiltered.incrementAndGet();<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    }<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span><a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    protected void incrementCountOfRowsScannedMetric(ScannerContext scannerContext) {<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span><a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      scannerContext.getMetrics().countOfRowsScanned.incrementAndGet();<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    }<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span><a name="line.603

<TRUNCATED>

[25/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html
index f72db18..621c781 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html
@@ -104,346 +104,350 @@
 <span class="sourceLineNo">096</span>  @Override<a name="line.96"></a>
 <span class="sourceLineNo">097</span>  protected void chore() {<a name="line.97"></a>
 <span class="sourceLineNo">098</span>    try {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      if (this.enabled.get()) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        scan();<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      } else {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>        LOG.warn("CatalogJanitor disabled! Not running scan.");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      }<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    } catch (IOException e) {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      LOG.warn("Failed scan of catalog table", e);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  /**<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * Scans hbase:meta and returns a number of scanned rows, and a map of merged<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * regions, and an ordered map of split parents.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * @return triple of scanned rows, map of merged regions and map of split<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   *         parent regioninfos<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * @throws IOException<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   */<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    getMergedRegionsAndSplitParents() throws IOException {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    return getMergedRegionsAndSplitParents(null);<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>  /**<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * Scans hbase:meta and returns a number of scanned rows, and a map of merged<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * regions, and an ordered map of split parents. if the given table name is<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * null, return merged regions and split parents of all tables, else only the<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   * specified table<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   * @param tableName null represents all tables<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * @return triple of scanned rows, and map of merged regions, and map of split<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   *         parent regioninfos<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   * @throws IOException<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   */<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    getMergedRegionsAndSplitParents(final TableName tableName) throws IOException {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    final boolean isTableSpecified = (tableName != null);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    // TODO: Only works with single hbase:meta region currently.  Fix.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    // Keep Map of found split parents.  There are candidates for cleanup.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // Use a comparator that has split parents come before its daughters.<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    final Map&lt;HRegionInfo, Result&gt; splitParents =<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      new TreeMap&lt;HRegionInfo, Result&gt;(new SplitParentFirstComparator());<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    final Map&lt;HRegionInfo, Result&gt; mergedRegions = new TreeMap&lt;HRegionInfo, Result&gt;();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    // This visitor collects split parents and counts rows in the hbase:meta table<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>    MetaTableAccessor.Visitor visitor = new MetaTableAccessor.Visitor() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      @Override<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      public boolean visit(Result r) throws IOException {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        if (r == null || r.isEmpty()) return true;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        count.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        HRegionInfo info = MetaTableAccessor.getHRegionInfo(r);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        if (info == null) return true; // Keep scanning<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        if (isTableSpecified<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            &amp;&amp; info.getTable().compareTo(tableName) &gt; 0) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          // Another table, stop scanning<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          return false;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        if (info.isSplitParent()) splitParents.put(info, r);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        if (r.getValue(HConstants.CATALOG_FAMILY, HConstants.MERGEA_QUALIFIER) != null) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>          mergedRegions.put(info, r);<a name="line.157"></a>
+<span class="sourceLineNo">099</span>      AssignmentManager am = this.services.getAssignmentManager();<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      if (this.enabled.get()<a name="line.100"></a>
+<span class="sourceLineNo">101</span>          &amp;&amp; am != null<a name="line.101"></a>
+<span class="sourceLineNo">102</span>          &amp;&amp; am.isFailoverCleanupDone()<a name="line.102"></a>
+<span class="sourceLineNo">103</span>          &amp;&amp; am.getRegionStates().getRegionsInTransition().size() == 0) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        scan();<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      } else {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        LOG.warn("CatalogJanitor disabled! Not running scan.");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      }<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    } catch (IOException e) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      LOG.warn("Failed scan of catalog table", e);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<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>   * Scans hbase:meta and returns a number of scanned rows, and a map of merged<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * regions, and an ordered map of split parents.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * @return triple of scanned rows, map of merged regions and map of split<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   *         parent regioninfos<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * @throws IOException<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    getMergedRegionsAndSplitParents() throws IOException {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    return getMergedRegionsAndSplitParents(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>   * Scans hbase:meta and returns a number of scanned rows, and a map of merged<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   * regions, and an ordered map of split parents. if the given table name is<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * null, return merged regions and split parents of all tables, else only the<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * specified table<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * @param tableName null represents all tables<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * @return triple of scanned rows, and map of merged regions, and map of split<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   *         parent regioninfos<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @throws IOException<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    getMergedRegionsAndSplitParents(final TableName tableName) throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    final boolean isTableSpecified = (tableName != null);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    // TODO: Only works with single hbase:meta region currently.  Fix.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    // Keep Map of found split parents.  There are candidates for cleanup.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    // Use a comparator that has split parents come before its daughters.<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    final Map&lt;HRegionInfo, Result&gt; splitParents =<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      new TreeMap&lt;HRegionInfo, Result&gt;(new SplitParentFirstComparator());<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    final Map&lt;HRegionInfo, Result&gt; mergedRegions = new TreeMap&lt;HRegionInfo, Result&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // This visitor collects split parents and counts rows in the hbase:meta table<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    MetaTableAccessor.Visitor visitor = new MetaTableAccessor.Visitor() {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      public boolean visit(Result r) throws IOException {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        if (r == null || r.isEmpty()) return true;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        count.incrementAndGet();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        HRegionInfo info = MetaTableAccessor.getHRegionInfo(r);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        if (info == null) return true; // Keep scanning<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        if (isTableSpecified<a name="line.154"></a>
+<span class="sourceLineNo">155</span>            &amp;&amp; info.getTable().compareTo(tableName) &gt; 0) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          // Another table, stop scanning<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          return false;<a name="line.157"></a>
 <span class="sourceLineNo">158</span>        }<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        // Returning true means "keep scanning"<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        return true;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      }<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    };<a name="line.162"></a>
-<span class="sourceLineNo">163</span><a name="line.163"></a>
-<span class="sourceLineNo">164</span>    // Run full scan of hbase:meta catalog table passing in our custom visitor with<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    // the start row<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    MetaTableAccessor.scanMetaForTableRegions(this.connection, visitor, tableName);<a name="line.166"></a>
+<span class="sourceLineNo">159</span>        if (info.isSplitParent()) splitParents.put(info, r);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        if (r.getValue(HConstants.CATALOG_FAMILY, HConstants.MERGEA_QUALIFIER) != null) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>          mergedRegions.put(info, r);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        }<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        // Returning true means "keep scanning"<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        return true;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    };<a name="line.166"></a>
 <span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    return new Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;(<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        count.get(), mergedRegions, splitParents);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">168</span>    // Run full scan of hbase:meta catalog table passing in our custom visitor with<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    // the start row<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    MetaTableAccessor.scanMetaForTableRegions(this.connection, visitor, tableName);<a name="line.170"></a>
 <span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * If merged region no longer holds reference to the merge regions, archive<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * merge region on hdfs and perform deleting references in hbase:meta<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param mergedRegion<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @param regionA<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @param regionB<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @return true if we delete references in merged region on hbase:meta and archive<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   *         the files on the file system<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @throws IOException<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  boolean cleanMergeRegion(final HRegionInfo mergedRegion,<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      final HRegionInfo regionA, final HRegionInfo regionB) throws IOException {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    Path tabledir = FSUtils.getTableDir(rootdir, mergedRegion.getTable());<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    HTableDescriptor htd = getTableDescriptor(mergedRegion.getTable());<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    HRegionFileSystem regionFs = null;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    try {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.190"></a>
-<span class="sourceLineNo">191</span>          this.services.getConfiguration(), fs, tabledir, mergedRegion, true);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    } catch (IOException e) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      LOG.warn("Merged region does not exist: " + mergedRegion.getEncodedName());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (regionFs == null || !regionFs.hasReferences(htd)) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      LOG.debug("Deleting region " + regionA.getRegionNameAsString() + " and "<a name="line.196"></a>
-<span class="sourceLineNo">197</span>          + regionB.getRegionNameAsString()<a name="line.197"></a>
-<span class="sourceLineNo">198</span>          + " from fs because merged region no longer holds references");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, regionA);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, regionB);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      MetaTableAccessor.deleteMergeQualifiers(server.getConnection(),<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        mergedRegion);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      return true;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    return false;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  /**<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   * Run janitorial scan of catalog &lt;code&gt;hbase:meta&lt;/code&gt; table looking for<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * garbage to collect.<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * @return number of cleaned regions<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * @throws IOException<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  int scan() throws IOException {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    try {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      if (!alreadyRunning.compareAndSet(false, true)) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        LOG.debug("CatalogJanitor already running");<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        return 0;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt; scanTriple =<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        getMergedRegionsAndSplitParents();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      int count = scanTriple.getFirst();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      /**<a name="line.223"></a>
-<span class="sourceLineNo">224</span>       * clean merge regions first<a name="line.224"></a>
-<span class="sourceLineNo">225</span>       */<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      int mergeCleaned = 0;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      Map&lt;HRegionInfo, Result&gt; mergedRegions = scanTriple.getSecond();<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : mergedRegions.entrySet()) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        PairOfSameType&lt;HRegionInfo&gt; p = MetaTableAccessor.getMergeRegions(e.getValue());<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        HRegionInfo regionA = p.getFirst();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        HRegionInfo regionB = p.getSecond();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        if (regionA == null || regionB == null) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          LOG.warn("Unexpected references regionA="<a name="line.233"></a>
-<span class="sourceLineNo">234</span>              + (regionA == null ? "null" : regionA.getRegionNameAsString())<a name="line.234"></a>
-<span class="sourceLineNo">235</span>              + ",regionB="<a name="line.235"></a>
-<span class="sourceLineNo">236</span>              + (regionB == null ? "null" : regionB.getRegionNameAsString())<a name="line.236"></a>
-<span class="sourceLineNo">237</span>              + " in merged region " + e.getKey().getRegionNameAsString());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        } else {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          if (cleanMergeRegion(e.getKey(), regionA, regionB)) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            mergeCleaned++;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      /**<a name="line.244"></a>
-<span class="sourceLineNo">245</span>       * clean split parents<a name="line.245"></a>
-<span class="sourceLineNo">246</span>       */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      Map&lt;HRegionInfo, Result&gt; splitParents = scanTriple.getThird();<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>      // Now work on our list of found parents. See if any we can clean up.<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      int splitCleaned = 0;<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      // regions whose parents are still around<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      HashSet&lt;String&gt; parentNotCleaned = new HashSet&lt;String&gt;();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : splitParents.entrySet()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        if (!parentNotCleaned.contains(e.getKey().getEncodedName()) &amp;&amp;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>            cleanParent(e.getKey(), e.getValue())) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          splitCleaned++;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } else {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          // We could not clean the parent, so it's daughters should not be<a name="line.258"></a>
-<span class="sourceLineNo">259</span>          // cleaned either (HBASE-6160)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          PairOfSameType&lt;HRegionInfo&gt; daughters =<a name="line.260"></a>
-<span class="sourceLineNo">261</span>              MetaTableAccessor.getDaughterRegions(e.getValue());<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          parentNotCleaned.add(daughters.getFirst().getEncodedName());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          parentNotCleaned.add(daughters.getSecond().getEncodedName());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      if ((mergeCleaned + splitCleaned) != 0) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        LOG.info("Scanned " + count + " catalog row(s), gc'd " + mergeCleaned<a name="line.267"></a>
-<span class="sourceLineNo">268</span>            + " unreferenced merged region(s) and " + splitCleaned<a name="line.268"></a>
-<span class="sourceLineNo">269</span>            + " unreferenced parent region(s)");<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      } else if (LOG.isTraceEnabled()) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        LOG.trace("Scanned " + count + " catalog row(s), gc'd " + mergeCleaned<a name="line.271"></a>
+<span class="sourceLineNo">172</span>    return new Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt;(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        count.get(), mergedRegions, splitParents);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  }<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span>  /**<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * If merged region no longer holds reference to the merge regions, archive<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   * merge region on hdfs and perform deleting references in hbase:meta<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * @param mergedRegion<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param regionA<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * @param regionB<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @return true if we delete references in merged region on hbase:meta and archive<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   *         the files on the file system<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @throws IOException<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  boolean cleanMergeRegion(final HRegionInfo mergedRegion,<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      final HRegionInfo regionA, final HRegionInfo regionB) throws IOException {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    Path tabledir = FSUtils.getTableDir(rootdir, mergedRegion.getTable());<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    HTableDescriptor htd = getTableDescriptor(mergedRegion.getTable());<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    HRegionFileSystem regionFs = null;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    try {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          this.services.getConfiguration(), fs, tabledir, mergedRegion, true);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    } catch (IOException e) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      LOG.warn("Merged region does not exist: " + mergedRegion.getEncodedName());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (regionFs == null || !regionFs.hasReferences(htd)) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      LOG.debug("Deleting region " + regionA.getRegionNameAsString() + " and "<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          + regionB.getRegionNameAsString()<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          + " from fs because merged region no longer holds references");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, regionA);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, regionB);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      MetaTableAccessor.deleteMergeQualifiers(server.getConnection(),<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        mergedRegion);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      return true;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return false;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Run janitorial scan of catalog &lt;code&gt;hbase:meta&lt;/code&gt; table looking for<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * garbage to collect.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @return number of cleaned regions<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * @throws IOException<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   */<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  int scan() throws IOException {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    try {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (!alreadyRunning.compareAndSet(false, true)) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        LOG.debug("CatalogJanitor already running");<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        return 0;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      Triple&lt;Integer, Map&lt;HRegionInfo, Result&gt;, Map&lt;HRegionInfo, Result&gt;&gt; scanTriple =<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        getMergedRegionsAndSplitParents();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      int count = scanTriple.getFirst();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      /**<a name="line.227"></a>
+<span class="sourceLineNo">228</span>       * clean merge regions first<a name="line.228"></a>
+<span class="sourceLineNo">229</span>       */<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      int mergeCleaned = 0;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      Map&lt;HRegionInfo, Result&gt; mergedRegions = scanTriple.getSecond();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : mergedRegions.entrySet()) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        PairOfSameType&lt;HRegionInfo&gt; p = MetaTableAccessor.getMergeRegions(e.getValue());<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        HRegionInfo regionA = p.getFirst();<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        HRegionInfo regionB = p.getSecond();<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        if (regionA == null || regionB == null) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>          LOG.warn("Unexpected references regionA="<a name="line.237"></a>
+<span class="sourceLineNo">238</span>              + (regionA == null ? "null" : regionA.getRegionNameAsString())<a name="line.238"></a>
+<span class="sourceLineNo">239</span>              + ",regionB="<a name="line.239"></a>
+<span class="sourceLineNo">240</span>              + (regionB == null ? "null" : regionB.getRegionNameAsString())<a name="line.240"></a>
+<span class="sourceLineNo">241</span>              + " in merged region " + e.getKey().getRegionNameAsString());<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        } else {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          if (cleanMergeRegion(e.getKey(), regionA, regionB)) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>            mergeCleaned++;<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>      }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      /**<a name="line.248"></a>
+<span class="sourceLineNo">249</span>       * clean split parents<a name="line.249"></a>
+<span class="sourceLineNo">250</span>       */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      Map&lt;HRegionInfo, Result&gt; splitParents = scanTriple.getThird();<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>      // Now work on our list of found parents. See if any we can clean up.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      int splitCleaned = 0;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      // regions whose parents are still around<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      HashSet&lt;String&gt; parentNotCleaned = new HashSet&lt;String&gt;();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      for (Map.Entry&lt;HRegionInfo, Result&gt; e : splitParents.entrySet()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        if (!parentNotCleaned.contains(e.getKey().getEncodedName()) &amp;&amp;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>            cleanParent(e.getKey(), e.getValue())) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          splitCleaned++;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        } else {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>          // We could not clean the parent, so it's daughters should not be<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          // cleaned either (HBASE-6160)<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          PairOfSameType&lt;HRegionInfo&gt; daughters =<a name="line.264"></a>
+<span class="sourceLineNo">265</span>              MetaTableAccessor.getDaughterRegions(e.getValue());<a name="line.265"></a>
+<span class="sourceLineNo">266</span>          parentNotCleaned.add(daughters.getFirst().getEncodedName());<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          parentNotCleaned.add(daughters.getSecond().getEncodedName());<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      if ((mergeCleaned + splitCleaned) != 0) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        LOG.info("Scanned " + count + " catalog row(s), gc'd " + mergeCleaned<a name="line.271"></a>
 <span class="sourceLineNo">272</span>            + " unreferenced merged region(s) and " + splitCleaned<a name="line.272"></a>
 <span class="sourceLineNo">273</span>            + " unreferenced parent region(s)");<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      return mergeCleaned + splitCleaned;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } finally {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      alreadyRunning.set(false);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  }<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>  /**<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * Compare HRegionInfos in a way that has split parents sort BEFORE their<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * daughters.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   */<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  static class SplitParentFirstComparator implements Comparator&lt;HRegionInfo&gt; {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Comparator&lt;byte[]&gt; rowEndKeyComparator = new Bytes.RowEndKeyComparator();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    @Override<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    public int compare(HRegionInfo left, HRegionInfo right) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      // This comparator differs from the one HRegionInfo in that it sorts<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      // parent before daughters.<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      if (left == null) return -1;<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      if (right == null) return 1;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // Same table name.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int result = left.getTable().compareTo(right.getTable());<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      if (result != 0) return result;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      // Compare start keys.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      result = Bytes.compareTo(left.getStartKey(), right.getStartKey());<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      if (result != 0) return result;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      // Compare end keys, but flip the operands so parent comes first<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      result = rowEndKeyComparator.compare(right.getEndKey(), left.getEndKey());<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      return result;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
+<span class="sourceLineNo">274</span>      } else if (LOG.isTraceEnabled()) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        LOG.trace("Scanned " + count + " catalog row(s), gc'd " + mergeCleaned<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            + " unreferenced merged region(s) and " + splitCleaned<a name="line.276"></a>
+<span class="sourceLineNo">277</span>            + " unreferenced parent region(s)");<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return mergeCleaned + splitCleaned;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      alreadyRunning.set(false);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<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>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Compare HRegionInfos in a way that has split parents sort BEFORE their<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * daughters.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  static class SplitParentFirstComparator implements Comparator&lt;HRegionInfo&gt; {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    Comparator&lt;byte[]&gt; rowEndKeyComparator = new Bytes.RowEndKeyComparator();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    @Override<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    public int compare(HRegionInfo left, HRegionInfo right) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      // This comparator differs from the one HRegionInfo in that it sorts<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      // parent before daughters.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      if (left == null) return -1;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      if (right == null) return 1;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      // Same table name.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      int result = left.getTable().compareTo(right.getTable());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      if (result != 0) return result;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      // Compare start keys.<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      result = Bytes.compareTo(left.getStartKey(), right.getStartKey());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      if (result != 0) return result;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      // Compare end keys, but flip the operands so parent comes first<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      result = rowEndKeyComparator.compare(right.getEndKey(), left.getEndKey());<a name="line.304"></a>
 <span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  /**<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * If daughters no longer hold reference to the parents, delete the parent.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   * @param parent HRegionInfo of split offlined parent<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   * @param rowContent Content of &lt;code&gt;parent&lt;/code&gt; row in<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   * &lt;code&gt;metaRegionName&lt;/code&gt;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * @return True if we removed &lt;code&gt;parent&lt;/code&gt; from meta table and from<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * the filesystem.<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @throws IOException<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  boolean cleanParent(final HRegionInfo parent, Result rowContent)<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  throws IOException {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    boolean result = false;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    // Check whether it is a merged region and not clean reference<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    // No necessary to check MERGEB_QUALIFIER because these two qualifiers will<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    // be inserted/deleted together<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (rowContent.getValue(HConstants.CATALOG_FAMILY,<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        HConstants.MERGEA_QUALIFIER) != null) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // wait cleaning merge region first<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      return result;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    // Run checks on each daughter split.<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    PairOfSameType&lt;HRegionInfo&gt; daughters = MetaTableAccessor.getDaughterRegions(rowContent);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    Pair&lt;Boolean, Boolean&gt; a = checkDaughterInFs(parent, daughters.getFirst());<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Pair&lt;Boolean, Boolean&gt; b = checkDaughterInFs(parent, daughters.getSecond());<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (hasNoReferences(a) &amp;&amp; hasNoReferences(b)) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      LOG.debug("Deleting region " + parent.getRegionNameAsString() +<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        " because daughter splits no longer hold references");<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      if (LOG.isTraceEnabled()) LOG.trace("Archiving parent region: " + parent);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, parent);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      MetaTableAccessor.deleteRegion(this.connection, parent);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      result = true;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return result;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  /**<a name="line.342"></a>
-<span class="sourceLineNo">343</span>   * @param p A pair where the first boolean says whether or not the daughter<a name="line.343"></a>
-<span class="sourceLineNo">344</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.344"></a>
-<span class="sourceLineNo">345</span>   * whether the daughter has references to the parent.<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * @return True the passed &lt;code&gt;p&lt;/code&gt; signifies no references.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private boolean hasNoReferences(final Pair&lt;Boolean, Boolean&gt; p) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    return !p.getFirst() || !p.getSecond();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>  /**<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * Checks if a daughter region -- either splitA or splitB -- still holds<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * references to parent.<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param parent Parent region<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @param daughter Daughter region<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @return A pair where the first boolean says whether or not the daughter<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   * whether the daughter has references to the parent.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * @throws IOException<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  Pair&lt;Boolean, Boolean&gt; checkDaughterInFs(final HRegionInfo parent, final HRegionInfo daughter)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    if (daughter == null)  {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    Path tabledir = FSUtils.getTableDir(rootdir, daughter.getTable());<a name="line.370"></a>
+<span class="sourceLineNo">306</span>      return result;<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * If daughters no longer hold reference to the parents, delete the parent.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   * @param parent HRegionInfo of split offlined parent<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   * @param rowContent Content of &lt;code&gt;parent&lt;/code&gt; row in<a name="line.313"></a>
+<span class="sourceLineNo">314</span>   * &lt;code&gt;metaRegionName&lt;/code&gt;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * @return True if we removed &lt;code&gt;parent&lt;/code&gt; from meta table and from<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   * the filesystem.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * @throws IOException<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  boolean cleanParent(final HRegionInfo parent, Result rowContent)<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  throws IOException {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    boolean result = false;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    // Check whether it is a merged region and not clean reference<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    // No necessary to check MERGEB_QUALIFIER because these two qualifiers will<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    // be inserted/deleted together<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    if (rowContent.getValue(HConstants.CATALOG_FAMILY,<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        HConstants.MERGEA_QUALIFIER) != null) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      // wait cleaning merge region first<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      return result;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    // Run checks on each daughter split.<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    PairOfSameType&lt;HRegionInfo&gt; daughters = MetaTableAccessor.getDaughterRegions(rowContent);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    Pair&lt;Boolean, Boolean&gt; a = checkDaughterInFs(parent, daughters.getFirst());<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    Pair&lt;Boolean, Boolean&gt; b = checkDaughterInFs(parent, daughters.getSecond());<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    if (hasNoReferences(a) &amp;&amp; hasNoReferences(b)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      LOG.debug("Deleting region " + parent.getRegionNameAsString() +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        " because daughter splits no longer hold references");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      if (LOG.isTraceEnabled()) LOG.trace("Archiving parent region: " + parent);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      HFileArchiver.archiveRegion(this.services.getConfiguration(), fs, parent);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      MetaTableAccessor.deleteRegion(this.connection, parent);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      result = true;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    return result;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  /**<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * @param p A pair where the first boolean says whether or not the daughter<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.348"></a>
+<span class="sourceLineNo">349</span>   * whether the daughter has references to the parent.<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * @return True the passed &lt;code&gt;p&lt;/code&gt; signifies no references.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private boolean hasNoReferences(final Pair&lt;Boolean, Boolean&gt; p) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return !p.getFirst() || !p.getSecond();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  /**<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * Checks if a daughter region -- either splitA or splitB -- still holds<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * references to parent.<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @param parent Parent region<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   * @param daughter Daughter region<a name="line.360"></a>
+<span class="sourceLineNo">361</span>   * @return A pair where the first boolean says whether or not the daughter<a name="line.361"></a>
+<span class="sourceLineNo">362</span>   * region directory exists in the filesystem and then the second boolean says<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * whether the daughter has references to the parent.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @throws IOException<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   */<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  Pair&lt;Boolean, Boolean&gt; checkDaughterInFs(final HRegionInfo parent, final HRegionInfo daughter)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  throws IOException {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    if (daughter == null)  {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
 <span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>    Path daughterRegionDir = new Path(tabledir, daughter.getEncodedName());<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>    HRegionFileSystem regionFs = null;<a name="line.374"></a>
+<span class="sourceLineNo">372</span>    FileSystem fs = this.services.getMasterFileSystem().getFileSystem();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    Path rootdir = this.services.getMasterFileSystem().getRootDir();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    Path tabledir = FSUtils.getTableDir(rootdir, daughter.getTable());<a name="line.374"></a>
 <span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    try {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      if (!FSUtils.isExists(fs, daughterRegionDir)) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        return new Pair&lt;Boolean, Boolean&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    } catch (IOException ioe) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      LOG.warn("Error trying to determine if daughter region exists, " +<a name="line.381"></a>
-<span class="sourceLineNo">382</span>               "assuming exists and has references", ioe);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          this.services.getConfiguration(), fs, tabledir, daughter, true);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    } catch (IOException e) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      LOG.warn("Error trying to determine referenced files from : " + daughter.getEncodedName()<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          + ", to: " + parent.getEncodedName() + " assuming has references", e);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>    boolean references = false;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor parentDescriptor = getTableDescriptor(parent.getTable());<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    for (HColumnDescriptor family: parentDescriptor.getFamilies()) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      if ((references = regionFs.hasReferences(family.getNameAsString()))) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        break;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.valueOf(references));<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  private HTableDescriptor getTableDescriptor(final TableName tableName)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      throws FileNotFoundException, IOException {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return this.services.getTableDescriptors().get(tableName);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /**<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Checks if the specified region has merge qualifiers, if so, try to clean<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * them<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   * @param region<a name="line.413"></a>
-<span class="sourceLineNo">414</span>   * @return true if the specified region doesn't have merge qualifier now<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   * @throws IOException<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public boolean cleanMergeQualifier(final HRegionInfo region)<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      throws IOException {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Get merge regions if it is a merged region and already has merge<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    // qualifier<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Pair&lt;HRegionInfo, HRegionInfo&gt; mergeRegions = MetaTableAccessor<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        .getRegionsFromMergeQualifier(this.services.getConnection(),<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          region.getRegionName());<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    if (mergeRegions == null<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        || (mergeRegions.getFirst() == null &amp;&amp; mergeRegions.getSecond() == null)) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      // It doesn't have merge qualifier, no need to clean<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      return true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    // It shouldn't happen, we must insert/delete these two qualifiers together<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    if (mergeRegions.getFirst() == null || mergeRegions.getSecond() == null) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      LOG.error("Merged region " + region.getRegionNameAsString()<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          + " has only one merge qualifier in META.");<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      return false;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    return cleanMergeRegion(region, mergeRegions.getFirst(),<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        mergeRegions.getSecond());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>}<a name="line.438"></a>
+<span class="sourceLineNo">376</span>    Path daughterRegionDir = new Path(tabledir, daughter.getEncodedName());<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>    HRegionFileSystem regionFs = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    try {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      if (!FSUtils.isExists(fs, daughterRegionDir)) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        return new Pair&lt;Boolean, Boolean&gt;(Boolean.FALSE, Boolean.FALSE);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    } catch (IOException ioe) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      LOG.warn("Error trying to determine if daughter region exists, " +<a name="line.385"></a>
+<span class="sourceLineNo">386</span>               "assuming exists and has references", ioe);<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>    try {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      regionFs = HRegionFileSystem.openRegionFromFileSystem(<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          this.services.getConfiguration(), fs, tabledir, daughter, true);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } catch (IOException e) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      LOG.warn("Error trying to determine referenced files from : " + daughter.getEncodedName()<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          + ", to: " + parent.getEncodedName() + " assuming has references", e);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.TRUE);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    boolean references = false;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor parentDescriptor = getTableDescriptor(parent.getTable());<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (HColumnDescriptor family: parentDescriptor.getFamilies()) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      if ((references = regionFs.hasReferences(family.getNameAsString()))) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        break;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      }<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return new Pair&lt;Boolean, Boolean&gt;(Boolean.TRUE, Boolean.valueOf(references));<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  private HTableDescriptor getTableDescriptor(final TableName tableName)<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      throws FileNotFoundException, IOException {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    return this.services.getTableDescriptors().get(tableName);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>  /**<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * Checks if the specified region has merge qualifiers, if so, try to clean<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * them<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * @param region<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   * @return true if the specified region doesn't have merge qualifier now<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * @throws IOException<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   */<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  public boolean cleanMergeQualifier(final HRegionInfo region)<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      throws IOException {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    // Get merge regions if it is a merged region and already has merge<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // qualifier<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Pair&lt;HRegionInfo, HRegionInfo&gt; mergeRegions = MetaTableAccessor<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        .getRegionsFromMergeQualifier(this.services.getConnection(),<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          region.getRegionName());<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    if (mergeRegions == null<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        || (mergeRegions.getFirst() == null &amp;&amp; mergeRegions.getSecond() == null)) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      // It doesn't have merge qualifier, no need to clean<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      return true;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    // It shouldn't happen, we must insert/delete these two qualifiers together<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    if (mergeRegions.getFirst() == null || mergeRegions.getSecond() == null) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      LOG.error("Merged region " + region.getRegionNameAsString()<a name="line.435"></a>
+<span class="sourceLineNo">436</span>          + " has only one merge qualifier in META.");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      return false;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return cleanMergeRegion(region, mergeRegions.getFirst(),<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        mergeRegions.getSecond());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>}<a name="line.442"></a>
 
 
 


[03/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerShippedCallBack.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerShippedCallBack.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerShippedCallBack.html
index 4434339..0a8fce1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerShippedCallBack.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerShippedCallBack.html
@@ -1155,1706 +1155,1717 @@
 <span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
 <span class="sourceLineNo">1148</span>  Region getRegion(<a name="line.1148"></a>
 <span class="sourceLineNo">1149</span>      final RegionSpecifier regionSpecifier) throws IOException {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    return regionServer.getRegionByEncodedName(regionSpecifier.getValue().toByteArray(),<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        ProtobufUtil.getRegionEncodedName(regionSpecifier));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  @VisibleForTesting<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  public PriorityFunction getPriority() {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return priority;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  @VisibleForTesting<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public Configuration getConfiguration() {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    return regionServer.getConfiguration();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private RegionServerQuotaManager getQuotaManager() {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    return regionServer.getRegionServerQuotaManager();<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  void start() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    rpcServer.start();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  void stop() {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    closeAllScanners();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    rpcServer.stop();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span><a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   * Called to verify that this server is up and running.<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   *<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>   * @throws IOException<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>   */<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>  protected void checkOpen() throws IOException {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    if (regionServer.isAborted()) {<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      throw new RegionServerAbortedException("Server " + regionServer.serverName + " aborting");<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    if (regionServer.isStopped()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      throw new RegionServerStoppedException("Server " + regionServer.serverName + " stopping");<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (!regionServer.fsOk) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      throw new RegionServerStoppedException("File system not available");<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    if (!regionServer.isOnline()) {<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      throw new ServerNotRunningYetException("Server is not running yet");<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  /**<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>   * @return list of blocking services and their security info classes that this server supports<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>   */<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>  protected List&lt;BlockingServiceAndInterface&gt; getServices() {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    List&lt;BlockingServiceAndInterface&gt; bssi = new ArrayList&lt;BlockingServiceAndInterface&gt;(2);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      ClientService.newReflectiveBlockingService(this),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      ClientService.BlockingInterface.class));<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      AdminService.newReflectiveBlockingService(this),<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      AdminService.BlockingInterface.class));<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    return bssi;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span><a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  public InetSocketAddress getSocketAddress() {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    return isa;<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span><a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>  @Override<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    return priority.getPriority(header, param, user);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>  @Override<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    return priority.getDeadline(header, param);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>  }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  /*<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * Check if an OOME and, if so, abort immediately to avoid creating more objects.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   *<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @param e<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   *<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>   * @return True if we OOME'd and are aborting.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>   */<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  @Override<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  public boolean checkOOME(final Throwable e) {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    boolean stop = false;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    try {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      if (e instanceof OutOfMemoryError<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          || (e.getCause() != null &amp;&amp; e.getCause() instanceof OutOfMemoryError)<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>          || (e.getMessage() != null &amp;&amp; e.getMessage().contains(<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>              "java.lang.OutOfMemoryError"))) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>        stop = true;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        LOG.fatal("Run out of memory; " + getClass().getSimpleName()<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>          + " will abort itself immediately", e);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    } finally {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>      if (stop) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>        Runtime.getRuntime().halt(1);<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      }<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    }<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    return stop;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>  }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>  /**<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>   * Close a region on the region server.<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   *<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>   * @param controller the RPC controller<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>   * @param request the request<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>   * @throws ServiceException<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>   */<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  @Override<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  public CloseRegionResponse closeRegion(final RpcController controller,<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      final CloseRegionRequest request) throws ServiceException {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    final ServerName sn = (request.hasDestinationServer() ?<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      ProtobufUtil.toServerName(request.getDestinationServer()) : null);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    try {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      checkOpen();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>      if (request.hasServerStartCode()) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>        // check that we are the same server that this RPC is intended for.<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        long serverStartCode = request.getServerStartCode();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>        if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>              "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>              + regionServer.serverName));<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion());<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span><a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      // Can be null if we're calling close on a region that's not online<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      final Region region = regionServer.getFromOnlineRegions(encodedRegionName);<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if ((region  != null) &amp;&amp; (region .getCoprocessorHost() != null)) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        region.getCoprocessorHost().preClose(false);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      requestCount.increment();<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      LOG.info("Close " + encodedRegionName + ", moving to " + sn);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      boolean closed = regionServer.closeRegion(encodedRegionName, false, sn);<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed);<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      return builder.build();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    } catch (IOException ie) {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      throw new ServiceException(ie);<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>  }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>  /**<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * Compact a region on the region server.<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   *<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * @param controller the RPC controller<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * @param request the request<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * @throws ServiceException<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   */<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  @Override<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      final CompactRegionRequest request) throws ServiceException {<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    try {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>      checkOpen();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      requestCount.increment();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      Region region = getRegion(request.getRegion());<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      region.startRegionOperation(Operation.COMPACT_REGION);<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString());<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      boolean major = false;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      byte [] family = null;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      Store store = null;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      if (request.hasFamily()) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        family = request.getFamily().toByteArray();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>        store = region.getStore(family);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>        if (store == null) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>          throw new ServiceException(new IOException("column family " + Bytes.toString(family)<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>            + " does not exist in region " + region.getRegionInfo().getRegionNameAsString()));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>        }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      if (request.hasMajor()) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>        major = request.getMajor();<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      }<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      if (major) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>        if (family != null) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>          store.triggerMajorCompaction();<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        } else {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          region.triggerMajorCompaction();<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>        }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):"";<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      if (LOG.isTraceEnabled()) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        LOG.trace("User-triggered compaction requested for region "<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>          + region.getRegionInfo().getRegionNameAsString() + familyLogMsg);<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg;<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if(family != null) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        regionServer.compactSplitThread.requestCompaction(region, store, log,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      } else {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        regionServer.compactSplitThread.requestCompaction(region, log,<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      }<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      return CompactRegionResponse.newBuilder().build();<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    } catch (IOException ie) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      throw new ServiceException(ie);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Flush a region on the region server.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param controller the RPC controller<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param request the request<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @throws ServiceException<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>  public FlushRegionResponse flushRegion(final RpcController controller,<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>      final FlushRegionRequest request) throws ServiceException {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    try {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      checkOpen();<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      requestCount.increment();<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      Region region = getRegion(request.getRegion());<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString());<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      boolean shouldFlush = true;<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      if (request.hasIfOlderThanTs()) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>        shouldFlush = region.getEarliestFlushTimeForAllStores() &lt; request.getIfOlderThanTs();<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder();<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (shouldFlush) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        boolean writeFlushWalMarker =  request.hasWriteFlushWalMarker() ?<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>            request.getWriteFlushWalMarker() : false;<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        // Go behind the curtain so we can manage writing of the flush WAL marker<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl)<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>            ((HRegion)region).flushcache(true, writeFlushWalMarker);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        if (flushResult.isFlushSucceeded()) {<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>          regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>        }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>        boolean compactionNeeded = flushResult.isCompactionNeeded();<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        if (compactionNeeded) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          regionServer.compactSplitThread.requestSystemCompaction(region,<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>            "Compaction through user triggered flush");<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        builder.setFlushed(flushResult.isFlushSucceeded());<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores());<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      return builder.build();<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    } catch (DroppedSnapshotException ex) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>      // is required. Currently the only way to do this is a restart of<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      // the server.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>      throw new ServiceException(ex);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    } catch (IOException ie) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      throw new ServiceException(ie);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span><a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>  @Override<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>  public GetOnlineRegionResponse getOnlineRegion(final RpcController controller,<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      final GetOnlineRegionRequest request) throws ServiceException {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    try {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      checkOpen();<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      requestCount.increment();<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      Map&lt;String, Region&gt; onlineRegions = regionServer.onlineRegions;<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      List&lt;HRegionInfo&gt; list = new ArrayList&lt;HRegionInfo&gt;(onlineRegions.size());<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      for (Region region: onlineRegions.values()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>        list.add(region.getRegionInfo());<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      }<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      Collections.sort(list);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      return ResponseConverter.buildGetOnlineRegionResponse(list);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    } catch (IOException ie) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      throw new ServiceException(ie);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>  @Override<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      final GetRegionInfoRequest request) throws ServiceException {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      checkOpen();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      requestCount.increment();<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>      Region region = getRegion(request.getRegion());<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      HRegionInfo info = region.getRegionInfo();<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      builder.setRegionInfo(HRegionInfo.convert(info));<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        builder.setCompactionState(region.getCompactionState());<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      builder.setIsRecovering(region.isRecovering());<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      return builder.build();<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    } catch (IOException ie) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      throw new ServiceException(ie);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span><a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>  /**<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * Get some information of the region server.<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   *<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   * @param controller the RPC controller<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>   * @param request the request<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>   * @throws ServiceException<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>   */<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>  @Override<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>  public GetServerInfoResponse getServerInfo(final RpcController controller,<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      final GetServerInfoRequest request) throws ServiceException {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    try {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      checkOpen();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    } catch (IOException ie) {<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      throw new ServiceException(ie);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    requestCount.increment();<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1;<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>  }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>  @Override<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  public GetStoreFileResponse getStoreFile(final RpcController controller,<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      final GetStoreFileRequest request) throws ServiceException {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    try {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      checkOpen();<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      Region region = getRegion(request.getRegion());<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      requestCount.increment();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Set&lt;byte[]&gt; columnFamilies;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      if (request.getFamilyCount() == 0) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>        columnFamilies = region.getTableDesc().getFamiliesKeys();<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      } else {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>        columnFamilies = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        for (ByteString cf: request.getFamilyList()) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          columnFamilies.add(cf.toByteArray());<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        }<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      int nCF = columnFamilies.size();<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      List&lt;String&gt;  fileList = region.getStoreFileList(<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        columnFamilies.toArray(new byte[nCF][]));<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>      GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder();<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      builder.addAllStoreFile(fileList);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      return builder.build();<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    } catch (IOException ie) {<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      throw new ServiceException(ie);<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  /**<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   * Merge regions on the region server.<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>   *<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>   * @param controller the RPC controller<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>   * @param request the request<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>   * @return merge regions response<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>   * @throws ServiceException<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>   */<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  @Override<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>  @QosPriority(priority = HConstants.ADMIN_QOS)<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>  public MergeRegionsResponse mergeRegions(final RpcController controller,<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      final MergeRegionsRequest request) throws ServiceException {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    try {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      checkOpen();<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      requestCount.increment();<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>      Region regionA = getRegion(request.getRegionA());<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      Region regionB = getRegion(request.getRegionB());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>      boolean forcible = request.getForcible();<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>      long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      regionA.startRegionOperation(Operation.MERGE_REGION);<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      regionB.startRegionOperation(Operation.MERGE_REGION);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (regionA.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID ||<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>          regionB.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) {<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        throw new ServiceException(new MergeRegionException("Can't merge non-default replicas"));<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      LOG.info("Receiving merging request for  " + regionA + ", " + regionB<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          + ",forcible=" + forcible);<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>      long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>      FlushResult flushResult = regionA.flush(true);<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      if (flushResult.isFlushSucceeded()) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      }<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      startTime = EnvironmentEdgeManager.currentTime();<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      flushResult = regionB.flush(true);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      if (flushResult.isFlushSucceeded()) {<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>        long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>      regionServer.compactSplitThread.requestRegionsMerge(regionA, regionB, forcible,<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          masterSystemTime, RpcServer.getRequestUser());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      return MergeRegionsResponse.newBuilder().build();<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    } catch (DroppedSnapshotException ex) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      throw new ServiceException(ex);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>    } catch (IOException ie) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      throw new ServiceException(ie);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>  }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span><a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  /**<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>   * Open asynchronously a region or a set of regions on the region server.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>   *<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>   * The opening is coordinated by ZooKeeper, and this method requires the znode to be created<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>   *  before being called. As a consequence, this method should be called only from the master.<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>   * &lt;p&gt;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>   * Different manages states for the region are:<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>   * &lt;/p&gt;&lt;ul&gt;<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>   *  &lt;li&gt;region not opened: the region opening will start asynchronously.&lt;/li&gt;<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>   *  &lt;li&gt;a close is already in progress: this is considered as an error.&lt;/li&gt;<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>   *  &lt;li&gt;an open is already in progress: this new open request will be ignored. This is important<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>   *  because the Master can do multiple requests if it crashes.&lt;/li&gt;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>   *  &lt;li&gt;the region is already opened:  this new open request will be ignored.&lt;/li&gt;<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>   *  &lt;/ul&gt;<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>   * &lt;p&gt;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>   * Bulk assign: If there are more than 1 region to open, it will be considered as a bulk assign.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>   * For a single region opening, errors are sent through a ServiceException. For bulk assign,<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>   * errors are put in the response as FAILED_OPENING.<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>   * &lt;/p&gt;<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * @param controller the RPC controller<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @param request the request<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   * @throws ServiceException<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>   */<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  @Override<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>  public OpenRegionResponse openRegion(final RpcController controller,<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      final OpenRegionRequest request) throws ServiceException {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    requestCount.increment();<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    if (request.hasServerStartCode()) {<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      // check that we are the same server that this RPC is intended for.<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>      long serverStartCode = request.getServerStartCode();<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>            "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>            + regionServer.serverName));<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    OpenRegionResponse.Builder builder = OpenRegionResponse.newBuilder();<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    final int regionCount = request.getOpenInfoCount();<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    final Map&lt;TableName, HTableDescriptor&gt; htds =<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>        new HashMap&lt;TableName, HTableDescriptor&gt;(regionCount);<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    final boolean isBulkAssign = regionCount &gt; 1;<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    try {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      checkOpen();<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    } catch (IOException ie) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>      TableName tableName = null;<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>      if (regionCount == 1) {<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>        RegionInfo ri = request.getOpenInfo(0).getRegion();<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>        if (ri != null) {<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          tableName = ProtobufUtil.toTableName(ri.getTableName());<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>        }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      if (!TableName.META_TABLE_NAME.equals(tableName)) {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>        throw new ServiceException(ie);<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>      // We are assigning meta, wait a little for regionserver to finish initialization.<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>      int timeout = regionServer.conf.getInt(HConstants.HBASE_RPC_TIMEOUT_KEY,<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        HConstants.DEFAULT_HBASE_RPC_TIMEOUT) &gt;&gt; 2; // Quarter of RPC timeout<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      long endTime = System.currentTimeMillis() + timeout;<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>      synchronized (regionServer.online) {<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>        try {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>          while (System.currentTimeMillis() &lt;= endTime<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>              &amp;&amp; !regionServer.isStopped() &amp;&amp; !regionServer.isOnline()) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>            regionServer.online.wait(regionServer.msgInterval);<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          }<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          checkOpen();<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        } catch (InterruptedException t) {<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          Thread.currentThread().interrupt();<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          throw new ServiceException(t);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>        } catch (IOException e) {<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          throw new ServiceException(e);<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>        }<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>      }<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    }<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1;<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>    for (RegionOpenInfo regionOpenInfo : request.getOpenInfoList()) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>      final HRegionInfo region = HRegionInfo.convert(regionOpenInfo.getRegion());<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>      HTableDescriptor htd;<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>      try {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>        String encodedName = region.getEncodedName();<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        byte[] encodedNameBytes = region.getEncodedNameAsBytes();<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>        final Region onlineRegion = regionServer.getFromOnlineRegions(encodedName);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>        if (onlineRegion != null) {<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>          // The region is already online. This should not happen any more.<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>          String error = "Received OPEN for the region:"<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            + region.getRegionNameAsString() + ", which is already online";<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>          regionServer.abort(error);<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>          throw new IOException(error);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>        }<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        LOG.info("Open " + region.getRegionNameAsString());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        htd = htds.get(region.getTable());<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        if (htd == null) {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          htd = regionServer.tableDescriptors.get(region.getTable());<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>          htds.put(region.getTable(), htd);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>        }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>        final Boolean previous = regionServer.regionsInTransitionInRS.putIfAbsent(<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          encodedNameBytes, Boolean.TRUE);<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        if (Boolean.FALSE.equals(previous)) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          if (regionServer.getFromOnlineRegions(encodedName) != null) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            // There is a close in progress. This should not happen any more.<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>            String error = "Received OPEN for the region:"<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              + region.getRegionNameAsString() + ", which we are already trying to CLOSE";<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            regionServer.abort(error);<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>            throw new IOException(error);<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>          }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          regionServer.regionsInTransitionInRS.put(encodedNameBytes, Boolean.TRUE);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        }<a name="line.1657"></a>
+<span class="sourceLineNo">1150</span>    ByteString value = regionSpecifier.getValue();<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    RegionSpecifierType type = regionSpecifier.getType();<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    switch (type) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      case REGION_NAME:<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        byte[] regionName = value.toByteArray();<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>        String encodedRegionName = HRegionInfo.encodeRegionName(regionName);<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>        return regionServer.getRegionByEncodedName(regionName, encodedRegionName);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      case ENCODED_REGION_NAME:<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        return regionServer.getRegionByEncodedName(value.toStringUtf8());<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      default:<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        throw new DoNotRetryIOException(<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          "Unsupported region specifier type: " + type);<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span><a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  @VisibleForTesting<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>  public PriorityFunction getPriority() {<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    return priority;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span><a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>  @VisibleForTesting<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  public Configuration getConfiguration() {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    return regionServer.getConfiguration();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  private RegionServerQuotaManager getQuotaManager() {<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    return regionServer.getRegionServerQuotaManager();<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span><a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>  void start() {<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    rpcServer.start();<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  }<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span><a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>  void stop() {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    closeAllScanners();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    rpcServer.stop();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>  }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span><a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>  /**<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   * Called to verify that this server is up and running.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   *<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @throws IOException<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   */<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  protected void checkOpen() throws IOException {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    if (regionServer.isAborted()) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      throw new RegionServerAbortedException("Server " + regionServer.serverName + " aborting");<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regionServer.isStopped()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      throw new RegionServerStoppedException("Server " + regionServer.serverName + " stopping");<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    if (!regionServer.fsOk) {<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      throw new RegionServerStoppedException("File system not available");<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!regionServer.isOnline()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      throw new ServerNotRunningYetException("Server is not running yet");<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>  }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span><a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  /**<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * @return list of blocking services and their security info classes that this server supports<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   */<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>  protected List&lt;BlockingServiceAndInterface&gt; getServices() {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    List&lt;BlockingServiceAndInterface&gt; bssi = new ArrayList&lt;BlockingServiceAndInterface&gt;(2);<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      ClientService.newReflectiveBlockingService(this),<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      ClientService.BlockingInterface.class));<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      AdminService.newReflectiveBlockingService(this),<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      AdminService.BlockingInterface.class));<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    return bssi;<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>  public InetSocketAddress getSocketAddress() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return isa;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  @Override<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    return priority.getPriority(header, param, user);<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return priority.getDeadline(header, param);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  /*<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>   * Check if an OOME and, if so, abort immediately to avoid creating more objects.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>   *<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>   * @param e<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   *<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * @return True if we OOME'd and are aborting.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  public boolean checkOOME(final Throwable e) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    boolean stop = false;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>      if (e instanceof OutOfMemoryError<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>          || (e.getCause() != null &amp;&amp; e.getCause() instanceof OutOfMemoryError)<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>          || (e.getMessage() != null &amp;&amp; e.getMessage().contains(<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>              "java.lang.OutOfMemoryError"))) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        stop = true;<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>        LOG.fatal("Run out of memory; " + getClass().getSimpleName()<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>          + " will abort itself immediately", e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    } finally {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      if (stop) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        Runtime.getRuntime().halt(1);<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    return stop;<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span><a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>  /**<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   * Close a region on the region server.<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>   *<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>   * @param controller the RPC controller<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>   * @param request the request<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>   * @throws ServiceException<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>   */<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>  public CloseRegionResponse closeRegion(final RpcController controller,<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      final CloseRegionRequest request) throws ServiceException {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    final ServerName sn = (request.hasDestinationServer() ?<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      ProtobufUtil.toServerName(request.getDestinationServer()) : null);<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    try {<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>      checkOpen();<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      if (request.hasServerStartCode()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        // check that we are the same server that this RPC is intended for.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        long serverStartCode = request.getServerStartCode();<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>        if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>              "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>              + regionServer.serverName));<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion());<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // Can be null if we're calling close on a region that's not online<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      final Region region = regionServer.getFromOnlineRegions(encodedRegionName);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      if ((region  != null) &amp;&amp; (region .getCoprocessorHost() != null)) {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>        region.getCoprocessorHost().preClose(false);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      requestCount.increment();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      LOG.info("Close " + encodedRegionName + ", moving to " + sn);<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      boolean closed = regionServer.closeRegion(encodedRegionName, false, sn);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return builder.build();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    } catch (IOException ie) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      throw new ServiceException(ie);<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span><a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  /**<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * Compact a region on the region server.<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   *<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   * @param controller the RPC controller<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * @param request the request<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * @throws ServiceException<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  @Override<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>      final CompactRegionRequest request) throws ServiceException {<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    try {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>      checkOpen();<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>      requestCount.increment();<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      Region region = getRegion(request.getRegion());<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      region.startRegionOperation(Operation.COMPACT_REGION);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString());<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      boolean major = false;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      byte [] family = null;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>      Store store = null;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>      if (request.hasFamily()) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>        family = request.getFamily().toByteArray();<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>        store = region.getStore(family);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>        if (store == null) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>          throw new ServiceException(new IOException("column family " + Bytes.toString(family)<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>            + " does not exist in region " + region.getRegionInfo().getRegionNameAsString()));<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>        }<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      if (request.hasMajor()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        major = request.getMajor();<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      if (major) {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        if (family != null) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>          store.triggerMajorCompaction();<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        } else {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>          region.triggerMajorCompaction();<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span><a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):"";<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (LOG.isTraceEnabled()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        LOG.trace("User-triggered compaction requested for region "<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          + region.getRegionInfo().getRegionNameAsString() + familyLogMsg);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      if(family != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>        regionServer.compactSplitThread.requestCompaction(region, store, log,<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>      } else {<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>        regionServer.compactSplitThread.requestCompaction(region, log,<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return CompactRegionResponse.newBuilder().build();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    } catch (IOException ie) {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      throw new ServiceException(ie);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span><a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>  /**<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * Flush a region on the region server.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   *<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * @param controller the RPC controller<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * @param request the request<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * @throws ServiceException<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   */<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  @Override<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  public FlushRegionResponse flushRegion(final RpcController controller,<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>      final FlushRegionRequest request) throws ServiceException {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    try {<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      checkOpen();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      requestCount.increment();<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      Region region = getRegion(request.getRegion());<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>      LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString());<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>      boolean shouldFlush = true;<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      if (request.hasIfOlderThanTs()) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        shouldFlush = region.getEarliestFlushTimeForAllStores() &lt; request.getIfOlderThanTs();<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      if (shouldFlush) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        boolean writeFlushWalMarker =  request.hasWriteFlushWalMarker() ?<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>            request.getWriteFlushWalMarker() : false;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>        // Go behind the curtain so we can manage writing of the flush WAL marker<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl)<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            ((HRegion)region).flushcache(true, writeFlushWalMarker);<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        if (flushResult.isFlushSucceeded()) {<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        boolean compactionNeeded = flushResult.isCompactionNeeded();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>        if (compactionNeeded) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>          regionServer.compactSplitThread.requestSystemCompaction(region,<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>            "Compaction through user triggered flush");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        }<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        builder.setFlushed(flushResult.isFlushSucceeded());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker);<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores());<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return builder.build();<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    } catch (DroppedSnapshotException ex) {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>      // is required. Currently the only way to do this is a restart of<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      // the server.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>      throw new ServiceException(ex);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    } catch (IOException ie) {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      throw new ServiceException(ie);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>  }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>  @Override<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>  public GetOnlineRegionResponse getOnlineRegion(final RpcController controller,<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      final GetOnlineRegionRequest request) throws ServiceException {<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    try {<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>      checkOpen();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      requestCount.increment();<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>      Map&lt;String, Region&gt; onlineRegions = regionServer.onlineRegions;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      List&lt;HRegionInfo&gt; list = new ArrayList&lt;HRegionInfo&gt;(onlineRegions.size());<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      for (Region region: onlineRegions.values()) {<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        list.add(region.getRegionInfo());<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      }<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>      Collections.sort(list);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      return ResponseConverter.buildGetOnlineRegionResponse(list);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    } catch (IOException ie) {<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      throw new ServiceException(ie);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    }<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>  }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      final GetRegionInfoRequest request) throws ServiceException {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>    try {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>      checkOpen();<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      requestCount.increment();<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      Region region = getRegion(request.getRegion());<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      HRegionInfo info = region.getRegionInfo();<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      builder.setRegionInfo(HRegionInfo.convert(info));<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>        builder.setCompactionState(region.getCompactionState());<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>      }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>      builder.setIsRecovering(region.isRecovering());<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>      return builder.build();<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    } catch (IOException ie) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throw new ServiceException(ie);<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    }<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span><a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>  /**<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>   * Get some information of the region server.<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>   *<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>   * @param controller the RPC controller<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>   * @param request the request<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * @throws ServiceException<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  @Override<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>  public GetServerInfoResponse getServerInfo(final RpcController controller,<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      final GetServerInfoRequest request) throws ServiceException {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    try {<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      checkOpen();<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    } catch (IOException ie) {<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      throw new ServiceException(ie);<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>    }<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    requestCount.increment();<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>  }<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span><a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>  @Override<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>  public GetStoreFileResponse getStoreFile(final RpcController controller,<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      final GetStoreFileRequest request) throws ServiceException {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    try {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      checkOpen();<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      Region region = getRegion(request.getRegion());<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      requestCount.increment();<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>      Set&lt;byte[]&gt; columnFamilies;<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>      if (request.getFamilyCount() == 0) {<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>        columnFamilies = region.getTableDesc().getFamiliesKeys();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      } else {<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>        columnFamilies = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>        for (ByteString cf: request.getFamilyList()) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>          columnFamilies.add(cf.toByteArray());<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>      }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>      int nCF = columnFamilies.size();<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      List&lt;String&gt;  fileList = region.getStoreFileList(<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        columnFamilies.toArray(new byte[nCF][]));<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder();<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      builder.addAllStoreFile(fileList);<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      return builder.build();<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    } catch (IOException ie) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>      throw new ServiceException(ie);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>    }<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span><a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>  /**<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>   * Merge regions on the region server.<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   *<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   * @param controller the RPC controller<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>   * @param request the request<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>   * @return merge regions response<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>   * @throws ServiceException<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>   */<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span

<TRUNCATED>

[11/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
index e2c4389..d03724e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
@@ -5185,3056 +5185,3058 @@
 <span class="sourceLineNo">5177</span>   * @param readLock is the lock reader or writer. True indicates that a non-exlcusive<a name="line.5177"></a>
 <span class="sourceLineNo">5178</span>   *                 lock is requested<a name="line.5178"></a>
 <span class="sourceLineNo">5179</span>   */<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    // Make sure the row is inside of this region before getting the lock for it.<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    checkRow(row, "row lock");<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    // create an object to use a a key in the row lock map<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    HashedBytes rowKey = new HashedBytes(row);<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    RowLockContext rowLockContext = null;<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    RowLockImpl result = null;<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    TraceScope traceScope = null;<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span><a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    // If we're tracing start a span to show how long this took.<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>    if (Trace.isTracing()) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>      traceScope = Trace.startSpan("HRegion.getRowLock");<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>      traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock"));<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>    }<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span><a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    try {<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>      // Keep trying until we have a lock or error out.<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>      // TODO: do we need to add a time component here?<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>      while (result == null) {<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span><a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>        // Try adding a RowLockContext to the lockedRows.<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>        // If we can add it then there's no other transactions currently running.<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        rowLockContext = new RowLockContext(rowKey);<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span><a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>        // if there was a running transaction then there's already a context.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>        if (existingContext != null) {<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>          rowLockContext = existingContext;<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>        }<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span><a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>        // Now try an get the lock.<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>        //<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>        // This can fail as<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>        if (readLock) {<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>          result = rowLockContext.newReadLock();<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>        } else {<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>          result = rowLockContext.newWriteLock();<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>        }<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      }<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      if (!result.getLock().tryLock(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>        if (traceScope != null) {<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>          traceScope.getSpan().addTimelineAnnotation("Failed to get row lock");<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>        }<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>        result = null;<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>        // Clean up the counts just in case this was the thing keeping the context alive.<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        rowLockContext.cleanUp();<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        throw new IOException("Timed out waiting for lock for row: " + rowKey);<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>      }<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>      return result;<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>    } catch (InterruptedException ie) {<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>      LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>      iie.initCause(ie);<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>      if (traceScope != null) {<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>        traceScope.getSpan().addTimelineAnnotation("Interrupted exception getting row lock");<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>      }<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>      Thread.currentThread().interrupt();<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>      throw iie;<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    } finally {<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>      if (traceScope != null) {<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>        traceScope.close();<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>      }<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    }<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>  }<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span><a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>  @Override<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>  public void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>    if (rowLocks != null) {<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>      for (RowLock rowLock : rowLocks) {<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span>        rowLock.release();<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>      }<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>      rowLocks.clear();<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    }<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>  }<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span><a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>  @VisibleForTesting<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>  class RowLockContext {<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span>    private final HashedBytes row;<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    final AtomicBoolean usable = new AtomicBoolean(true);<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    final Object lock = new Object();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    RowLockContext(HashedBytes row) {<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>      this.row = row;<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    }<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span><a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    RowLockImpl newWriteLock() {<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>      Lock l = readWriteLock.writeLock();<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>      return getRowLock(l);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    }<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    RowLockImpl newReadLock() {<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>      Lock l = readWriteLock.readLock();<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>      return getRowLock(l);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    private RowLockImpl getRowLock(Lock l) {<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>      count.incrementAndGet();<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>      synchronized (lock) {<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        if (usable.get()) {<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>          return new RowLockImpl(this, l);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        } else {<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>          return null;<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        }<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>      }<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    }<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span><a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    void cleanUp() {<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>      long c = count.decrementAndGet();<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>      if (c &lt;= 0) {<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        synchronized (lock) {<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>          if (count.get() &lt;= 0 ){<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>            usable.set(false);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>            RowLockContext removed = lockedRows.remove(row);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>            assert removed == this: "we should never remove a different context";<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>          }<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        }<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>      }<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    }<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span><a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    @Override<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    public String toString() {<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>      return "RowLockContext{" +<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>          "row=" + row +<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>          ", readWriteLock=" + readWriteLock +<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>          ", count=" + count +<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>          '}';<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    }<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>  }<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span><a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>  /**<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>   * Class used to represent a lock on a row.<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>   */<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>  public static class RowLockImpl implements RowLock {<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    private final RowLockContext context;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    private final Lock lock;<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span><a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    public RowLockImpl(RowLockContext context, Lock lock) {<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>      this.context = context;<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>      this.lock = lock;<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    }<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span><a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    public Lock getLock() {<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>      return lock;<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    }<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span><a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    @VisibleForTesting<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>    public RowLockContext getContext() {<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      return context;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    }<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span><a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    @Override<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    public void release() {<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>      lock.unlock();<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>      context.cleanUp();<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>    }<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span><a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    @Override<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    public String toString() {<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>      return "RowLockImpl{" +<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>          "context=" + context +<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>          ", lock=" + lock +<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>          '}';<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>    }<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  }<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span><a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>  /**<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>   * Determines whether multiple column families are present<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>   * Precondition: familyPaths is not null<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>   *<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>   * @param familyPaths List of (column family, hfilePath)<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>   */<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    boolean multipleFamilies = false;<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    byte[] family = null;<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    for (Pair&lt;byte[], String&gt; pair : familyPaths) {<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>      byte[] fam = pair.getFirst();<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>      if (family == null) {<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>        family = fam;<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>      } else if (!Bytes.equals(family, fam)) {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>        multipleFamilies = true;<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>        break;<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>      }<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    }<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    return multipleFamilies;<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>  }<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span><a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  @Override<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>  public boolean bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, boolean assignSeqId,<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      BulkLoadListener bulkLoadListener) throws IOException {<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>    long seqId = -1;<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;byte[], List&lt;Path&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    Preconditions.checkNotNull(familyPaths);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    // we need writeLock for multi-family bulk load<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    try {<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      this.writeRequestsCount.increment();<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      // There possibly was a split that happened between when the split keys<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // were gathered and before the HRegion's write lock was taken.  We need<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      // to validate the HFile region before attempting to bulk load all of them<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>      List&lt;IOException&gt; ioes = new ArrayList&lt;IOException&gt;();<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;Pair&lt;byte[], String&gt;&gt;();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>        byte[] familyName = p.getFirst();<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>        String path = p.getSecond();<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span><a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>        Store store = getStore(familyName);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>        if (store == null) {<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>          IOException ioe = new org.apache.hadoop.hbase.DoNotRetryIOException(<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>              "No such column family " + Bytes.toStringBinary(familyName));<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>          ioes.add(ioe);<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>        } else {<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>          try {<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>            store.assertBulkLoadHFileOk(new Path(path));<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>          } catch (WrongRegionException wre) {<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>            // recoverable (file doesn't fit in region)<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>            failures.add(p);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>          } catch (IOException ioe) {<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>            // unrecoverable (hdfs problem)<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>            ioes.add(ioe);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>          }<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>        }<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>      }<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span><a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>      // validation failed because of some sort of IO problem.<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>      if (ioes.size() != 0) {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>        IOException e = MultipleIOException.createIOException(ioes);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>        LOG.error("There were one or more IO errors when checking if the bulk load is ok.", e);<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>        throw e;<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>      }<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span><a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>      // validation failed, bail out before doing anything permanent.<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>      if (failures.size() != 0) {<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>        StringBuilder list = new StringBuilder();<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>        for (Pair&lt;byte[], String&gt; p : failures) {<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>              .append(p.getSecond());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>        }<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        // problem when validating<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>        LOG.warn("There was a recoverable bulk load failure likely due to a" +<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>            " split.  These (family, HFile) pairs were not loaded: " + list);<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>        return false;<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>      }<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span><a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>      // We need to assign a sequential ID that's in between two memstores in order to preserve<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>      // the guarantee that all the edits lower than the highest sequential ID from all the<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>      // HFiles are flushed on disk. See HBASE-10958.  The sequence id returned when we flush is<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>      // a sequence id that we can be sure is beyond the last hfile written).<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>      if (assignSeqId) {<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        FlushResult fs = flushcache(true, false);<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>        if (fs.isFlushSucceeded()) {<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>        } else {<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>          throw new IOException("Could not bulk load with an assigned sequential ID because the "+<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>            "flush didn't run. Reason for not flushing: " + ((FlushResultImpl)fs).failureReason);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>        }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span>      }<a name="line.5441"></a>
-<span class="sourceLineNo">5442</span><a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        byte[] familyName = p.getFirst();<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>        String path = p.getSecond();<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>        Store store = getStore(familyName);<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>        try {<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>          String finalPath = path;<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>          if (bulkLoadListener != null) {<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path);<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>          }<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>          Path commitedStoreFile = store.bulkLoadHFile(finalPath, seqId);<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span><a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>          if(storeFiles.containsKey(familyName)) {<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>            storeFiles.get(familyName).add(commitedStoreFile);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>          } else {<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>            List&lt;Path&gt; storeFileNames = new ArrayList&lt;Path&gt;();<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>            storeFileNames.add(commitedStoreFile);<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>            storeFiles.put(familyName, storeFileNames);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>          }<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>          if (bulkLoadListener != null) {<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>            bulkLoadListener.doneBulkLoad(familyName, path);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>          }<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>        } catch (IOException ioe) {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>          // A failure here can cause an atomicity violation that we currently<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>          // cannot recover from since it is likely a failed HDFS operation.<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span><a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>          // TODO Need a better story for reverting partial failures due to HDFS.<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>          LOG.error("There was a partial failure due to IO when attempting to" +<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>              " load " + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>          if (bulkLoadListener != null) {<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>            try {<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>              bulkLoadListener.failedBulkLoad(familyName, path);<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>            } catch (Exception ex) {<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>              LOG.error("Error while calling failedBulkLoad for family " +<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>                  Bytes.toString(familyName) + " with path " + path, ex);<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>            }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>          }<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>          throw ioe;<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>        }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>      }<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span><a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>      return true;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    } finally {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        // write a bulk load event when not all hfiles are loaded<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        try {<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>          WALProtos.BulkLoadDescriptor loadDescriptor = ProtobufUtil.toBulkLoadDescriptor(<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>              this.getRegionInfo().getTable(),<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>              ByteStringer.wrap(this.getRegionInfo().getEncodedNameAsBytes()), storeFiles, seqId);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>          WALUtil.writeBulkLoadMarkerAndSync(wal, this.htableDescriptor, getRegionInfo(),<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>              loadDescriptor, mvcc);<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span>        } catch (IOException ioe) {<a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>          if (this.rsServices != null) {<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>            // Have to abort region server because some hfiles has been loaded but we can't write<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>            // the event into WAL<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>          }<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>        }<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>      }<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span><a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>      closeBulkRegionOperation();<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    }<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>  }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span><a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  @Override<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>  public boolean equals(Object o) {<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>                                                ((HRegion) o).getRegionInfo().getRegionName());<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>  }<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span><a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>  @Override<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>  public int hashCode() {<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    return Bytes.hashCode(getRegionInfo().getRegionName());<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>  }<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span><a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>  @Override<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>  public String toString() {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>    return getRegionInfo().getRegionNameAsString();<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>  }<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span><a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>  /**<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>   * RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>   */<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>  class RegionScannerImpl implements RegionScanner, org.apache.hadoop.hbase.ipc.RpcCallback {<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    // Package local for testability<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>    KeyValueHeap storeHeap = null;<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>    /** Heap of key-values that are not essential for the provided filters and are thus read<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>     * on demand, if on-demand column family loading is enabled.*/<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>    KeyValueHeap joinedHeap = null;<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>    /**<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>     * If the joined heap data gathering is interrupted due to scan limits, this will<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>     * contain the row for which we are populating the values.*/<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>    protected Cell joinedContinuationRow = null;<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    private boolean filterClosed = false;<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span><a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>    protected final int isScan;<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    protected final byte[] stopRow;<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    protected final HRegion region;<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    protected final CellComparator comparator;<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>    protected boolean copyCellsFromSharedMem = false;<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span><a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>    private final long readPt;<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>    private final long maxResultSize;<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>    private final ScannerContext defaultScannerContext;<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>    private final FilterWrapper filter;<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span><a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    @Override<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    public HRegionInfo getRegionInfo() {<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>      return region.getRegionInfo();<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>    }<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span><a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    public void setCopyCellsFromSharedMem(boolean copyCells) {<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>      this.copyCellsFromSharedMem = copyCells;<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    }<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span><a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    RegionScannerImpl(Scan scan, List&lt;KeyValueScanner&gt; additionalScanners, HRegion region,<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        boolean copyCellsFromSharedMem)<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>        throws IOException {<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>      this.region = region;<a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      this.maxResultSize = scan.getMaxResultSize();<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>      if (scan.hasFilter()) {<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        this.filter = new FilterWrapper(scan.getFilter());<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>      } else {<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>        this.filter = null;<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>      }<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      this.comparator = region.getCellCompartor();<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>      /**<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>       * By default, calls to next/nextRaw must enforce the batch limit. Thus, construct a default<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>       * scanner context that can be used to enforce the batch limit in the event that a<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>       * ScannerContext is not specified during an invocation of next/nextRaw<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>       */<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>      defaultScannerContext = ScannerContext.newBuilder()<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>          .setBatchLimit(scan.getBatch()).build();<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span><a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) &amp;&amp; !scan.isGetScan()) {<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>        this.stopRow = null;<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span>      } else {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        this.stopRow = scan.getStopRow();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>      }<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      // If we are doing a get, we want to be [startRow,endRow]. Normally<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>      // it is [startRow,endRow) and if startRow=endRow we get nothing.<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      this.isScan = scan.isGetScan() ? 1 : 0;<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span><a name="line.5584"></a>
-<span class="sourceLineNo">5585</span>      // synchronize on scannerReadPoints so that nobody calculates<a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>      // getSmallestReadPoint, before scannerReadPoints is updated.<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      IsolationLevel isolationLevel = scan.getIsolationLevel();<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      synchronized(scannerReadPoints) {<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>        this.readPt = getReadpoint(isolationLevel);<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        scannerReadPoints.put(this, this.readPt);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>      }<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span><a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>      // Here we separate all scanners into two lists - scanner that provide data required<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      // by the filter to operate (scanners list) and all others (joinedScanners list).<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>      List&lt;KeyValueScanner&gt; scanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>      List&lt;KeyValueScanner&gt; joinedScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>      if (additionalScanners != null) {<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>        scanners.addAll(additionalScanners);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>      }<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span><a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>      for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; entry : scan.getFamilyMap().entrySet()) {<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>        Store store = stores.get(entry.getKey());<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>        KeyValueScanner scanner;<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span>        try {<a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>          scanner = store.getScanner(scan, entry.getValue(), this.readPt);<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>        } catch (FileNotFoundException e) {<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>          throw handleFileNotFound(e);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>        }<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>        if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand()<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>          || this.filter.isFamilyEssential(entry.getKey())) {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>          scanners.add(scanner);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>        } else {<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>          joinedScanners.add(scanner);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>        }<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      }<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>      this.copyCellsFromSharedMem = copyCellsFromSharedMem;<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      initializeKVHeap(scanners, joinedScanners, region);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    }<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span><a name="line.5619"></a>
-<span class="sourceLineNo">5620</span>    protected void initializeKVHeap(List&lt;KeyValueScanner&gt; scanners,<a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>        List&lt;KeyValueScanner&gt; joinedScanners, HRegion region)<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>        throws IOException {<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      this.storeHeap = new KeyValueHeap(scanners, comparator);<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      if (!joinedScanners.isEmpty()) {<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>        this.joinedHeap = new KeyValueHeap(joinedScanners, comparator);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span>      }<a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    }<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span><a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    @Override<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    public long getMaxResultSize() {<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>      return maxResultSize;<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    @Override<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    public long getMvccReadPoint() {<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      return this.readPt;<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span>    }<a name="line.5637"></a>
-<span class="sourceLineNo">5638</span><a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>    @Override<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>    public int getBatch() {<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      return this.defaultScannerContext.getBatchLimit();<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>    }<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    /**<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>     * Reset both the filter and the old filter.<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>     *<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>     * @throws IOException in case a filter raises an I/O exception.<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>     */<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    protected void resetFilters() throws IOException {<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>      if (filter != null) {<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>        filter.reset();<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span>      }<a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    }<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span><a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    @Override<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>    public boolean next(List&lt;Cell&gt; outResults)<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>        throws IOException {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>      // apply the batching limit by default<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>      return next(outResults, defaultScannerContext);<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>    }<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span><a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    @Override<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    public synchronized boolean next(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    throws IOException {<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>      if (this.filterClosed) {<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>        throw new UnknownScannerException("Scanner was closed (timed out?) " +<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>            "after we renewed it. Could be caused by a very slow scanner " +<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>            "or a lengthy garbage collection");<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>      }<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>      startRegionOperation(Operation.SCAN);<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>      readRequestsCount.increment();<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>      try {<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>        return nextRaw(outResults, scannerContext);<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>      } finally {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>        closeRegionOperation(Operation.SCAN);<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>      }<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>    }<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span><a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    @Override<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    public boolean nextRaw(List&lt;Cell&gt; outResults) throws IOException {<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      // Use the RegionScanner's context by default<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return nextRaw(outResults, defaultScannerContext);<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span><a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>    @Override<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>    public boolean nextRaw(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        throws IOException {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>      if (storeHeap == null) {<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        // scanner is closed<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>        throw new UnknownScannerException("Scanner was closed");<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      }<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      boolean moreValues = false;<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      try {<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>        if (outResults.isEmpty()) {<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>          // Usually outResults is empty. This is true when next is called<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>          // to handle scan or get operation.<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>          moreValues = nextInternal(outResults, scannerContext);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        } else {<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>          List&lt;Cell&gt; tmpList = new ArrayList&lt;Cell&gt;();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>          moreValues = nextInternal(tmpList, scannerContext);<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>          outResults.addAll(tmpList);<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        }<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span><a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        // If the size limit was reached it means a partial Result is being<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>        // returned. Returning a<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        // partial Result means that we should not reset the filters; filters<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>        // should only be reset in<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>        // between rows<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>        if (!scannerContext.partialResultFormed()) resetFilters();<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span><a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>        if (isFilterDoneInternal()) {<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>          moreValues = false;<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>        }<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span><a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        // If copyCellsFromSharedMem = true, then we need to copy the cells. Otherwise<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>        // it is a call coming from the RsRpcServices.scan().<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        if (copyCellsFromSharedMem &amp;&amp; !outResults.isEmpty()) {<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>          // Do the copy of the results here.<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          ListIterator&lt;Cell&gt; listItr = outResults.listIterator();<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          Cell cell = null;<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          while (listItr.hasNext()) {<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>            cell = listItr.next();<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>            if (cell instanceof ShareableMemory) {<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>              listItr.set(((ShareableMemory) cell).cloneToCell());<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>            }<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>          }<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>        }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>      } finally {<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        if (copyCellsFromSharedMem) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          // In case of copyCellsFromSharedMem==true (where the CPs wrap a scanner) we return<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          // the blocks then and there (for wrapped CPs)<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>          this.shipped();<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>      return moreValues;<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    }<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    /**<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>     * @return true if more cells exist after this batch, false if scanner is done<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>     */<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>    private boolean populateFromJoinedHeap(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>            throws IOException {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      assert joinedContinuationRow != null;<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>      boolean moreValues = populateResult(results, this.joinedHeap, scannerContext,<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>          joinedContinuationRow);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      if (!scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>        // We are done with this row, reset the continuation.<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>        joinedContinuationRow = null;<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span>      }<a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>      // As the data is obtained from two independent heaps, we need to<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>      // ensure that result list is sorted, because Result relies on that.<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>      Collections.sort(results, comparator);<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>      return moreValues;<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>    }<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    /**<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>     * Fetches records with currentRow into results list, until next row, batchLimit (if not -1) is<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>     * reached, or remainingResultSize (if not -1) is reaced<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>     * @param heap KeyValueHeap to fetch data from.It must be positioned on correct row before call.<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>     * @param scannerContext<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>     * @param currentRowCell<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>     * @return state of last call to {@link KeyValueHeap#next()}<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>     */<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    private boolean populateResult(List&lt;Cell&gt; results, KeyValueHeap heap,<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>        ScannerContext scannerContext, Cell currentRowCell) throws IOException {<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      Cell nextKv;<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      boolean moreCellsInRow = false;<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      boolean tmpKeepProgress = scannerContext.getKeepProgress();<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      // Scanning between column families and thus the scope is between cells<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      LimitScope limitScope = LimitScope.BETWEEN_CELLS;<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      try {<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>        do {<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>          // We want to maintain any progress that is made towards the limits while scanning across<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>          // different column families. To do this, we toggle the keep progress flag on during calls<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>          // to the StoreScanner to ensure that any progress made thus far is not wiped away.<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>          scannerContext.setKeepProgress(true);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>          heap.next(results, scannerContext);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>          scannerContext.setKeepProgress(tmpKeepProgress);<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>          nextKv = heap.peek();<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>          moreCellsInRow = moreCellsInRow(nextKv, currentRowCell);<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>          if (!moreCellsInRow) incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>          if (scannerContext.checkBatchLimit(limitScope)) {<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>            return scannerContext.setScannerState(NextState.BATCH_LIMIT_REACHED).hasMoreValues();<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>          } else if (scannerContext.checkSizeLimit(limitScope)) {<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>            ScannerContext.NextState state =<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>              moreCellsInRow? NextState.SIZE_LIMIT_REACHED_MID_ROW: NextState.SIZE_LIMIT_REACHED;<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>          } else if (scannerContext.checkTimeLimit(limitScope)) {<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>            ScannerContext.NextState state =<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>              moreCellsInRow? NextState.TIME_LIMIT_REACHED_MID_ROW: NextState.TIME_LIMIT_REACHED;<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>          }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>        } while (moreCellsInRow);<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>      } catch (FileNotFoundException e) {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>        throw handleFileNotFound(e);<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>      }<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      return nextKv != null;<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    }<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span><a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    /**<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>     * Based on the nextKv in the heap, and the current row, decide whether or not there are more<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>     * cells to be read in the heap. If the row of the nextKv in the heap matches the current row<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>     * then there are more cells to be read in the row.<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>     * @param nextKv<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>     * @param currentRowCell<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>     * @return true When there are more cells in the row to be read<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>     */<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>    private boolean moreCellsInRow(final Cell nextKv, Cell currentRowCell) {<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      return nextKv != null &amp;&amp; CellUtil.matchingRow(nextKv, currentRowCell);<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>    }<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span><a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>    /*<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>     * @return True if a filter rules the scanner is over, done.<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>     */<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    @Override<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    public synchronized boolean isFilterDone() throws IOException {<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      return isFilterDoneInternal();<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    }<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span><a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>    private boolean isFilterDoneInternal() throws IOException {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      return this.filter != null &amp;&amp; this.filter.filterAllRemaining();<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>    }<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span><a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    private boolean nextInternal(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>        throws IOException {<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>      if (!results.isEmpty()) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>        throw new IllegalArgumentException("First parameter should be an empty list");<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>      }<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      if (scannerContext == null) {<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>        throw new IllegalArgumentException("Scanner context cannot be null");<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      RpcCallContext rpcCall = RpcServer.getCurrentCall();<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span><a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>      // Save the initial progress from the Scanner context in these local variables. The progress<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      // may need to be reset a few times if rows are being filtered out so we save the initial<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      // progress.<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      int initialBatchProgress = scannerContext.getBatchProgress();<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>      long initialSizeProgress = scannerContext.getSizeProgress();<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>      long initialTimeProgress = scannerContext.getTimeProgress();<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      // The loop here is used only when at some point during the next we determine<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      // that due to effects of filters or otherwise, we have an empty row in the result.<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>      // Then we loop and try again. Otherwise, we must get out on the first iteration via return,<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>      // "true" if there's more data to read, "false" if there isn't (storeHeap is at a stop row,<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>      // and joinedHeap has no more data to read for the last row (if set, joinedContinuationRow).<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>      while (true) {<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>        // Starting to scan a new row. Reset the scanner progress according to whether or not<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>        // progress should be kept.<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>        if (scannerContext.getKeepProgress()) {<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>          // Progress should be kept. Reset to initial values seen at start of method invocation.<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>          scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>            initialTimeProgress);<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        } else {<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>          scannerContext.clearProgress();<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        }<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>        if (rpcCall != null) {<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>          // If a user specifies a too-restrictive or too-slow scanner, the<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>          // client might time out and disconnect while the server side<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>          // is still processing the request. We should abort aggressively<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>          // in that case.<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>          long afterTime = rpcCall.disconnectSince();<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>          if (afterTime &gt;= 0) {<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>            throw new CallerDisconnectedException(<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>                "Aborting on region " + getRegionInfo().getRegionNameAsString() + ", call " +<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>                    this + " after " + afterTime + " ms, since " +<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>                    "caller disconnected");<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          }<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span><a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>        // Let's see what we have in the storeHeap.<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>        Cell current = this.storeHeap.peek();<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span><a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>        boolean stopRow = isStopRow(current);<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // When has filter row is true it means that the all the cells for a particular row must be<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        // read before a filtering decision can be made. This means that filters where hasFilterRow<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>        // run the risk of encountering out of memory errors in the case that they are applied to a<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>        // table that has very large rows.<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>        boolean hasFilterRow = this.filter != null &amp;&amp; this.filter.hasFilterRow();<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span><a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>        // If filter#hasFilterRow is true, partial results are not allowed since allowing them<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>        // would prevent the filters from being evaluated. Thus, if it is true, change the<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>        // scope of any limits that could potentially create partial results to<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>        // LimitScope.BETWEEN_ROWS so that those limits are not reached mid-row<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>        if (hasFilterRow) {<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>          if (LOG.isTraceEnabled()) {<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>            LOG.trace("filter#hasFilterRow is true which prevents partial results from being "<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>                + " formed. Changing scope of limits that may create partials");<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span>          }<a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>          scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>          scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>        }<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span><a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>        // Check if we were getting data from the joinedHeap and hit the limit.<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>        // If not, then it's main path - getting results from storeHeap.<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>        if (joinedContinuationRow == null) {<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>          // First, check if we are at a stop row. If so, there are no more results.<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>          if (stopRow) {<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>            if (hasFilterRow) {<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>              filter.filterRowCells(results);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>            }<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>          }<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span><a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>          // Check if rowkey filter wants to exclude this row. If so, loop to next.<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>          // Technically, if we hit limits before on this row, we don't need this call.<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>          if (filterRowKey(current)) {<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>            // Typically the count of rows scanned is incremented inside #populateResult. However,<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>            // here we are filtering a row based purely on its row key, preventing us from calling<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>            // #populateResult. Thus, perform the necessary increment here to rows scanned metric<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>            incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>            if (!moreRows) {<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>            }<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>            results.clear();<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>            continue;<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>          }<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span><a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>          // Ok, we are good, let's try to get some results from the main heap.<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>          populateResult(results, this.storeHeap, scannerContext, current);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>            if (hasFilterRow) {<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>              throw new IncompatibleFilterException(<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>                  "Filter whose hasFilterRow() returns true is incompatible with scans that must "<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>                      + " stop mid-row because of a limit. ScannerContext:" + scannerContext);<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>            }<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>            return true;<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>          }<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span><a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>          Cell nextKv = this.storeHeap.peek();<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>          stopRow = nextKv == null || isStopRow(nextKv);<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>          // save that the row was empty before filters applied to it.<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>          final boolean isEmptyRow = results.isEmpty();<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span><a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>          // We have the part of the row necessary for filtering (all of it, usually).<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>          // First filter with the filterRow(List).<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>          FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>          if (hasFilterRow) {<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>            ret = filter.filterRowCellsWithRet(results);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span><a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>            // We don't know how the results have changed after being filtered. Must set progress<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>            // according to contents of results now. However, a change in the results should not<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>            // affect the time progress. Thus preserve whatever time progress has been made<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>            long timeProgress = scannerContext.getTimeProgress();<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>            if (scannerContext.getKeepProgress()) {<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>              scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>                initialTimeProgress);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>            } else {<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>              scannerContext.clearProgress();<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>            }<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>            scannerContext.setTimeProgress(timeProgress);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>            scannerContext.incrementBatchProgress(results.size());<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>            for (Cell cell : results) {<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>              scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOf(cell));<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>            }<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>          }<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span><a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>          if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>            results.clear();<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>            if (!moreRows) {<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>            }<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>            // This row was totally filtered out, if this is NOT the last row,<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>            // we should continue on. Otherwise, nothing else to do.<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>            if (!stopRow) continue;<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>          }<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>          // Ok, we are done with storeHeap for this row.<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>          // Now we may need to fetch additional, non-essential data into row.<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>          // These values are not needed for filter to work, so we postpone their<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>          // fetch to (possibly) reduce amount of data loads from disk.<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>          if (this.joinedHeap != null) {<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>            boolean mayHaveData = joinedHeapMayHaveData(current);<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>            if (mayHaveData) {<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>              joinedContinuationRow = current;<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>              populateFromJoinedHeap(results, scannerContext);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span><a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>              if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>                return true;<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>              }<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>            }<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>          }<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>        } else {<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>          // Populating from the joined heap was stopped by limits, populate some more.<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>          populateFromJoinedHeap(results, scannerContext);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>            return true;<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>          }<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>        }<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>        // We may have just called populateFromJoinedMap and hit the limits. If that is<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>        // the case, we need to call it again on the next next() invocation.<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span>        if (joinedContinuationRow != null) {<a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>        }<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span><a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>        // Finally, we are done with both joinedHeap and storeHeap.<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>        // Double check to prevent empty rows from appearing in result. It could be<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>        // the case when SingleColumnValueExcludeFilter is used.<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>        if (results.isEmpty()) {<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>          incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>          boolean moreRows = nextRow(scannerContext, current);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>          if (!moreRows) {<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>          }<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>          if (!stopRow) continue;<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>        }<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>        if (stopRow) {<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>        } else {<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>        }<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      }<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    }<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span><a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    protected void incrementCountOfRowsFilteredMetric(ScannerContext scannerContext) {<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span><a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      scannerContext.getMetrics().countOfRowsFiltered.incrementAndGet();<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    }<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span><a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    protected void incrementCountOfRowsScannedMetric(ScannerContext scannerContext) {<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span><a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      scannerContext.getMetrics().countOfRowsScanned.incrementAndGet();<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    }<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span><a

<TRUNCATED>

[51/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
Published site at 18eff3c1c337003b2a419490e621f931d16936fb.


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

Branch: refs/heads/asf-site
Commit: a8725a4608da1ac52c7b9d6b4d4ff181d1b2348a
Parents: 3267288
Author: jenkins <bu...@apache.org>
Authored: Fri Feb 5 00:43:13 2016 +0000
Committer: Misty Stanley-Jones <ms...@cloudera.com>
Committed: Thu Feb 4 20:31:19 2016 -0800

----------------------------------------------------------------------
 acid-semantics.html                             |     6 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 apache_hbase_reference_guide.pdfmarks           |     4 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     6 +-
 checkstyle-aggregate.html                       | 20862 ++++++++---------
 checkstyle.rss                                  |    30 +-
 coc.html                                        |     6 +-
 cygwin.html                                     |     6 +-
 dependencies.html                               |     6 +-
 dependency-convergence.html                     |     6 +-
 dependency-info.html                            |     6 +-
 dependency-management.html                      |     6 +-
 devapidocs/allclasses-frame.html                |     1 +
 devapidocs/allclasses-noframe.html              |     1 +
 devapidocs/constant-values.html                 |    19 +
 devapidocs/index-all.html                       |    37 +-
 .../hadoop/hbase/class-use/CellScanner.html     |     6 +-
 .../class-use/InterfaceAudience.Private.html    |    32 +-
 .../hbase/classification/package-tree.html      |     6 +-
 .../hadoop/hbase/client/ScannerCallable.html    |    38 +-
 .../hadoop/hbase/client/package-tree.html       |     6 +-
 .../hadoop/hbase/codec/class-use/Codec.html     |     6 +-
 .../hadoop/hbase/executor/package-tree.html     |     2 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/ByteArrayOutputStream.html  |     4 +-
 .../hadoop/hbase/io/ByteBufferInputStream.html  |   390 +
 .../hadoop/hbase/io/ByteBufferOutputStream.html |     4 +-
 .../io/class-use/ByteBufferInputStream.html     |   115 +
 .../hadoop/hbase/io/hfile/package-tree.html     |     4 +-
 .../apache/hadoop/hbase/io/package-frame.html   |     1 +
 .../apache/hadoop/hbase/io/package-summary.html |    34 +-
 .../apache/hadoop/hbase/io/package-tree.html    |     1 +
 .../ipc/AsyncRpcChannel.CallWriteListener.html  |    10 +-
 .../hadoop/hbase/ipc/AsyncRpcChannel.html       |     8 +-
 .../DelegatingPayloadCarryingRpcController.html |     7 +
 .../org/apache/hadoop/hbase/ipc/IPCUtil.html    |    27 +-
 .../hbase/ipc/PayloadCarryingRpcController.html |    26 +-
 .../hbase/ipc/RpcClientImpl.Connection.html     |    12 +-
 .../apache/hadoop/hbase/ipc/RpcClientImpl.html  |    16 +-
 .../RpcServer.BlockingServiceAndInterface.html  |    12 +-
 .../apache/hadoop/hbase/ipc/RpcServer.Call.html |   152 +-
 .../hadoop/hbase/ipc/RpcServer.Connection.html  |   148 +-
 .../hbase/ipc/RpcServer.Listener.Reader.html    |    18 +-
 .../hadoop/hbase/ipc/RpcServer.Listener.html    |    38 +-
 .../hadoop/hbase/ipc/RpcServer.Responder.html   |    26 +-
 .../org/apache/hadoop/hbase/ipc/RpcServer.html  |   186 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     2 +-
 ...talogJanitor.SplitParentFirstComparator.html |     8 +-
 .../hadoop/hbase/master/CatalogJanitor.html     |    18 +-
 .../balancer/BaseLoadBalancer.Cluster.html      |    14 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |    78 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     4 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |     8 +-
 .../hadoop/hbase/quotas/package-tree.html       |     4 +-
 .../AnnotationReadingPriorityFunction.html      |    34 +-
 .../regionserver/HRegion.RegionScannerImpl.html |    92 +-
 .../regionserver/HRegion.RowLockContext.html    |    24 +-
 .../hbase/regionserver/HRegion.RowLockImpl.html |    16 +-
 .../hadoop/hbase/regionserver/HRegion.html      |   188 +-
 .../hbase/regionserver/RSRpcServices.html       |    76 +-
 .../hadoop/hbase/regionserver/package-tree.html |    22 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../tmpl/master/MasterStatusTmpl.ImplData.html  |   240 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |    96 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    48 +-
 .../regionserver/RSStatusTmpl.ImplData.html     |   120 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |    48 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    24 +-
 .../org/apache/hadoop/hbase/util/Threads.html   |     4 +-
 .../apache/hadoop/hbase/util/package-tree.html  |    10 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 devapidocs/overview-tree.html                   |     1 +
 .../hadoop/hbase/client/ScannerCallable.html    |   570 +-
 .../hadoop/hbase/io/ByteBufferInputStream.html  |   179 +
 .../ipc/AsyncRpcChannel.CallWriteListener.html  |   181 +-
 .../hadoop/hbase/ipc/AsyncRpcChannel.html       |   181 +-
 .../IPCUtil.CellScannerButNoCodecException.html |   288 +-
 .../org/apache/hadoop/hbase/ipc/IPCUtil.html    |   288 +-
 .../hbase/ipc/PayloadCarryingRpcController.html |    91 +-
 .../hbase/ipc/RpcClientImpl.CallFuture.html     |   836 +-
 .../RpcClientImpl.Connection.CallSender.html    |   836 +-
 .../hbase/ipc/RpcClientImpl.Connection.html     |   836 +-
 .../apache/hadoop/hbase/ipc/RpcClientImpl.html  |   836 +-
 .../RpcServer.BlockingServiceAndInterface.html  |  4981 ++--
 .../apache/hadoop/hbase/ipc/RpcServer.Call.html |  4981 ++--
 .../hadoop/hbase/ipc/RpcServer.Connection.html  |  4981 ++--
 .../hbase/ipc/RpcServer.Listener.Reader.html    |  4981 ++--
 .../hadoop/hbase/ipc/RpcServer.Listener.html    |  4981 ++--
 .../hadoop/hbase/ipc/RpcServer.Responder.html   |  4981 ++--
 .../org/apache/hadoop/hbase/ipc/RpcServer.html  |  4981 ++--
 ...talogJanitor.SplitParentFirstComparator.html |   668 +-
 .../hadoop/hbase/master/CatalogJanitor.html     |   668 +-
 .../BaseLoadBalancer.Cluster.Action.Type.html   |  1440 +-
 .../BaseLoadBalancer.Cluster.Action.html        |  1440 +-
 ...LoadBalancer.Cluster.AssignRegionAction.html |  1440 +-
 ...seLoadBalancer.Cluster.MoveRegionAction.html |  1440 +-
 ...eLoadBalancer.Cluster.SwapRegionsAction.html |  1440 +-
 .../balancer/BaseLoadBalancer.Cluster.html      |  1440 +-
 .../BaseLoadBalancer.DefaultRackManager.html    |  1440 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |  1440 +-
 .../AnnotationReadingPriorityFunction.html      |   527 +-
 .../HRegion.BatchOperationInProgress.html       |  6074 ++---
 .../regionserver/HRegion.FlushResultImpl.html   |  6074 ++---
 .../regionserver/HRegion.MutationBatch.html     |  6074 ++---
 .../HRegion.PrepareFlushResult.html             |  6074 ++---
 .../regionserver/HRegion.RegionScannerImpl.html |  6074 ++---
 .../hbase/regionserver/HRegion.ReplayBatch.html |  6074 ++---
 .../regionserver/HRegion.RowLockContext.html    |  6074 ++---
 .../hbase/regionserver/HRegion.RowLockImpl.html |  6074 ++---
 .../hbase/regionserver/HRegion.WriteState.html  |  6074 ++---
 .../hadoop/hbase/regionserver/HRegion.html      |  6074 ++---
 ...SRpcServices.RegionScannerCloseCallBack.html |  3377 +--
 .../RSRpcServices.RegionScannerHolder.html      |  3377 +--
 ...pcServices.RegionScannerShippedCallBack.html |  3377 +--
 ...RpcServices.RegionScannersCloseCallBack.html |  3377 +--
 .../RSRpcServices.ScannerListener.html          |  3377 +--
 .../hbase/regionserver/RSRpcServices.html       |  3377 +--
 .../tmpl/master/MasterStatusTmpl.ImplData.html  |   240 +-
 .../tmpl/master/MasterStatusTmpl.Intf.html      |   240 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |   240 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    68 +-
 .../regionserver/RSStatusTmpl.ImplData.html     |   120 +-
 .../tmpl/regionserver/RSStatusTmpl.Intf.html    |   120 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |   120 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    36 +-
 .../util/Threads.PrintThreadInfoHelper.html     |     2 +-
 .../util/Threads.PrintThreadInfoLazyHolder.html |     2 +-
 .../org/apache/hadoop/hbase/util/Threads.html   |     2 +-
 .../hbase/zookeeper/ZooKeeperWatcher.html       |     6 +-
 distribution-management.html                    |     6 +-
 export_control.html                             |     6 +-
 hbase-annotations/checkstyle.html               |     6 +-
 hbase-annotations/dependencies.html             |     6 +-
 hbase-annotations/dependency-convergence.html   |     6 +-
 hbase-annotations/dependency-info.html          |     6 +-
 hbase-annotations/dependency-management.html    |     6 +-
 hbase-annotations/distribution-management.html  |     6 +-
 hbase-annotations/index.html                    |     6 +-
 hbase-annotations/integration.html              |     6 +-
 hbase-annotations/issue-tracking.html           |     6 +-
 hbase-annotations/license.html                  |     6 +-
 hbase-annotations/mail-lists.html               |     6 +-
 hbase-annotations/plugin-management.html        |     6 +-
 hbase-annotations/plugins.html                  |     6 +-
 hbase-annotations/project-info.html             |     6 +-
 hbase-annotations/project-reports.html          |     6 +-
 hbase-annotations/project-summary.html          |     6 +-
 hbase-annotations/source-repository.html        |     6 +-
 hbase-annotations/team-list.html                |     6 +-
 hbase-spark/checkstyle.html                     |     6 +-
 hbase-spark/dependencies.html                   |     6 +-
 hbase-spark/dependency-convergence.html         |     6 +-
 hbase-spark/dependency-info.html                |     6 +-
 hbase-spark/dependency-management.html          |     6 +-
 hbase-spark/distribution-management.html        |     6 +-
 hbase-spark/index.html                          |     6 +-
 hbase-spark/integration.html                    |     6 +-
 hbase-spark/issue-tracking.html                 |     6 +-
 hbase-spark/license.html                        |     6 +-
 hbase-spark/mail-lists.html                     |     6 +-
 hbase-spark/plugin-management.html              |     6 +-
 hbase-spark/plugins.html                        |     6 +-
 hbase-spark/project-info.html                   |     6 +-
 hbase-spark/project-reports.html                |     6 +-
 hbase-spark/project-summary.html                |     6 +-
 hbase-spark/source-repository.html              |     6 +-
 hbase-spark/team-list.html                      |     6 +-
 index.html                                      |     6 +-
 integration.html                                |     6 +-
 issue-tracking.html                             |     6 +-
 license.html                                    |     6 +-
 mail-lists.html                                 |     6 +-
 metrics.html                                    |     6 +-
 modules.html                                    |     6 +-
 old_news.html                                   |     6 +-
 plugin-management.html                          |     6 +-
 plugins.html                                    |     6 +-
 poweredbyhbase.html                             |     6 +-
 project-info.html                               |     6 +-
 project-reports.html                            |     6 +-
 project-summary.html                            |     6 +-
 pseudo-distributed.html                         |     6 +-
 replication.html                                |     6 +-
 resources.html                                  |     6 +-
 source-repository.html                          |     6 +-
 sponsors.html                                   |     6 +-
 supportingprojects.html                         |     6 +-
 team-list.html                                  |     6 +-
 ...ControllerFactory.CountingRpcController.html |     7 +
 .../org/apache/hadoop/hbase/package-tree.html   |    10 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../hadoop/hbase/regionserver/package-tree.html |     4 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     4 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../TestClientScanner.MockClientScanner.html    |     2 +-
 ...entScanner.MockRpcRetryingCallerFactory.html |     2 +-
 .../hadoop/hbase/client/TestClientScanner.html  |     2 +-
 .../apache/hadoop/hbase/ipc/TestIPCUtil.html    |     4 +-
 .../hadoop/hbase/client/TestClientScanner.html  |     2 +-
 .../apache/hadoop/hbase/ipc/TestIPCUtil.html    |     4 +-
 xref/allclasses-frame.html                      |     3 +
 .../hadoop/hbase/client/ScannerCallable.html    |   570 +-
 .../hadoop/hbase/io/ByteBufferInputStream.html  |   121 +
 .../apache/hadoop/hbase/io/package-frame.html   |     3 +
 .../apache/hadoop/hbase/io/package-summary.html |     5 +
 .../hadoop/hbase/ipc/AsyncRpcChannel.html       |   181 +-
 xref/org/apache/hadoop/hbase/ipc/IPCUtil.html   |   288 +-
 .../hbase/ipc/PayloadCarryingRpcController.html |    91 +-
 .../apache/hadoop/hbase/ipc/RpcClientImpl.html  |   836 +-
 xref/org/apache/hadoop/hbase/ipc/RpcServer.html |  4981 ++--
 .../hadoop/hbase/master/CatalogJanitor.html     |   668 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |  1440 +-
 .../hadoop/hbase/protobuf/ProtobufUtil.html     |   181 +-
 .../AnnotationReadingPriorityFunction.html      |   527 +-
 .../hadoop/hbase/regionserver/HRegion.html      |  6074 ++---
 .../hbase/regionserver/RSRpcServices.html       |  3377 +--
 .../hbase/tmpl/common/TaskMonitorTmpl.html      |    60 +-
 .../hbase/tmpl/common/TaskMonitorTmplImpl.html  |    16 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |   240 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    68 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |   120 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    36 +-
 xref/org/apache/hadoop/hbase/util/Threads.html  |     2 +-
 .../hbase/zookeeper/ZooKeeperWatcher.html       |     6 +-
 228 files changed, 90427 insertions(+), 88978 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 390d720..25e098b 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160204" />
+    <meta name="Date-Revision-yyyymmdd" content="20160205" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -245,7 +245,7 @@
           <div id="banner">
         <div class="pull-left">
                                     <a href="http://hbasecon.com/" id="bannerLeft">
-                                                                                                <img src="images/hbasecon2016-stack-logo.jpg"  alt="hbasecon2016"/>
+                                                                                                <img src="images/hbasecon2016-stacked.png"  alt="hbasecon2016"/>
                 </a>
                       </div>
         <div class="pull-right">                                <a href="./" id="bannerRight">
@@ -600,7 +600,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 84a6f3e..1569dea 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.6, based on Prawn 1.2.1)
 /Producer (Apache HBase Team)
-/CreationDate (D:20160204152347+00'00')
-/ModDate (D:20160204152347+00'00')
+/CreationDate (D:20160205003752+00'00')
+/ModDate (D:20160205003752+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/apache_hbase_reference_guide.pdfmarks
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdfmarks b/apache_hbase_reference_guide.pdfmarks
index ee18431..757bdb8 100644
--- a/apache_hbase_reference_guide.pdfmarks
+++ b/apache_hbase_reference_guide.pdfmarks
@@ -2,8 +2,8 @@
   /Author (Apache HBase Team)
   /Subject ()
   /Keywords ()
-  /ModDate (D:20160204152540)
-  /CreationDate (D:20160204152540)
+  /ModDate (D:20160205003943)
+  /CreationDate (D:20160205003943)
   /Creator (Asciidoctor PDF 1.5.0.alpha.6, based on Prawn 1.2.1)
   /Producer ()
   /DOCINFO pdfmark

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 466f4c4..9c89d94 100644
--- a/book.html
+++ b/book.html
@@ -33059,7 +33059,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 2.0.0-SNAPSHOT<br>
-Last updated 2016-02-04 14:53:26 UTC
+Last updated 2016-02-05 00:10:35 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index e73273d..b916787 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160204" />
+    <meta name="Date-Revision-yyyymmdd" content="20160205" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -245,7 +245,7 @@
           <div id="banner">
         <div class="pull-left">
                                     <a href="http://hbasecon.com/" id="bannerLeft">
-                                                                                                <img src="images/hbasecon2016-stack-logo.jpg"  alt="hbasecon2016"/>
+                                                                                                <img src="images/hbasecon2016-stacked.png"  alt="hbasecon2016"/>
                 </a>
                       </div>
         <div class="pull-right">                                <a href="./" id="bannerRight">
@@ -305,7 +305,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-05</li>
             </p>
                 </div>
 


[36/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.CallSender.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.CallSender.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.CallSender.html
index b59d17d..caf98ca 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.CallSender.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.CallSender.html
@@ -907,428 +907,430 @@
 <span class="sourceLineNo">899</span>        cellBlockBuilder.setLength(cellBlock.limit());<a name="line.899"></a>
 <span class="sourceLineNo">900</span>        builder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.900"></a>
 <span class="sourceLineNo">901</span>      }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      // Only pass priority if there one.  Let zero be same as no priority.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      if (priority != 0) builder.setPriority(priority);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      RequestHeader header = builder.build();<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>      setupIOstreams();<a name="line.906"></a>
+<span class="sourceLineNo">902</span>      // Only pass priority if there is one set.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>      if (priority != PayloadCarryingRpcController.PRIORITY_UNSET) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        builder.setPriority(priority);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      RequestHeader header = builder.build();<a name="line.906"></a>
 <span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // Now we're going to write the call. We take the lock, then check that the connection<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      //  is still valid, and, if so we do the write to the socket. If the write fails, we don't<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      //  know where we stand, we have to close the connection.<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      checkIsOpen();<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      IOException writeException = null;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      synchronized (this.outLock) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>        if (Thread.interrupted()) throw new InterruptedIOException();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>        calls.put(call.id, call); // We put first as we don't want the connection to become idle.<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        checkIsOpen(); // Now we're checking that it didn't became idle in between.<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>        try {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>          call.callStats.setRequestSizeBytes(IPCUtil.write(this.out, header, call.param,<a name="line.920"></a>
-<span class="sourceLineNo">921</span>              cellBlock));<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        } catch (IOException e) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          // We set the value inside the synchronized block, this way the next in line<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          //  won't even try to write. Otherwise we might miss a call in the calls map?<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          shouldCloseConnection.set(true);<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          writeException = e;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          interrupt();<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        }<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // call close outside of the synchronized (outLock) to prevent deadlock - HBASE-14474<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (writeException != null) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        markClosed(writeException);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        close();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>      // We added a call, and may be started the connection close. In both cases, we<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      //  need to notify the reader.<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      doNotify();<a name="line.939"></a>
-<span class="sourceLineNo">940</span><a name="line.940"></a>
-<span class="sourceLineNo">941</span>      // Now that we notified, we can rethrow the exception if any. Otherwise we're good.<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      if (writeException != null) throw writeException;<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    }<a name="line.943"></a>
-<span class="sourceLineNo">944</span><a name="line.944"></a>
-<span class="sourceLineNo">945</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NN_NAKED_NOTIFY",<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        justification="Presume notifyAll is because we are closing/shutting down")<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    private synchronized void doNotify() {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      // Make a separate method so can do synchronize and add findbugs annotation; only one<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      // annotation at at time in source 1.7.<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      notifyAll(); // Findbugs: NN_NAKED_NOTIFY<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>    /* Receive a response.<a name="line.953"></a>
-<span class="sourceLineNo">954</span>     * Because only one receiver, so no synchronization on in.<a name="line.954"></a>
-<span class="sourceLineNo">955</span>     */<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    protected void readResponse() {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      if (shouldCloseConnection.get()) return;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      Call call = null;<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      boolean expectedCall = false;<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      try {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>        // See HBaseServer.Call.setResponse for where we write out the response.<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        // Total size of the response.  Unused.  But have to read it in anyways.<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        int totalSize = in.readInt();<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>        // Read the header<a name="line.965"></a>
-<span class="sourceLineNo">966</span>        ResponseHeader responseHeader = ResponseHeader.parseDelimitedFrom(in);<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        int id = responseHeader.getCallId();<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        call = calls.remove(id); // call.done have to be set before leaving this method<a name="line.968"></a>
-<span class="sourceLineNo">969</span>        expectedCall = (call != null &amp;&amp; !call.done);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        if (!expectedCall) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>          // So we got a response for which we have no corresponding 'call' here on the client-side.<a name="line.971"></a>
-<span class="sourceLineNo">972</span>          // We probably timed out waiting, cleaned up all references, and now the server decides<a name="line.972"></a>
-<span class="sourceLineNo">973</span>          // to return a response.  There is nothing we can do w/ the response at this stage. Clean<a name="line.973"></a>
-<span class="sourceLineNo">974</span>          // out the wire of the response so its out of the way and we can get other responses on<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          // this connection.<a name="line.975"></a>
-<span class="sourceLineNo">976</span>          int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>          int whatIsLeftToRead = totalSize - readSoFar;<a name="line.977"></a>
-<span class="sourceLineNo">978</span>          IOUtils.skipFully(in, whatIsLeftToRead);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>          if (call != null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            call.callStats.setResponseSizeBytes(totalSize);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>            call.callStats.setCallTimeMs(<a name="line.981"></a>
-<span class="sourceLineNo">982</span>                EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.982"></a>
-<span class="sourceLineNo">983</span>          }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>          return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        if (responseHeader.hasException()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>          ExceptionResponse exceptionResponse = responseHeader.getException();<a name="line.987"></a>
-<span class="sourceLineNo">988</span>          RemoteException re = createRemoteException(exceptionResponse);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          call.setException(re);<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.990"></a>
-<span class="sourceLineNo">991</span>          call.callStats.setCallTimeMs(<a name="line.991"></a>
-<span class="sourceLineNo">992</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          if (isFatalConnectionException(exceptionResponse)) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>            markClosed(re);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>          }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        } else {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>          Message value = null;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          if (call.responseDefaultType != null) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>            Builder builder = call.responseDefaultType.newBuilderForType();<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            ProtobufUtil.mergeDelimitedFrom(builder, in);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>            value = builder.build();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          }<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          CellScanner cellBlockScanner = null;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          if (responseHeader.hasCellBlockMeta()) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            int size = responseHeader.getCellBlockMeta().getLength();<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            byte [] cellBlock = new byte[size];<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            IOUtils.readFully(this.in, cellBlock, 0, cellBlock.length);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>            cellBlockScanner = ipcUtil.createCellScanner(this.codec, this.compressor, cellBlock);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>          call.setResponse(value, cellBlockScanner);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>          call.callStats.setCallTimeMs(<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      } catch (IOException e) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        if (expectedCall) call.setException(e);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        if (e instanceof SocketTimeoutException) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          // Clean up open calls but don't treat this as a fatal condition,<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          // since we expect certain responses to not make it by the specified<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          // {@link ConnectionId#rpcTimeout}.<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          if (LOG.isTraceEnabled()) LOG.trace("ignored", e);<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        } else {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>          // Treat this as a fatal condition and close this connection<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>          markClosed(e);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>        }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      } finally {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        cleanupCalls(false);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    }<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    /**<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * @return True if the exception is a fatal connection exception.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     */<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    private boolean isFatalConnectionException(final ExceptionResponse e) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      return e.getExceptionClassName().<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        equals(FatalConnectionException.class.getName());<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    /**<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>     * @param e exception to be wrapped<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>     * @return RemoteException made from passed &lt;code&gt;e&lt;/code&gt;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>     */<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    private RemoteException createRemoteException(final ExceptionResponse e) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      String innerExceptionClassName = e.getExceptionClassName();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      boolean doNotRetry = e.getDoNotRetry();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      return e.hasHostname()?<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        // If a hostname then add it to the RemoteWithExtrasException<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          e.getStackTrace(), e.getHostname(), e.getPort(), doNotRetry):<a name="line.1049"></a>
+<span class="sourceLineNo">908</span>      setupIOstreams();<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>      // Now we're going to write the call. We take the lock, then check that the connection<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      //  is still valid, and, if so we do the write to the socket. If the write fails, we don't<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      //  know where we stand, we have to close the connection.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      checkIsOpen();<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      IOException writeException = null;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      synchronized (this.outLock) {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        if (Thread.interrupted()) throw new InterruptedIOException();<a name="line.916"></a>
+<span class="sourceLineNo">917</span><a name="line.917"></a>
+<span class="sourceLineNo">918</span>        calls.put(call.id, call); // We put first as we don't want the connection to become idle.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>        checkIsOpen(); // Now we're checking that it didn't became idle in between.<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>        try {<a name="line.921"></a>
+<span class="sourceLineNo">922</span>          call.callStats.setRequestSizeBytes(IPCUtil.write(this.out, header, call.param,<a name="line.922"></a>
+<span class="sourceLineNo">923</span>              cellBlock));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        } catch (IOException e) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          // We set the value inside the synchronized block, this way the next in line<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          //  won't even try to write. Otherwise we might miss a call in the calls map?<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          shouldCloseConnection.set(true);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          writeException = e;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          interrupt();<a name="line.929"></a>
+<span class="sourceLineNo">930</span>        }<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      // call close outside of the synchronized (outLock) to prevent deadlock - HBASE-14474<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (writeException != null) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        markClosed(writeException);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        close();<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
+<span class="sourceLineNo">938</span><a name="line.938"></a>
+<span class="sourceLineNo">939</span>      // We added a call, and may be started the connection close. In both cases, we<a name="line.939"></a>
+<span class="sourceLineNo">940</span>      //  need to notify the reader.<a name="line.940"></a>
+<span class="sourceLineNo">941</span>      doNotify();<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>      // Now that we notified, we can rethrow the exception if any. Otherwise we're good.<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (writeException != null) throw writeException;<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NN_NAKED_NOTIFY",<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        justification="Presume notifyAll is because we are closing/shutting down")<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    private synchronized void doNotify() {<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // Make a separate method so can do synchronize and add findbugs annotation; only one<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      // annotation at at time in source 1.7.<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      notifyAll(); // Findbugs: NN_NAKED_NOTIFY<a name="line.952"></a>
+<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
+<span class="sourceLineNo">954</span><a name="line.954"></a>
+<span class="sourceLineNo">955</span>    /* Receive a response.<a name="line.955"></a>
+<span class="sourceLineNo">956</span>     * Because only one receiver, so no synchronization on in.<a name="line.956"></a>
+<span class="sourceLineNo">957</span>     */<a name="line.957"></a>
+<span class="sourceLineNo">958</span>    protected void readResponse() {<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      if (shouldCloseConnection.get()) return;<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      Call call = null;<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      boolean expectedCall = false;<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      try {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>        // See HBaseServer.Call.setResponse for where we write out the response.<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        // Total size of the response.  Unused.  But have to read it in anyways.<a name="line.964"></a>
+<span class="sourceLineNo">965</span>        int totalSize = in.readInt();<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>        // Read the header<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        ResponseHeader responseHeader = ResponseHeader.parseDelimitedFrom(in);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        int id = responseHeader.getCallId();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        call = calls.remove(id); // call.done have to be set before leaving this method<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        expectedCall = (call != null &amp;&amp; !call.done);<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        if (!expectedCall) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          // So we got a response for which we have no corresponding 'call' here on the client-side.<a name="line.973"></a>
+<span class="sourceLineNo">974</span>          // We probably timed out waiting, cleaned up all references, and now the server decides<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          // to return a response.  There is nothing we can do w/ the response at this stage. Clean<a name="line.975"></a>
+<span class="sourceLineNo">976</span>          // out the wire of the response so its out of the way and we can get other responses on<a name="line.976"></a>
+<span class="sourceLineNo">977</span>          // this connection.<a name="line.977"></a>
+<span class="sourceLineNo">978</span>          int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.978"></a>
+<span class="sourceLineNo">979</span>          int whatIsLeftToRead = totalSize - readSoFar;<a name="line.979"></a>
+<span class="sourceLineNo">980</span>          IOUtils.skipFully(in, whatIsLeftToRead);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>          if (call != null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>            call.callStats.setResponseSizeBytes(totalSize);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>            call.callStats.setCallTimeMs(<a name="line.983"></a>
+<span class="sourceLineNo">984</span>                EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.984"></a>
+<span class="sourceLineNo">985</span>          }<a name="line.985"></a>
+<span class="sourceLineNo">986</span>          return;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (responseHeader.hasException()) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          ExceptionResponse exceptionResponse = responseHeader.getException();<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          RemoteException re = createRemoteException(exceptionResponse);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          call.setException(re);<a name="line.991"></a>
+<span class="sourceLineNo">992</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>          call.callStats.setCallTimeMs(<a name="line.993"></a>
+<span class="sourceLineNo">994</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.994"></a>
+<span class="sourceLineNo">995</span>          if (isFatalConnectionException(exceptionResponse)) {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>            markClosed(re);<a name="line.996"></a>
+<span class="sourceLineNo">997</span>          }<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        } else {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>          Message value = null;<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>          if (call.responseDefaultType != null) {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>            Builder builder = call.responseDefaultType.newBuilderForType();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>            ProtobufUtil.mergeDelimitedFrom(builder, in);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>            value = builder.build();<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          }<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>          CellScanner cellBlockScanner = null;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          if (responseHeader.hasCellBlockMeta()) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>            int size = responseHeader.getCellBlockMeta().getLength();<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>            byte [] cellBlock = new byte[size];<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>            IOUtils.readFully(this.in, cellBlock, 0, cellBlock.length);<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>            cellBlockScanner = ipcUtil.createCellScanner(this.codec, this.compressor, cellBlock);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>          call.setResponse(value, cellBlockScanner);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>          call.callStats.setCallTimeMs(<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      } catch (IOException e) {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        if (expectedCall) call.setException(e);<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        if (e instanceof SocketTimeoutException) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>          // Clean up open calls but don't treat this as a fatal condition,<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>          // since we expect certain responses to not make it by the specified<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>          // {@link ConnectionId#rpcTimeout}.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>          if (LOG.isTraceEnabled()) LOG.trace("ignored", e);<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>        } else {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>          // Treat this as a fatal condition and close this connection<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>          markClosed(e);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      } finally {<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>        cleanupCalls(false);<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span><a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    /**<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>     * @return True if the exception is a fatal connection exception.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>     */<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    private boolean isFatalConnectionException(final ExceptionResponse e) {<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>      return e.getExceptionClassName().<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        equals(FatalConnectionException.class.getName());<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span><a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    /**<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>     * @param e exception to be wrapped<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>     * @return RemoteException made from passed &lt;code&gt;e&lt;/code&gt;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>     */<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    private RemoteException createRemoteException(final ExceptionResponse e) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      String innerExceptionClassName = e.getExceptionClassName();<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>      boolean doNotRetry = e.getDoNotRetry();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>      return e.hasHostname()?<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>        // If a hostname then add it to the RemoteWithExtrasException<a name="line.1049"></a>
 <span class="sourceLineNo">1050</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          e.getStackTrace(), doNotRetry);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    protected synchronized boolean markClosed(IOException e) {<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>      if (e == null) throw new NullPointerException();<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      boolean ret = shouldCloseConnection.compareAndSet(false, true);<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      if (ret) {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        if (LOG.isTraceEnabled()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          LOG.trace(getName() + ": marking at should close, reason: " + e.getMessage());<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>        }<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (callSender != null) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          callSender.close();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        }<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        notifyAll();<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      return ret;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    /**<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>     * Cleanup the calls older than a given timeout, in milli seconds.<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>     * @param allCalls true for all calls, false for only the calls in timeout<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     */<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    protected synchronized void cleanupCalls(boolean allCalls) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      Iterator&lt;Entry&lt;Integer, Call&gt;&gt; itor = calls.entrySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      while (itor.hasNext()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        Call c = itor.next().getValue();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        if (c.done) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>          // To catch the calls without timeout that were cancelled.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>          itor.remove();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        } else if (allCalls) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>          long waitTime = EnvironmentEdgeManager.currentTime() - c.getStartTime();<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          IOException ie = new ConnectionClosingException("Connection to " + getRemoteAddress()<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>              + " is closing. Call id=" + c.id + ", waitTime=" + waitTime);<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          c.setException(ie);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          itor.remove();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        } else if (c.checkAndSetTimeout()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1051</span>          e.getStackTrace(), e.getHostname(), e.getPort(), doNotRetry):<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          e.getStackTrace(), doNotRetry);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    protected synchronized boolean markClosed(IOException e) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      if (e == null) throw new NullPointerException();<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span><a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      boolean ret = shouldCloseConnection.compareAndSet(false, true);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>      if (ret) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>        if (LOG.isTraceEnabled()) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          LOG.trace(getName() + ": marking at should close, reason: " + e.getMessage());<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>        if (callSender != null) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>          callSender.close();<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        notifyAll();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>      return ret;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span><a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>     * Cleanup the calls older than a given timeout, in milli seconds.<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>     * @param allCalls true for all calls, false for only the calls in timeout<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>     */<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    protected synchronized void cleanupCalls(boolean allCalls) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      Iterator&lt;Entry&lt;Integer, Call&gt;&gt; itor = calls.entrySet().iterator();<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      while (itor.hasNext()) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>        Call c = itor.next().getValue();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        if (c.done) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>          // To catch the calls without timeout that were cancelled.<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          itor.remove();<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        } else if (allCalls) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          long waitTime = EnvironmentEdgeManager.currentTime() - c.getStartTime();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          IOException ie = new ConnectionClosingException("Connection to " + getRemoteAddress()<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>              + " is closing. Call id=" + c.id + ", waitTime=" + waitTime);<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>          c.setException(ie);<a name="line.1088"></a>
 <span class="sourceLineNo">1089</span>          itor.remove();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        } else {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>          // We expect the call to be ordered by timeout. It may not be the case, but stopping<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          //  at the first valid call allows to be sure that we still have something to do without<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>          //  spending too much time by reading the full list.<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          break;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span><a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>  /**<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>   * Used in test only. Construct an IPC cluster client whose values are of the<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>   * {@link Message} class.<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>   * @param conf configuration<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>   * @param clusterId the cluster id<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>   * @param factory socket factory<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   */<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @VisibleForTesting<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    this(conf, clusterId, factory, null, null);<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span><a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  /**<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>   * Construct an IPC cluster client whose values are of the {@link Message} class.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>   * @param conf configuration<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>   * @param clusterId the cluster id<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>   * @param factory socket factory<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>   * @param localAddr client socket bind address<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>   * @param metrics the connection metrics<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>   */<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory,<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      SocketAddress localAddr, MetricsConnection metrics) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    super(conf, clusterId, localAddr, metrics);<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    this.socketFactory = factory;<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    this.connections = new PoolMap&lt;ConnectionId, Connection&gt;(getPoolType(conf), getPoolSize(conf));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    this.failedServers = new FailedServers(conf);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  /**<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   * Used in test only. Construct an IPC client for the cluster {@code clusterId} with<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   * the default SocketFactory<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   */<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>  @VisibleForTesting<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  RpcClientImpl(Configuration conf, String clusterId) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), null, null);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span><a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  /**<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>   * Construct an IPC client for the cluster {@code clusterId} with the default SocketFactory<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   *<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * This method is called with reflection by the RpcClientFactory to create an instance<a name="line.1141"></a>
+<span class="sourceLineNo">1090</span>        } else if (c.checkAndSetTimeout()) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>          itor.remove();<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        } else {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          // We expect the call to be ordered by timeout. It may not be the case, but stopping<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>          //  at the first valid call allows to be sure that we still have something to do without<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          //  spending too much time by reading the full list.<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>          break;<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>        }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  }<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span><a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>  /**<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * Used in test only. Construct an IPC cluster client whose values are of the<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   * {@link Message} class.<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>   * @param conf configuration<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>   * @param clusterId the cluster id<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>   * @param factory socket factory<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  @VisibleForTesting<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    this(conf, clusterId, factory, null, null);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  /**<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>   * Construct an IPC cluster client whose values are of the {@link Message} class.<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>   * @param conf configuration<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>   * @param clusterId the cluster id<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>   * @param factory socket factory<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>   * @param localAddr client socket bind address<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>   * @param metrics the connection metrics<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>   */<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory,<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      SocketAddress localAddr, MetricsConnection metrics) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    super(conf, clusterId, localAddr, metrics);<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    this.socketFactory = factory;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    this.connections = new PoolMap&lt;ConnectionId, Connection&gt;(getPoolType(conf), getPoolSize(conf));<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    this.failedServers = new FailedServers(conf);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  /**<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   * Used in test only. Construct an IPC client for the cluster {@code clusterId} with<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   * the default SocketFactory<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   */<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>  @VisibleForTesting<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>  RpcClientImpl(Configuration conf, String clusterId) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), null, null);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  /**<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>   * Construct an IPC client for the cluster {@code clusterId} with the default SocketFactory<a name="line.1141"></a>
 <span class="sourceLineNo">1142</span>   *<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>   * @param conf configuration<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * @param clusterId the cluster id<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * @param localAddr client socket bind address.<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @param metrics the connection metrics<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public RpcClientImpl(Configuration conf, String clusterId, SocketAddress localAddr,<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      MetricsConnection metrics) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), localAddr, metrics);<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  /** Stop all threads related to this client.  No further calls may be made<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   * using this client. */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void close() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (LOG.isDebugEnabled()) LOG.debug("Stopping rpc client");<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!running.compareAndSet(true, false)) return;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    Set&lt;Connection&gt; connsToClose = null;<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    // wake up all connections<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    synchronized (connections) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      for (Connection conn : connections.values()) {<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>        conn.interrupt();<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>        if (conn.callSender != null) {<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          conn.callSender.interrupt();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>        // In case the CallSender did not setupIOStreams() yet, the Connection may not be started<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        // at all (if CallSender has a cancelled Call it can happen). See HBASE-13851<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        if (!conn.isAlive()) {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          if (connsToClose == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>            connsToClose = new HashSet&lt;Connection&gt;();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          connsToClose.add(conn);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    if (connsToClose != null) {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (Connection conn : connsToClose) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        if (conn.markClosed(new InterruptedIOException("RpcClient is closing"))) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>          conn.close();<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>        }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    // wait until all connections are closed<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    while (!connections.isEmpty()) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      try {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>        Thread.sleep(10);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      } catch (InterruptedException e) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.info("Interrupted while stopping the client. We still have " + connections.size() +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            " connections.");<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Thread.currentThread().interrupt();<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        return;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /** Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * threw an exception.<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   *          {@link UserProvider#getCurrent()} makes a new instance of User each time so will be a<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   *          new Connection each time.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * @throws InterruptedException<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * @throws IOException<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   */<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  @Override<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  protected Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc, MethodDescriptor md,<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>      Message param, Message returnType, User ticket, InetSocketAddress addr,<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      MetricsConnection.CallStats callStats)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      throws IOException, InterruptedException {<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    if (pcrc == null) {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      pcrc = new PayloadCarryingRpcController();<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    CellScanner cells = pcrc.cellScanner();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span><a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    final Call call = new Call(this.callIdCnt.getAndIncrement(), md, param, cells, returnType,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        pcrc.getCallTimeout(), MetricsConnection.newCallStats());<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    final Connection connection = getConnection(ticket, call, addr);<a name="line.1224"></a>
+<span class="sourceLineNo">1143</span>   * This method is called with reflection by the RpcClientFactory to create an instance<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   *<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * @param conf configuration<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   * @param clusterId the cluster id<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * @param localAddr client socket bind address.<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * @param metrics the connection metrics<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  public RpcClientImpl(Configuration conf, String clusterId, SocketAddress localAddr,<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>      MetricsConnection metrics) {<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), localAddr, metrics);<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  }<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  /** Stop all threads related to this client.  No further calls may be made<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * using this client. */<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>  @Override<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  public void close() {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    if (LOG.isDebugEnabled()) LOG.debug("Stopping rpc client");<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!running.compareAndSet(true, false)) return;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span><a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    Set&lt;Connection&gt; connsToClose = null;<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    // wake up all connections<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    synchronized (connections) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      for (Connection conn : connections.values()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>        conn.interrupt();<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>        if (conn.callSender != null) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>          conn.callSender.interrupt();<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        // In case the CallSender did not setupIOStreams() yet, the Connection may not be started<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>        // at all (if CallSender has a cancelled Call it can happen). See HBASE-13851<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        if (!conn.isAlive()) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>          if (connsToClose == null) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>            connsToClose = new HashSet&lt;Connection&gt;();<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          }<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>          connsToClose.add(conn);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>      }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    if (connsToClose != null) {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      for (Connection conn : connsToClose) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>        if (conn.markClosed(new InterruptedIOException("RpcClient is closing"))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>          conn.close();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>        }<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    // wait until all connections are closed<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>    while (!connections.isEmpty()) {<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      try {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        Thread.sleep(10);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>      } catch (InterruptedException e) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        LOG.info("Interrupted while stopping the client. We still have " + connections.size() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>            " connections.");<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        Thread.currentThread().interrupt();<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>        return;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>  /** Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * threw an exception.<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   *          {@link UserProvider#getCurrent()} makes a new instance of User each time so will be a<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>   *          new Connection each time.<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   * @throws InterruptedException<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * @throws IOException<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   */<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>  @Override<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  protected Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc, MethodDescriptor md,<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      Message param, Message returnType, User ticket, InetSocketAddress addr,<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      MetricsConnection.CallStats callStats)<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      throws IOException, InterruptedException {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    if (pcrc == null) {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      pcrc = new PayloadCarryingRpcController();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>    }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    CellScanner cells = pcrc.cellScanner();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span><a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    final Call call = new Call(this.callIdCnt.getAndIncrement(), md, param, cells, returnType,<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        pcrc.getCallTimeout(), MetricsConnection.newCallStats());<a name="line.1224"></a>
 <span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final CallFuture cts;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    if (connection.callSender != null) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      cts = connection.callSender.sendCall(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>        pcrc.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>          @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>          public void run(Object parameter) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>            connection.callSender.remove(cts);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        });<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        if (pcrc.isCanceled()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          // To finish if the call was cancelled before we set the notification (race condition)<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          call.callComplete();<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>          return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>        }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    } else {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      cts = null;<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      connection.tracedWriteRequest(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    while (!call.done) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      if (call.checkAndSetTimeout()) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        break;<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      }<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (connection.shouldCloseConnection.get()) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        throw new ConnectionClosingException("Call id=" + call.id +<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>            " on server " + addr + " aborted: connection is closing");<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      try {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>        synchronized (call) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>          if (call.done) break;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>          call.wait(Math.min(call.remainingTime(), 1000) + 1);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      } catch (InterruptedException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>        call.setException(new InterruptedIOException());<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>        throw e;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    if (call.error != null) {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      if (call.error instanceof RemoteException) {<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        call.error.fillInStackTrace();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>        throw call.error;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      }<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      // local exception<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      throw wrapException(addr, call.error);<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    }<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span><a name="line.1277"></a>
-<span class="sourceLineNo">1278</span><a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>  /**<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * Interrupt the connections to the given ip:port server. This should be called if the server<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   *  is known as actually dead. This will not prevent current operation to be retried, and,<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   *  depending on their own behavior, they may retry on the same server. This can be a feature,<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   *  for example at startup. In any case, they're likely to get connection refused (if the<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *  process died) or no route to host: i.e. their next retries should be faster and with a<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   *  safe exception.<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  @Override<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  public void cancelConnections(ServerName sn) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    synchronized (connections) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      for (Connection connection : connections.values()) {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        if (connection.isAlive() &amp;&amp;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>            connection.getRemoteAddress().getPort() == sn.getPort() &amp;&amp;<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>            connection.getRemoteAddress().getHostName().equals(sn.getHostname())) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>          LOG.info("The server on " + sn.toString() +<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>              " is dead - stopping the connection " + connection.remoteId);<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>          connection.interrupt(); // We're interrupting a Reader. It means we want it to finish.<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>                                  // This will close the connection as well.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>        }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>  }<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span><a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>  /**<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>   *  Get a connection from the pool, or create a new one and add it to the<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>   * pool. Connections to a given host/port are reused.<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>   */<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  protected Connection getConnection(User ticket, Call call, InetSocketAddress addr)<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  throws IOException {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    if (!running.get()) throw new StoppedRpcClientException();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    Connection connection;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    ConnectionId remoteId =<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      new ConnectionId(ticket, call.md.getService().getName(), addr);<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    synchronized (connections) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      connection = connections.get(remoteId);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      if (connection == null) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        connection = createConnection(remoteId, this.codec, this.compressor);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>        connections.put(remoteId, connection);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    return connection;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>}<a name="line.1323"></a>
+<span class="sourceLineNo">1226</span>    final Connection connection = getConnection(ticket, call, addr);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    final CallFuture cts;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    if (connection.callSender != null) {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>      cts = connection.callSender.sendCall(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        pcrc.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          @Override<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          public void run(Object parameter) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            connection.callSender.remove(cts);<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>          }<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>        });<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>        if (pcrc.isCanceled()) {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          // To finish if the call was cancelled before we set the notification (race condition)<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          call.callComplete();<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    } else {<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>      cts = null;<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>      connection.tracedWriteRequest(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    }<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    while (!call.done) {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      if (call.checkAndSetTimeout()) {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>        break;<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      if (connection.shouldCloseConnection.get()) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        throw new ConnectionClosingException("Call id=" + call.id +<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>            " on server " + addr + " aborted: connection is closing");<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>      }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      try {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        synchronized (call) {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>          if (call.done) break;<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>          call.wait(Math.min(call.remainingTime(), 1000) + 1);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>        }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      } catch (InterruptedException e) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        call.setException(new InterruptedIOException());<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        throw e;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    if (call.error != null) {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      if (call.error instanceof RemoteException) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        call.error.fillInStackTrace();<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>        throw call.error;<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>      }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      // local exception<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      throw wrapException(addr, call.error);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span><a name="line.1279"></a>
+<span class="sourceLineNo">1280</span><a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  /**<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>   * Interrupt the connections to the given ip:port server. This should be called if the server<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   *  is known as actually dead. This will not prevent current operation to be retried, and,<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   *  depending on their own behavior, they may retry on the same server. This can be a feature,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   *  for example at startup. In any case, they're likely to get connection refused (if the<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   *  process died) or no route to host: i.e. their next retries should be faster and with a<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>   *  safe exception.<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>   */<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>  @Override<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  public void cancelConnections(ServerName sn) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    synchronized (connections) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      for (Connection connection : connections.values()) {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>        if (connection.isAlive() &amp;&amp;<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>            connection.getRemoteAddress().getPort() == sn.getPort() &amp;&amp;<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>            connection.getRemoteAddress().getHostName().equals(sn.getHostname())) {<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>          LOG.info("The server on " + sn.toString() +<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>              " is dead - stopping the connection " + connection.remoteId);<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>          connection.interrupt(); // We're interrupting a Reader. It means we want it to finish.<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>                                  // This will close the connection as well.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  /**<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   *  Get a connection from the pool, or create a new one and add it to the<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * pool. Connections to a given host/port are reused.<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   */<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  protected Connection getConnection(User ticket, Call call, InetSocketAddress addr)<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  throws IOException {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    if (!running.get()) throw new StoppedRpcClientException();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>    Connection connection;<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    ConnectionId remoteId =<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>      new ConnectionId(ticket, call.md.getService().getName(), addr);<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    synchronized (connections) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>      connection = connections.get(remoteId);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      if (connection == null) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>        connection = createConnection(remoteId, this.codec, this.compressor);<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>        connections.put(remoteId, connection);<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      }<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    }<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    return connection;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>  }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>}<a name="line.1325"></a>
 
 
 


[06/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
index e2c4389..d03724e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -5185,3056 +5185,3058 @@
 <span class="sourceLineNo">5177</span>   * @param readLock is the lock reader or writer. True indicates that a non-exlcusive<a name="line.5177"></a>
 <span class="sourceLineNo">5178</span>   *                 lock is requested<a name="line.5178"></a>
 <span class="sourceLineNo">5179</span>   */<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    // Make sure the row is inside of this region before getting the lock for it.<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    checkRow(row, "row lock");<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    // create an object to use a a key in the row lock map<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    HashedBytes rowKey = new HashedBytes(row);<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    RowLockContext rowLockContext = null;<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    RowLockImpl result = null;<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    TraceScope traceScope = null;<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span><a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    // If we're tracing start a span to show how long this took.<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>    if (Trace.isTracing()) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>      traceScope = Trace.startSpan("HRegion.getRowLock");<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>      traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock"));<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>    }<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span><a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    try {<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>      // Keep trying until we have a lock or error out.<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>      // TODO: do we need to add a time component here?<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>      while (result == null) {<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span><a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>        // Try adding a RowLockContext to the lockedRows.<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>        // If we can add it then there's no other transactions currently running.<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        rowLockContext = new RowLockContext(rowKey);<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span><a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>        // if there was a running transaction then there's already a context.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>        if (existingContext != null) {<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>          rowLockContext = existingContext;<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>        }<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span><a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>        // Now try an get the lock.<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>        //<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>        // This can fail as<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>        if (readLock) {<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>          result = rowLockContext.newReadLock();<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>        } else {<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>          result = rowLockContext.newWriteLock();<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>        }<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      }<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      if (!result.getLock().tryLock(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>        if (traceScope != null) {<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>          traceScope.getSpan().addTimelineAnnotation("Failed to get row lock");<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>        }<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>        result = null;<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>        // Clean up the counts just in case this was the thing keeping the context alive.<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        rowLockContext.cleanUp();<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        throw new IOException("Timed out waiting for lock for row: " + rowKey);<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>      }<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>      return result;<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>    } catch (InterruptedException ie) {<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>      LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>      iie.initCause(ie);<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>      if (traceScope != null) {<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>        traceScope.getSpan().addTimelineAnnotation("Interrupted exception getting row lock");<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>      }<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>      Thread.currentThread().interrupt();<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>      throw iie;<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    } finally {<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>      if (traceScope != null) {<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>        traceScope.close();<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>      }<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    }<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>  }<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span><a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>  @Override<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>  public void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>    if (rowLocks != null) {<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>      for (RowLock rowLock : rowLocks) {<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span>        rowLock.release();<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>      }<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>      rowLocks.clear();<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    }<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>  }<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span><a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>  @VisibleForTesting<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>  class RowLockContext {<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span>    private final HashedBytes row;<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    final AtomicBoolean usable = new AtomicBoolean(true);<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    final Object lock = new Object();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    RowLockContext(HashedBytes row) {<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>      this.row = row;<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    }<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span><a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    RowLockImpl newWriteLock() {<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>      Lock l = readWriteLock.writeLock();<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>      return getRowLock(l);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    }<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    RowLockImpl newReadLock() {<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>      Lock l = readWriteLock.readLock();<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>      return getRowLock(l);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    private RowLockImpl getRowLock(Lock l) {<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>      count.incrementAndGet();<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>      synchronized (lock) {<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        if (usable.get()) {<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>          return new RowLockImpl(this, l);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        } else {<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>          return null;<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        }<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>      }<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    }<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span><a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    void cleanUp() {<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>      long c = count.decrementAndGet();<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>      if (c &lt;= 0) {<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        synchronized (lock) {<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>          if (count.get() &lt;= 0 ){<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>            usable.set(false);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>            RowLockContext removed = lockedRows.remove(row);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>            assert removed == this: "we should never remove a different context";<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>          }<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        }<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>      }<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    }<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span><a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    @Override<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    public String toString() {<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>      return "RowLockContext{" +<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>          "row=" + row +<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>          ", readWriteLock=" + readWriteLock +<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>          ", count=" + count +<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>          '}';<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    }<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>  }<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span><a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>  /**<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>   * Class used to represent a lock on a row.<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>   */<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>  public static class RowLockImpl implements RowLock {<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    private final RowLockContext context;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    private final Lock lock;<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span><a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    public RowLockImpl(RowLockContext context, Lock lock) {<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>      this.context = context;<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>      this.lock = lock;<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    }<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span><a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    public Lock getLock() {<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>      return lock;<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    }<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span><a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    @VisibleForTesting<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>    public RowLockContext getContext() {<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      return context;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    }<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span><a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    @Override<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    public void release() {<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>      lock.unlock();<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>      context.cleanUp();<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>    }<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span><a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    @Override<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    public String toString() {<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>      return "RowLockImpl{" +<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>          "context=" + context +<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>          ", lock=" + lock +<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>          '}';<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>    }<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  }<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span><a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>  /**<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>   * Determines whether multiple column families are present<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>   * Precondition: familyPaths is not null<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>   *<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>   * @param familyPaths List of (column family, hfilePath)<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>   */<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    boolean multipleFamilies = false;<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    byte[] family = null;<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    for (Pair&lt;byte[], String&gt; pair : familyPaths) {<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>      byte[] fam = pair.getFirst();<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>      if (family == null) {<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>        family = fam;<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>      } else if (!Bytes.equals(family, fam)) {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>        multipleFamilies = true;<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>        break;<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>      }<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    }<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    return multipleFamilies;<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>  }<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span><a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  @Override<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>  public boolean bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, boolean assignSeqId,<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      BulkLoadListener bulkLoadListener) throws IOException {<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>    long seqId = -1;<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;byte[], List&lt;Path&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    Preconditions.checkNotNull(familyPaths);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    // we need writeLock for multi-family bulk load<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    try {<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      this.writeRequestsCount.increment();<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      // There possibly was a split that happened between when the split keys<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // were gathered and before the HRegion's write lock was taken.  We need<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      // to validate the HFile region before attempting to bulk load all of them<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>      List&lt;IOException&gt; ioes = new ArrayList&lt;IOException&gt;();<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;Pair&lt;byte[], String&gt;&gt;();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>        byte[] familyName = p.getFirst();<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>        String path = p.getSecond();<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span><a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>        Store store = getStore(familyName);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>        if (store == null) {<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>          IOException ioe = new org.apache.hadoop.hbase.DoNotRetryIOException(<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>              "No such column family " + Bytes.toStringBinary(familyName));<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>          ioes.add(ioe);<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>        } else {<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>          try {<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>            store.assertBulkLoadHFileOk(new Path(path));<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>          } catch (WrongRegionException wre) {<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>            // recoverable (file doesn't fit in region)<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>            failures.add(p);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>          } catch (IOException ioe) {<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>            // unrecoverable (hdfs problem)<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>            ioes.add(ioe);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>          }<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>        }<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>      }<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span><a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>      // validation failed because of some sort of IO problem.<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>      if (ioes.size() != 0) {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>        IOException e = MultipleIOException.createIOException(ioes);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>        LOG.error("There were one or more IO errors when checking if the bulk load is ok.", e);<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>        throw e;<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>      }<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span><a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>      // validation failed, bail out before doing anything permanent.<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>      if (failures.size() != 0) {<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>        StringBuilder list = new StringBuilder();<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>        for (Pair&lt;byte[], String&gt; p : failures) {<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>              .append(p.getSecond());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>        }<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        // problem when validating<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>        LOG.warn("There was a recoverable bulk load failure likely due to a" +<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>            " split.  These (family, HFile) pairs were not loaded: " + list);<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>        return false;<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>      }<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span><a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>      // We need to assign a sequential ID that's in between two memstores in order to preserve<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>      // the guarantee that all the edits lower than the highest sequential ID from all the<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>      // HFiles are flushed on disk. See HBASE-10958.  The sequence id returned when we flush is<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>      // a sequence id that we can be sure is beyond the last hfile written).<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>      if (assignSeqId) {<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        FlushResult fs = flushcache(true, false);<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>        if (fs.isFlushSucceeded()) {<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>        } else {<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>          throw new IOException("Could not bulk load with an assigned sequential ID because the "+<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>            "flush didn't run. Reason for not flushing: " + ((FlushResultImpl)fs).failureReason);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>        }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span>      }<a name="line.5441"></a>
-<span class="sourceLineNo">5442</span><a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        byte[] familyName = p.getFirst();<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>        String path = p.getSecond();<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>        Store store = getStore(familyName);<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>        try {<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>          String finalPath = path;<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>          if (bulkLoadListener != null) {<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path);<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>          }<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>          Path commitedStoreFile = store.bulkLoadHFile(finalPath, seqId);<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span><a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>          if(storeFiles.containsKey(familyName)) {<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>            storeFiles.get(familyName).add(commitedStoreFile);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>          } else {<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>            List&lt;Path&gt; storeFileNames = new ArrayList&lt;Path&gt;();<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>            storeFileNames.add(commitedStoreFile);<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>            storeFiles.put(familyName, storeFileNames);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>          }<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>          if (bulkLoadListener != null) {<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>            bulkLoadListener.doneBulkLoad(familyName, path);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>          }<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>        } catch (IOException ioe) {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>          // A failure here can cause an atomicity violation that we currently<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>          // cannot recover from since it is likely a failed HDFS operation.<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span><a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>          // TODO Need a better story for reverting partial failures due to HDFS.<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>          LOG.error("There was a partial failure due to IO when attempting to" +<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>              " load " + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>          if (bulkLoadListener != null) {<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>            try {<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>              bulkLoadListener.failedBulkLoad(familyName, path);<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>            } catch (Exception ex) {<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>              LOG.error("Error while calling failedBulkLoad for family " +<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>                  Bytes.toString(familyName) + " with path " + path, ex);<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>            }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>          }<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>          throw ioe;<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>        }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>      }<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span><a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>      return true;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    } finally {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        // write a bulk load event when not all hfiles are loaded<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        try {<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>          WALProtos.BulkLoadDescriptor loadDescriptor = ProtobufUtil.toBulkLoadDescriptor(<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>              this.getRegionInfo().getTable(),<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>              ByteStringer.wrap(this.getRegionInfo().getEncodedNameAsBytes()), storeFiles, seqId);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>          WALUtil.writeBulkLoadMarkerAndSync(wal, this.htableDescriptor, getRegionInfo(),<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>              loadDescriptor, mvcc);<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span>        } catch (IOException ioe) {<a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>          if (this.rsServices != null) {<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>            // Have to abort region server because some hfiles has been loaded but we can't write<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>            // the event into WAL<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>          }<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>        }<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>      }<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span><a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>      closeBulkRegionOperation();<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    }<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>  }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span><a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  @Override<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>  public boolean equals(Object o) {<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>                                                ((HRegion) o).getRegionInfo().getRegionName());<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>  }<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span><a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>  @Override<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>  public int hashCode() {<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    return Bytes.hashCode(getRegionInfo().getRegionName());<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>  }<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span><a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>  @Override<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>  public String toString() {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>    return getRegionInfo().getRegionNameAsString();<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>  }<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span><a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>  /**<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>   * RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>   */<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>  class RegionScannerImpl implements RegionScanner, org.apache.hadoop.hbase.ipc.RpcCallback {<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    // Package local for testability<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>    KeyValueHeap storeHeap = null;<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>    /** Heap of key-values that are not essential for the provided filters and are thus read<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>     * on demand, if on-demand column family loading is enabled.*/<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>    KeyValueHeap joinedHeap = null;<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>    /**<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>     * If the joined heap data gathering is interrupted due to scan limits, this will<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>     * contain the row for which we are populating the values.*/<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>    protected Cell joinedContinuationRow = null;<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    private boolean filterClosed = false;<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span><a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>    protected final int isScan;<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    protected final byte[] stopRow;<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    protected final HRegion region;<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    protected final CellComparator comparator;<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>    protected boolean copyCellsFromSharedMem = false;<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span><a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>    private final long readPt;<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>    private final long maxResultSize;<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>    private final ScannerContext defaultScannerContext;<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>    private final FilterWrapper filter;<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span><a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    @Override<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    public HRegionInfo getRegionInfo() {<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>      return region.getRegionInfo();<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>    }<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span><a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    public void setCopyCellsFromSharedMem(boolean copyCells) {<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>      this.copyCellsFromSharedMem = copyCells;<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    }<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span><a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    RegionScannerImpl(Scan scan, List&lt;KeyValueScanner&gt; additionalScanners, HRegion region,<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        boolean copyCellsFromSharedMem)<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>        throws IOException {<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>      this.region = region;<a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      this.maxResultSize = scan.getMaxResultSize();<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>      if (scan.hasFilter()) {<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        this.filter = new FilterWrapper(scan.getFilter());<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>      } else {<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>        this.filter = null;<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>      }<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      this.comparator = region.getCellCompartor();<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>      /**<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>       * By default, calls to next/nextRaw must enforce the batch limit. Thus, construct a default<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>       * scanner context that can be used to enforce the batch limit in the event that a<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>       * ScannerContext is not specified during an invocation of next/nextRaw<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>       */<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>      defaultScannerContext = ScannerContext.newBuilder()<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>          .setBatchLimit(scan.getBatch()).build();<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span><a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) &amp;&amp; !scan.isGetScan()) {<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>        this.stopRow = null;<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span>      } else {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        this.stopRow = scan.getStopRow();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>      }<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      // If we are doing a get, we want to be [startRow,endRow]. Normally<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>      // it is [startRow,endRow) and if startRow=endRow we get nothing.<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      this.isScan = scan.isGetScan() ? 1 : 0;<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span><a name="line.5584"></a>
-<span class="sourceLineNo">5585</span>      // synchronize on scannerReadPoints so that nobody calculates<a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>      // getSmallestReadPoint, before scannerReadPoints is updated.<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      IsolationLevel isolationLevel = scan.getIsolationLevel();<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      synchronized(scannerReadPoints) {<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>        this.readPt = getReadpoint(isolationLevel);<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        scannerReadPoints.put(this, this.readPt);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>      }<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span><a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>      // Here we separate all scanners into two lists - scanner that provide data required<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      // by the filter to operate (scanners list) and all others (joinedScanners list).<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>      List&lt;KeyValueScanner&gt; scanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>      List&lt;KeyValueScanner&gt; joinedScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>      if (additionalScanners != null) {<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>        scanners.addAll(additionalScanners);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>      }<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span><a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>      for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; entry : scan.getFamilyMap().entrySet()) {<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>        Store store = stores.get(entry.getKey());<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>        KeyValueScanner scanner;<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span>        try {<a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>          scanner = store.getScanner(scan, entry.getValue(), this.readPt);<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>        } catch (FileNotFoundException e) {<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>          throw handleFileNotFound(e);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>        }<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>        if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand()<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>          || this.filter.isFamilyEssential(entry.getKey())) {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>          scanners.add(scanner);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>        } else {<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>          joinedScanners.add(scanner);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>        }<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      }<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>      this.copyCellsFromSharedMem = copyCellsFromSharedMem;<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      initializeKVHeap(scanners, joinedScanners, region);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    }<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span><a name="line.5619"></a>
-<span class="sourceLineNo">5620</span>    protected void initializeKVHeap(List&lt;KeyValueScanner&gt; scanners,<a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>        List&lt;KeyValueScanner&gt; joinedScanners, HRegion region)<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>        throws IOException {<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      this.storeHeap = new KeyValueHeap(scanners, comparator);<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      if (!joinedScanners.isEmpty()) {<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>        this.joinedHeap = new KeyValueHeap(joinedScanners, comparator);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span>      }<a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    }<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span><a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    @Override<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    public long getMaxResultSize() {<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>      return maxResultSize;<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    @Override<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    public long getMvccReadPoint() {<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      return this.readPt;<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span>    }<a name="line.5637"></a>
-<span class="sourceLineNo">5638</span><a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>    @Override<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>    public int getBatch() {<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      return this.defaultScannerContext.getBatchLimit();<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>    }<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    /**<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>     * Reset both the filter and the old filter.<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>     *<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>     * @throws IOException in case a filter raises an I/O exception.<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>     */<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    protected void resetFilters() throws IOException {<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>      if (filter != null) {<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>        filter.reset();<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span>      }<a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    }<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span><a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    @Override<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>    public boolean next(List&lt;Cell&gt; outResults)<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>        throws IOException {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>      // apply the batching limit by default<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>      return next(outResults, defaultScannerContext);<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>    }<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span><a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    @Override<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    public synchronized boolean next(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    throws IOException {<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>      if (this.filterClosed) {<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>        throw new UnknownScannerException("Scanner was closed (timed out?) " +<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>            "after we renewed it. Could be caused by a very slow scanner " +<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>            "or a lengthy garbage collection");<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>      }<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>      startRegionOperation(Operation.SCAN);<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>      readRequestsCount.increment();<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>      try {<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>        return nextRaw(outResults, scannerContext);<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>      } finally {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>        closeRegionOperation(Operation.SCAN);<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>      }<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>    }<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span><a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    @Override<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    public boolean nextRaw(List&lt;Cell&gt; outResults) throws IOException {<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      // Use the RegionScanner's context by default<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return nextRaw(outResults, defaultScannerContext);<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span><a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>    @Override<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>    public boolean nextRaw(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        throws IOException {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>      if (storeHeap == null) {<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        // scanner is closed<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>        throw new UnknownScannerException("Scanner was closed");<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      }<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      boolean moreValues = false;<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      try {<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>        if (outResults.isEmpty()) {<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>          // Usually outResults is empty. This is true when next is called<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>          // to handle scan or get operation.<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>          moreValues = nextInternal(outResults, scannerContext);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        } else {<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>          List&lt;Cell&gt; tmpList = new ArrayList&lt;Cell&gt;();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>          moreValues = nextInternal(tmpList, scannerContext);<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>          outResults.addAll(tmpList);<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        }<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span><a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        // If the size limit was reached it means a partial Result is being<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>        // returned. Returning a<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        // partial Result means that we should not reset the filters; filters<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>        // should only be reset in<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>        // between rows<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>        if (!scannerContext.partialResultFormed()) resetFilters();<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span><a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>        if (isFilterDoneInternal()) {<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>          moreValues = false;<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>        }<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span><a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        // If copyCellsFromSharedMem = true, then we need to copy the cells. Otherwise<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>        // it is a call coming from the RsRpcServices.scan().<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        if (copyCellsFromSharedMem &amp;&amp; !outResults.isEmpty()) {<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>          // Do the copy of the results here.<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          ListIterator&lt;Cell&gt; listItr = outResults.listIterator();<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          Cell cell = null;<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          while (listItr.hasNext()) {<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>            cell = listItr.next();<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>            if (cell instanceof ShareableMemory) {<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>              listItr.set(((ShareableMemory) cell).cloneToCell());<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>            }<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>          }<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>        }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>      } finally {<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        if (copyCellsFromSharedMem) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          // In case of copyCellsFromSharedMem==true (where the CPs wrap a scanner) we return<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          // the blocks then and there (for wrapped CPs)<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>          this.shipped();<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>      return moreValues;<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    }<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    /**<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>     * @return true if more cells exist after this batch, false if scanner is done<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>     */<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>    private boolean populateFromJoinedHeap(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>            throws IOException {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      assert joinedContinuationRow != null;<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>      boolean moreValues = populateResult(results, this.joinedHeap, scannerContext,<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>          joinedContinuationRow);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      if (!scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>        // We are done with this row, reset the continuation.<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>        joinedContinuationRow = null;<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span>      }<a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>      // As the data is obtained from two independent heaps, we need to<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>      // ensure that result list is sorted, because Result relies on that.<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>      Collections.sort(results, comparator);<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>      return moreValues;<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>    }<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    /**<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>     * Fetches records with currentRow into results list, until next row, batchLimit (if not -1) is<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>     * reached, or remainingResultSize (if not -1) is reaced<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>     * @param heap KeyValueHeap to fetch data from.It must be positioned on correct row before call.<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>     * @param scannerContext<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>     * @param currentRowCell<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>     * @return state of last call to {@link KeyValueHeap#next()}<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>     */<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    private boolean populateResult(List&lt;Cell&gt; results, KeyValueHeap heap,<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>        ScannerContext scannerContext, Cell currentRowCell) throws IOException {<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      Cell nextKv;<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      boolean moreCellsInRow = false;<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      boolean tmpKeepProgress = scannerContext.getKeepProgress();<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      // Scanning between column families and thus the scope is between cells<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      LimitScope limitScope = LimitScope.BETWEEN_CELLS;<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      try {<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>        do {<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>          // We want to maintain any progress that is made towards the limits while scanning across<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>          // different column families. To do this, we toggle the keep progress flag on during calls<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>          // to the StoreScanner to ensure that any progress made thus far is not wiped away.<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>          scannerContext.setKeepProgress(true);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>          heap.next(results, scannerContext);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>          scannerContext.setKeepProgress(tmpKeepProgress);<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>          nextKv = heap.peek();<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>          moreCellsInRow = moreCellsInRow(nextKv, currentRowCell);<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>          if (!moreCellsInRow) incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>          if (scannerContext.checkBatchLimit(limitScope)) {<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>            return scannerContext.setScannerState(NextState.BATCH_LIMIT_REACHED).hasMoreValues();<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>          } else if (scannerContext.checkSizeLimit(limitScope)) {<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>            ScannerContext.NextState state =<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>              moreCellsInRow? NextState.SIZE_LIMIT_REACHED_MID_ROW: NextState.SIZE_LIMIT_REACHED;<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>          } else if (scannerContext.checkTimeLimit(limitScope)) {<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>            ScannerContext.NextState state =<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>              moreCellsInRow? NextState.TIME_LIMIT_REACHED_MID_ROW: NextState.TIME_LIMIT_REACHED;<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>          }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>        } while (moreCellsInRow);<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>      } catch (FileNotFoundException e) {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>        throw handleFileNotFound(e);<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>      }<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      return nextKv != null;<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    }<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span><a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    /**<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>     * Based on the nextKv in the heap, and the current row, decide whether or not there are more<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>     * cells to be read in the heap. If the row of the nextKv in the heap matches the current row<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>     * then there are more cells to be read in the row.<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>     * @param nextKv<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>     * @param currentRowCell<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>     * @return true When there are more cells in the row to be read<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>     */<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>    private boolean moreCellsInRow(final Cell nextKv, Cell currentRowCell) {<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      return nextKv != null &amp;&amp; CellUtil.matchingRow(nextKv, currentRowCell);<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>    }<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span><a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>    /*<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>     * @return True if a filter rules the scanner is over, done.<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>     */<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    @Override<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    public synchronized boolean isFilterDone() throws IOException {<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      return isFilterDoneInternal();<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    }<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span><a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>    private boolean isFilterDoneInternal() throws IOException {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      return this.filter != null &amp;&amp; this.filter.filterAllRemaining();<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>    }<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span><a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    private boolean nextInternal(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>        throws IOException {<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>      if (!results.isEmpty()) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>        throw new IllegalArgumentException("First parameter should be an empty list");<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>      }<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      if (scannerContext == null) {<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>        throw new IllegalArgumentException("Scanner context cannot be null");<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      RpcCallContext rpcCall = RpcServer.getCurrentCall();<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span><a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>      // Save the initial progress from the Scanner context in these local variables. The progress<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      // may need to be reset a few times if rows are being filtered out so we save the initial<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      // progress.<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      int initialBatchProgress = scannerContext.getBatchProgress();<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>      long initialSizeProgress = scannerContext.getSizeProgress();<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>      long initialTimeProgress = scannerContext.getTimeProgress();<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      // The loop here is used only when at some point during the next we determine<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      // that due to effects of filters or otherwise, we have an empty row in the result.<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>      // Then we loop and try again. Otherwise, we must get out on the first iteration via return,<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>      // "true" if there's more data to read, "false" if there isn't (storeHeap is at a stop row,<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>      // and joinedHeap has no more data to read for the last row (if set, joinedContinuationRow).<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>      while (true) {<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>        // Starting to scan a new row. Reset the scanner progress according to whether or not<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>        // progress should be kept.<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>        if (scannerContext.getKeepProgress()) {<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>          // Progress should be kept. Reset to initial values seen at start of method invocation.<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>          scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>            initialTimeProgress);<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        } else {<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>          scannerContext.clearProgress();<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        }<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>        if (rpcCall != null) {<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>          // If a user specifies a too-restrictive or too-slow scanner, the<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>          // client might time out and disconnect while the server side<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>          // is still processing the request. We should abort aggressively<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>          // in that case.<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>          long afterTime = rpcCall.disconnectSince();<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>          if (afterTime &gt;= 0) {<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>            throw new CallerDisconnectedException(<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>                "Aborting on region " + getRegionInfo().getRegionNameAsString() + ", call " +<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>                    this + " after " + afterTime + " ms, since " +<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>                    "caller disconnected");<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          }<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span><a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>        // Let's see what we have in the storeHeap.<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>        Cell current = this.storeHeap.peek();<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span><a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>        boolean stopRow = isStopRow(current);<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // When has filter row is true it means that the all the cells for a particular row must be<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        // read before a filtering decision can be made. This means that filters where hasFilterRow<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>        // run the risk of encountering out of memory errors in the case that they are applied to a<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>        // table that has very large rows.<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>        boolean hasFilterRow = this.filter != null &amp;&amp; this.filter.hasFilterRow();<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span><a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>        // If filter#hasFilterRow is true, partial results are not allowed since allowing them<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>        // would prevent the filters from being evaluated. Thus, if it is true, change the<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>        // scope of any limits that could potentially create partial results to<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>        // LimitScope.BETWEEN_ROWS so that those limits are not reached mid-row<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>        if (hasFilterRow) {<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>          if (LOG.isTraceEnabled()) {<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>            LOG.trace("filter#hasFilterRow is true which prevents partial results from being "<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>                + " formed. Changing scope of limits that may create partials");<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span>          }<a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>          scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>          scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>        }<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span><a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>        // Check if we were getting data from the joinedHeap and hit the limit.<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>        // If not, then it's main path - getting results from storeHeap.<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>        if (joinedContinuationRow == null) {<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>          // First, check if we are at a stop row. If so, there are no more results.<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>          if (stopRow) {<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>            if (hasFilterRow) {<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>              filter.filterRowCells(results);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>            }<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>          }<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span><a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>          // Check if rowkey filter wants to exclude this row. If so, loop to next.<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>          // Technically, if we hit limits before on this row, we don't need this call.<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>          if (filterRowKey(current)) {<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>            // Typically the count of rows scanned is incremented inside #populateResult. However,<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>            // here we are filtering a row based purely on its row key, preventing us from calling<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>            // #populateResult. Thus, perform the necessary increment here to rows scanned metric<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>            incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>            if (!moreRows) {<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>            }<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>            results.clear();<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>            continue;<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>          }<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span><a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>          // Ok, we are good, let's try to get some results from the main heap.<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>          populateResult(results, this.storeHeap, scannerContext, current);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>            if (hasFilterRow) {<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>              throw new IncompatibleFilterException(<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>                  "Filter whose hasFilterRow() returns true is incompatible with scans that must "<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>                      + " stop mid-row because of a limit. ScannerContext:" + scannerContext);<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>            }<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>            return true;<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>          }<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span><a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>          Cell nextKv = this.storeHeap.peek();<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>          stopRow = nextKv == null || isStopRow(nextKv);<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>          // save that the row was empty before filters applied to it.<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>          final boolean isEmptyRow = results.isEmpty();<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span><a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>          // We have the part of the row necessary for filtering (all of it, usually).<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>          // First filter with the filterRow(List).<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>          FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>          if (hasFilterRow) {<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>            ret = filter.filterRowCellsWithRet(results);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span><a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>            // We don't know how the results have changed after being filtered. Must set progress<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>            // according to contents of results now. However, a change in the results should not<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>            // affect the time progress. Thus preserve whatever time progress has been made<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>            long timeProgress = scannerContext.getTimeProgress();<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>            if (scannerContext.getKeepProgress()) {<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>              scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>                initialTimeProgress);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>            } else {<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>              scannerContext.clearProgress();<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>            }<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>            scannerContext.setTimeProgress(timeProgress);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>            scannerContext.incrementBatchProgress(results.size());<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>            for (Cell cell : results) {<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>              scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOf(cell));<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>            }<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>          }<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span><a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>          if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>            results.clear();<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>            if (!moreRows) {<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>            }<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>            // This row was totally filtered out, if this is NOT the last row,<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>            // we should continue on. Otherwise, nothing else to do.<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>            if (!stopRow) continue;<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>          }<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>          // Ok, we are done with storeHeap for this row.<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>          // Now we may need to fetch additional, non-essential data into row.<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>          // These values are not needed for filter to work, so we postpone their<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>          // fetch to (possibly) reduce amount of data loads from disk.<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>          if (this.joinedHeap != null) {<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>            boolean mayHaveData = joinedHeapMayHaveData(current);<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>            if (mayHaveData) {<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>              joinedContinuationRow = current;<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>              populateFromJoinedHeap(results, scannerContext);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span><a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>              if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>                return true;<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>              }<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>            }<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>          }<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>        } else {<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>          // Populating from the joined heap was stopped by limits, populate some more.<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>          populateFromJoinedHeap(results, scannerContext);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>            return true;<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>          }<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>        }<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>        // We may have just called populateFromJoinedMap and hit the limits. If that is<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>        // the case, we need to call it again on the next next() invocation.<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span>        if (joinedContinuationRow != null) {<a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>        }<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span><a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>        // Finally, we are done with both joinedHeap and storeHeap.<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>        // Double check to prevent empty rows from appearing in result. It could be<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>        // the case when SingleColumnValueExcludeFilter is used.<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>        if (results.isEmpty()) {<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>          incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>          boolean moreRows = nextRow(scannerContext, current);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>          if (!moreRows) {<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>          }<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>          if (!stopRow) continue;<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>        }<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>        if (stopRow) {<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>        } else {<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>        }<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      }<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    }<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span><a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    protected void incrementCountOfRowsFilteredMetric(ScannerContext scannerContext) {<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span><a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      scannerContext.getMetrics().countOfRowsFiltered.incrementAndGet();<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    }<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span><a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    protected void incrementCountOfRowsScannedMetric(ScannerContext scannerContext) {<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span><a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      scannerContext.getMetrics().countOfRowsScanned.incrementAndGet();<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    }<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span><a name="line.6036"></a>
-<span class="sourceLineNo">6037</span>    /**<a name="line.6037"><

<TRUNCATED>

[10/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
index e2c4389..d03724e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
@@ -5185,3056 +5185,3058 @@
 <span class="sourceLineNo">5177</span>   * @param readLock is the lock reader or writer. True indicates that a non-exlcusive<a name="line.5177"></a>
 <span class="sourceLineNo">5178</span>   *                 lock is requested<a name="line.5178"></a>
 <span class="sourceLineNo">5179</span>   */<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    // Make sure the row is inside of this region before getting the lock for it.<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    checkRow(row, "row lock");<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    // create an object to use a a key in the row lock map<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    HashedBytes rowKey = new HashedBytes(row);<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    RowLockContext rowLockContext = null;<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    RowLockImpl result = null;<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    TraceScope traceScope = null;<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span><a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    // If we're tracing start a span to show how long this took.<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>    if (Trace.isTracing()) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>      traceScope = Trace.startSpan("HRegion.getRowLock");<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>      traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock"));<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>    }<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span><a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    try {<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>      // Keep trying until we have a lock or error out.<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>      // TODO: do we need to add a time component here?<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>      while (result == null) {<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span><a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>        // Try adding a RowLockContext to the lockedRows.<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>        // If we can add it then there's no other transactions currently running.<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        rowLockContext = new RowLockContext(rowKey);<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span><a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>        // if there was a running transaction then there's already a context.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>        if (existingContext != null) {<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>          rowLockContext = existingContext;<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>        }<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span><a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>        // Now try an get the lock.<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>        //<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>        // This can fail as<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>        if (readLock) {<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>          result = rowLockContext.newReadLock();<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>        } else {<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>          result = rowLockContext.newWriteLock();<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>        }<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      }<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      if (!result.getLock().tryLock(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>        if (traceScope != null) {<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>          traceScope.getSpan().addTimelineAnnotation("Failed to get row lock");<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>        }<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>        result = null;<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>        // Clean up the counts just in case this was the thing keeping the context alive.<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        rowLockContext.cleanUp();<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        throw new IOException("Timed out waiting for lock for row: " + rowKey);<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>      }<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>      return result;<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>    } catch (InterruptedException ie) {<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>      LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>      iie.initCause(ie);<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>      if (traceScope != null) {<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>        traceScope.getSpan().addTimelineAnnotation("Interrupted exception getting row lock");<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>      }<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>      Thread.currentThread().interrupt();<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>      throw iie;<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    } finally {<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>      if (traceScope != null) {<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>        traceScope.close();<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>      }<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    }<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>  }<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span><a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>  @Override<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>  public void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>    if (rowLocks != null) {<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>      for (RowLock rowLock : rowLocks) {<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span>        rowLock.release();<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>      }<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>      rowLocks.clear();<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    }<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>  }<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span><a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>  @VisibleForTesting<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>  class RowLockContext {<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span>    private final HashedBytes row;<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    final AtomicBoolean usable = new AtomicBoolean(true);<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    final Object lock = new Object();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    RowLockContext(HashedBytes row) {<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>      this.row = row;<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    }<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span><a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    RowLockImpl newWriteLock() {<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>      Lock l = readWriteLock.writeLock();<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>      return getRowLock(l);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    }<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    RowLockImpl newReadLock() {<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>      Lock l = readWriteLock.readLock();<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>      return getRowLock(l);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    private RowLockImpl getRowLock(Lock l) {<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>      count.incrementAndGet();<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>      synchronized (lock) {<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        if (usable.get()) {<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>          return new RowLockImpl(this, l);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        } else {<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>          return null;<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        }<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>      }<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    }<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span><a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    void cleanUp() {<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>      long c = count.decrementAndGet();<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>      if (c &lt;= 0) {<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        synchronized (lock) {<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>          if (count.get() &lt;= 0 ){<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>            usable.set(false);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>            RowLockContext removed = lockedRows.remove(row);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>            assert removed == this: "we should never remove a different context";<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>          }<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        }<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>      }<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    }<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span><a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    @Override<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    public String toString() {<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>      return "RowLockContext{" +<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>          "row=" + row +<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>          ", readWriteLock=" + readWriteLock +<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>          ", count=" + count +<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>          '}';<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    }<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>  }<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span><a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>  /**<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>   * Class used to represent a lock on a row.<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>   */<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>  public static class RowLockImpl implements RowLock {<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    private final RowLockContext context;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    private final Lock lock;<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span><a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    public RowLockImpl(RowLockContext context, Lock lock) {<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>      this.context = context;<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>      this.lock = lock;<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    }<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span><a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    public Lock getLock() {<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>      return lock;<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    }<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span><a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    @VisibleForTesting<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>    public RowLockContext getContext() {<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      return context;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    }<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span><a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    @Override<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    public void release() {<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>      lock.unlock();<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>      context.cleanUp();<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>    }<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span><a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    @Override<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    public String toString() {<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>      return "RowLockImpl{" +<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>          "context=" + context +<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>          ", lock=" + lock +<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>          '}';<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>    }<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  }<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span><a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>  /**<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>   * Determines whether multiple column families are present<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>   * Precondition: familyPaths is not null<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>   *<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>   * @param familyPaths List of (column family, hfilePath)<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>   */<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    boolean multipleFamilies = false;<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    byte[] family = null;<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    for (Pair&lt;byte[], String&gt; pair : familyPaths) {<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>      byte[] fam = pair.getFirst();<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>      if (family == null) {<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>        family = fam;<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>      } else if (!Bytes.equals(family, fam)) {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>        multipleFamilies = true;<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>        break;<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>      }<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    }<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    return multipleFamilies;<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>  }<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span><a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  @Override<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>  public boolean bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, boolean assignSeqId,<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      BulkLoadListener bulkLoadListener) throws IOException {<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>    long seqId = -1;<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;byte[], List&lt;Path&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    Preconditions.checkNotNull(familyPaths);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    // we need writeLock for multi-family bulk load<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    try {<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      this.writeRequestsCount.increment();<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      // There possibly was a split that happened between when the split keys<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // were gathered and before the HRegion's write lock was taken.  We need<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      // to validate the HFile region before attempting to bulk load all of them<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>      List&lt;IOException&gt; ioes = new ArrayList&lt;IOException&gt;();<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;Pair&lt;byte[], String&gt;&gt;();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>        byte[] familyName = p.getFirst();<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>        String path = p.getSecond();<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span><a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>        Store store = getStore(familyName);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>        if (store == null) {<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>          IOException ioe = new org.apache.hadoop.hbase.DoNotRetryIOException(<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>              "No such column family " + Bytes.toStringBinary(familyName));<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>          ioes.add(ioe);<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>        } else {<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>          try {<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>            store.assertBulkLoadHFileOk(new Path(path));<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>          } catch (WrongRegionException wre) {<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>            // recoverable (file doesn't fit in region)<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>            failures.add(p);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>          } catch (IOException ioe) {<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>            // unrecoverable (hdfs problem)<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>            ioes.add(ioe);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>          }<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>        }<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>      }<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span><a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>      // validation failed because of some sort of IO problem.<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>      if (ioes.size() != 0) {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>        IOException e = MultipleIOException.createIOException(ioes);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>        LOG.error("There were one or more IO errors when checking if the bulk load is ok.", e);<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>        throw e;<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>      }<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span><a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>      // validation failed, bail out before doing anything permanent.<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>      if (failures.size() != 0) {<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>        StringBuilder list = new StringBuilder();<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>        for (Pair&lt;byte[], String&gt; p : failures) {<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>              .append(p.getSecond());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>        }<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        // problem when validating<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>        LOG.warn("There was a recoverable bulk load failure likely due to a" +<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>            " split.  These (family, HFile) pairs were not loaded: " + list);<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>        return false;<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>      }<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span><a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>      // We need to assign a sequential ID that's in between two memstores in order to preserve<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>      // the guarantee that all the edits lower than the highest sequential ID from all the<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>      // HFiles are flushed on disk. See HBASE-10958.  The sequence id returned when we flush is<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>      // a sequence id that we can be sure is beyond the last hfile written).<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>      if (assignSeqId) {<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        FlushResult fs = flushcache(true, false);<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>        if (fs.isFlushSucceeded()) {<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>        } else {<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>          throw new IOException("Could not bulk load with an assigned sequential ID because the "+<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>            "flush didn't run. Reason for not flushing: " + ((FlushResultImpl)fs).failureReason);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>        }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span>      }<a name="line.5441"></a>
-<span class="sourceLineNo">5442</span><a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        byte[] familyName = p.getFirst();<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>        String path = p.getSecond();<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>        Store store = getStore(familyName);<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>        try {<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>          String finalPath = path;<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>          if (bulkLoadListener != null) {<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path);<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>          }<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>          Path commitedStoreFile = store.bulkLoadHFile(finalPath, seqId);<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span><a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>          if(storeFiles.containsKey(familyName)) {<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>            storeFiles.get(familyName).add(commitedStoreFile);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>          } else {<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>            List&lt;Path&gt; storeFileNames = new ArrayList&lt;Path&gt;();<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>            storeFileNames.add(commitedStoreFile);<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>            storeFiles.put(familyName, storeFileNames);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>          }<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>          if (bulkLoadListener != null) {<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>            bulkLoadListener.doneBulkLoad(familyName, path);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>          }<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>        } catch (IOException ioe) {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>          // A failure here can cause an atomicity violation that we currently<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>          // cannot recover from since it is likely a failed HDFS operation.<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span><a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>          // TODO Need a better story for reverting partial failures due to HDFS.<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>          LOG.error("There was a partial failure due to IO when attempting to" +<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>              " load " + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>          if (bulkLoadListener != null) {<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>            try {<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>              bulkLoadListener.failedBulkLoad(familyName, path);<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>            } catch (Exception ex) {<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>              LOG.error("Error while calling failedBulkLoad for family " +<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>                  Bytes.toString(familyName) + " with path " + path, ex);<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>            }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>          }<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>          throw ioe;<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>        }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>      }<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span><a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>      return true;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    } finally {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        // write a bulk load event when not all hfiles are loaded<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        try {<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>          WALProtos.BulkLoadDescriptor loadDescriptor = ProtobufUtil.toBulkLoadDescriptor(<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>              this.getRegionInfo().getTable(),<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>              ByteStringer.wrap(this.getRegionInfo().getEncodedNameAsBytes()), storeFiles, seqId);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>          WALUtil.writeBulkLoadMarkerAndSync(wal, this.htableDescriptor, getRegionInfo(),<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>              loadDescriptor, mvcc);<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span>        } catch (IOException ioe) {<a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>          if (this.rsServices != null) {<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>            // Have to abort region server because some hfiles has been loaded but we can't write<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>            // the event into WAL<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>          }<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>        }<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>      }<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span><a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>      closeBulkRegionOperation();<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    }<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>  }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span><a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  @Override<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>  public boolean equals(Object o) {<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>                                                ((HRegion) o).getRegionInfo().getRegionName());<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>  }<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span><a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>  @Override<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>  public int hashCode() {<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    return Bytes.hashCode(getRegionInfo().getRegionName());<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>  }<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span><a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>  @Override<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>  public String toString() {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>    return getRegionInfo().getRegionNameAsString();<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>  }<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span><a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>  /**<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>   * RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>   */<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>  class RegionScannerImpl implements RegionScanner, org.apache.hadoop.hbase.ipc.RpcCallback {<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    // Package local for testability<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>    KeyValueHeap storeHeap = null;<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>    /** Heap of key-values that are not essential for the provided filters and are thus read<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>     * on demand, if on-demand column family loading is enabled.*/<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>    KeyValueHeap joinedHeap = null;<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>    /**<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>     * If the joined heap data gathering is interrupted due to scan limits, this will<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>     * contain the row for which we are populating the values.*/<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>    protected Cell joinedContinuationRow = null;<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    private boolean filterClosed = false;<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span><a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>    protected final int isScan;<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    protected final byte[] stopRow;<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    protected final HRegion region;<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    protected final CellComparator comparator;<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>    protected boolean copyCellsFromSharedMem = false;<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span><a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>    private final long readPt;<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>    private final long maxResultSize;<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>    private final ScannerContext defaultScannerContext;<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>    private final FilterWrapper filter;<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span><a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    @Override<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    public HRegionInfo getRegionInfo() {<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>      return region.getRegionInfo();<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>    }<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span><a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    public void setCopyCellsFromSharedMem(boolean copyCells) {<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>      this.copyCellsFromSharedMem = copyCells;<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    }<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span><a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    RegionScannerImpl(Scan scan, List&lt;KeyValueScanner&gt; additionalScanners, HRegion region,<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        boolean copyCellsFromSharedMem)<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>        throws IOException {<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>      this.region = region;<a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      this.maxResultSize = scan.getMaxResultSize();<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>      if (scan.hasFilter()) {<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        this.filter = new FilterWrapper(scan.getFilter());<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>      } else {<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>        this.filter = null;<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>      }<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      this.comparator = region.getCellCompartor();<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>      /**<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>       * By default, calls to next/nextRaw must enforce the batch limit. Thus, construct a default<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>       * scanner context that can be used to enforce the batch limit in the event that a<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>       * ScannerContext is not specified during an invocation of next/nextRaw<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>       */<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>      defaultScannerContext = ScannerContext.newBuilder()<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>          .setBatchLimit(scan.getBatch()).build();<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span><a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) &amp;&amp; !scan.isGetScan()) {<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>        this.stopRow = null;<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span>      } else {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        this.stopRow = scan.getStopRow();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>      }<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      // If we are doing a get, we want to be [startRow,endRow]. Normally<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>      // it is [startRow,endRow) and if startRow=endRow we get nothing.<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      this.isScan = scan.isGetScan() ? 1 : 0;<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span><a name="line.5584"></a>
-<span class="sourceLineNo">5585</span>      // synchronize on scannerReadPoints so that nobody calculates<a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>      // getSmallestReadPoint, before scannerReadPoints is updated.<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      IsolationLevel isolationLevel = scan.getIsolationLevel();<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      synchronized(scannerReadPoints) {<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>        this.readPt = getReadpoint(isolationLevel);<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        scannerReadPoints.put(this, this.readPt);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>      }<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span><a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>      // Here we separate all scanners into two lists - scanner that provide data required<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      // by the filter to operate (scanners list) and all others (joinedScanners list).<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>      List&lt;KeyValueScanner&gt; scanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>      List&lt;KeyValueScanner&gt; joinedScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>      if (additionalScanners != null) {<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>        scanners.addAll(additionalScanners);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>      }<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span><a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>      for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; entry : scan.getFamilyMap().entrySet()) {<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>        Store store = stores.get(entry.getKey());<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>        KeyValueScanner scanner;<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span>        try {<a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>          scanner = store.getScanner(scan, entry.getValue(), this.readPt);<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>        } catch (FileNotFoundException e) {<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>          throw handleFileNotFound(e);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>        }<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>        if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand()<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>          || this.filter.isFamilyEssential(entry.getKey())) {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>          scanners.add(scanner);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>        } else {<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>          joinedScanners.add(scanner);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>        }<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      }<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>      this.copyCellsFromSharedMem = copyCellsFromSharedMem;<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      initializeKVHeap(scanners, joinedScanners, region);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    }<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span><a name="line.5619"></a>
-<span class="sourceLineNo">5620</span>    protected void initializeKVHeap(List&lt;KeyValueScanner&gt; scanners,<a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>        List&lt;KeyValueScanner&gt; joinedScanners, HRegion region)<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>        throws IOException {<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      this.storeHeap = new KeyValueHeap(scanners, comparator);<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      if (!joinedScanners.isEmpty()) {<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>        this.joinedHeap = new KeyValueHeap(joinedScanners, comparator);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span>      }<a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    }<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span><a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    @Override<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    public long getMaxResultSize() {<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>      return maxResultSize;<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    @Override<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    public long getMvccReadPoint() {<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      return this.readPt;<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span>    }<a name="line.5637"></a>
-<span class="sourceLineNo">5638</span><a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>    @Override<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>    public int getBatch() {<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      return this.defaultScannerContext.getBatchLimit();<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>    }<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    /**<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>     * Reset both the filter and the old filter.<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>     *<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>     * @throws IOException in case a filter raises an I/O exception.<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>     */<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    protected void resetFilters() throws IOException {<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>      if (filter != null) {<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>        filter.reset();<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span>      }<a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    }<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span><a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    @Override<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>    public boolean next(List&lt;Cell&gt; outResults)<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>        throws IOException {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>      // apply the batching limit by default<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>      return next(outResults, defaultScannerContext);<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>    }<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span><a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    @Override<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    public synchronized boolean next(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    throws IOException {<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>      if (this.filterClosed) {<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>        throw new UnknownScannerException("Scanner was closed (timed out?) " +<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>            "after we renewed it. Could be caused by a very slow scanner " +<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>            "or a lengthy garbage collection");<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>      }<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>      startRegionOperation(Operation.SCAN);<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>      readRequestsCount.increment();<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>      try {<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>        return nextRaw(outResults, scannerContext);<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>      } finally {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>        closeRegionOperation(Operation.SCAN);<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>      }<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>    }<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span><a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    @Override<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    public boolean nextRaw(List&lt;Cell&gt; outResults) throws IOException {<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      // Use the RegionScanner's context by default<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return nextRaw(outResults, defaultScannerContext);<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span><a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>    @Override<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>    public boolean nextRaw(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        throws IOException {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>      if (storeHeap == null) {<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        // scanner is closed<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>        throw new UnknownScannerException("Scanner was closed");<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      }<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      boolean moreValues = false;<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      try {<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>        if (outResults.isEmpty()) {<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>          // Usually outResults is empty. This is true when next is called<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>          // to handle scan or get operation.<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>          moreValues = nextInternal(outResults, scannerContext);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        } else {<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>          List&lt;Cell&gt; tmpList = new ArrayList&lt;Cell&gt;();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>          moreValues = nextInternal(tmpList, scannerContext);<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>          outResults.addAll(tmpList);<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        }<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span><a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        // If the size limit was reached it means a partial Result is being<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>        // returned. Returning a<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        // partial Result means that we should not reset the filters; filters<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>        // should only be reset in<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>        // between rows<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>        if (!scannerContext.partialResultFormed()) resetFilters();<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span><a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>        if (isFilterDoneInternal()) {<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>          moreValues = false;<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>        }<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span><a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        // If copyCellsFromSharedMem = true, then we need to copy the cells. Otherwise<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>        // it is a call coming from the RsRpcServices.scan().<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        if (copyCellsFromSharedMem &amp;&amp; !outResults.isEmpty()) {<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>          // Do the copy of the results here.<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          ListIterator&lt;Cell&gt; listItr = outResults.listIterator();<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          Cell cell = null;<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          while (listItr.hasNext()) {<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>            cell = listItr.next();<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>            if (cell instanceof ShareableMemory) {<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>              listItr.set(((ShareableMemory) cell).cloneToCell());<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>            }<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>          }<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>        }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>      } finally {<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        if (copyCellsFromSharedMem) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          // In case of copyCellsFromSharedMem==true (where the CPs wrap a scanner) we return<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          // the blocks then and there (for wrapped CPs)<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>          this.shipped();<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>      return moreValues;<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    }<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    /**<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>     * @return true if more cells exist after this batch, false if scanner is done<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>     */<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>    private boolean populateFromJoinedHeap(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>            throws IOException {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      assert joinedContinuationRow != null;<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>      boolean moreValues = populateResult(results, this.joinedHeap, scannerContext,<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>          joinedContinuationRow);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      if (!scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>        // We are done with this row, reset the continuation.<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>        joinedContinuationRow = null;<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span>      }<a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>      // As the data is obtained from two independent heaps, we need to<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>      // ensure that result list is sorted, because Result relies on that.<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>      Collections.sort(results, comparator);<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>      return moreValues;<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>    }<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    /**<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>     * Fetches records with currentRow into results list, until next row, batchLimit (if not -1) is<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>     * reached, or remainingResultSize (if not -1) is reaced<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>     * @param heap KeyValueHeap to fetch data from.It must be positioned on correct row before call.<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>     * @param scannerContext<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>     * @param currentRowCell<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>     * @return state of last call to {@link KeyValueHeap#next()}<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>     */<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    private boolean populateResult(List&lt;Cell&gt; results, KeyValueHeap heap,<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>        ScannerContext scannerContext, Cell currentRowCell) throws IOException {<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      Cell nextKv;<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      boolean moreCellsInRow = false;<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      boolean tmpKeepProgress = scannerContext.getKeepProgress();<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      // Scanning between column families and thus the scope is between cells<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      LimitScope limitScope = LimitScope.BETWEEN_CELLS;<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      try {<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>        do {<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>          // We want to maintain any progress that is made towards the limits while scanning across<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>          // different column families. To do this, we toggle the keep progress flag on during calls<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>          // to the StoreScanner to ensure that any progress made thus far is not wiped away.<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>          scannerContext.setKeepProgress(true);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>          heap.next(results, scannerContext);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>          scannerContext.setKeepProgress(tmpKeepProgress);<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>          nextKv = heap.peek();<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>          moreCellsInRow = moreCellsInRow(nextKv, currentRowCell);<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>          if (!moreCellsInRow) incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>          if (scannerContext.checkBatchLimit(limitScope)) {<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>            return scannerContext.setScannerState(NextState.BATCH_LIMIT_REACHED).hasMoreValues();<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>          } else if (scannerContext.checkSizeLimit(limitScope)) {<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>            ScannerContext.NextState state =<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>              moreCellsInRow? NextState.SIZE_LIMIT_REACHED_MID_ROW: NextState.SIZE_LIMIT_REACHED;<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>          } else if (scannerContext.checkTimeLimit(limitScope)) {<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>            ScannerContext.NextState state =<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>              moreCellsInRow? NextState.TIME_LIMIT_REACHED_MID_ROW: NextState.TIME_LIMIT_REACHED;<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>          }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>        } while (moreCellsInRow);<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>      } catch (FileNotFoundException e) {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>        throw handleFileNotFound(e);<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>      }<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      return nextKv != null;<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    }<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span><a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    /**<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>     * Based on the nextKv in the heap, and the current row, decide whether or not there are more<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>     * cells to be read in the heap. If the row of the nextKv in the heap matches the current row<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>     * then there are more cells to be read in the row.<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>     * @param nextKv<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>     * @param currentRowCell<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>     * @return true When there are more cells in the row to be read<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>     */<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>    private boolean moreCellsInRow(final Cell nextKv, Cell currentRowCell) {<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      return nextKv != null &amp;&amp; CellUtil.matchingRow(nextKv, currentRowCell);<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>    }<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span><a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>    /*<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>     * @return True if a filter rules the scanner is over, done.<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>     */<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    @Override<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    public synchronized boolean isFilterDone() throws IOException {<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      return isFilterDoneInternal();<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    }<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span><a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>    private boolean isFilterDoneInternal() throws IOException {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      return this.filter != null &amp;&amp; this.filter.filterAllRemaining();<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>    }<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span><a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    private boolean nextInternal(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>        throws IOException {<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>      if (!results.isEmpty()) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>        throw new IllegalArgumentException("First parameter should be an empty list");<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>      }<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      if (scannerContext == null) {<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>        throw new IllegalArgumentException("Scanner context cannot be null");<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      RpcCallContext rpcCall = RpcServer.getCurrentCall();<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span><a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>      // Save the initial progress from the Scanner context in these local variables. The progress<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      // may need to be reset a few times if rows are being filtered out so we save the initial<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      // progress.<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      int initialBatchProgress = scannerContext.getBatchProgress();<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>      long initialSizeProgress = scannerContext.getSizeProgress();<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>      long initialTimeProgress = scannerContext.getTimeProgress();<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      // The loop here is used only when at some point during the next we determine<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      // that due to effects of filters or otherwise, we have an empty row in the result.<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>      // Then we loop and try again. Otherwise, we must get out on the first iteration via return,<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>      // "true" if there's more data to read, "false" if there isn't (storeHeap is at a stop row,<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>      // and joinedHeap has no more data to read for the last row (if set, joinedContinuationRow).<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>      while (true) {<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>        // Starting to scan a new row. Reset the scanner progress according to whether or not<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>        // progress should be kept.<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>        if (scannerContext.getKeepProgress()) {<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>          // Progress should be kept. Reset to initial values seen at start of method invocation.<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>          scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>            initialTimeProgress);<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        } else {<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>          scannerContext.clearProgress();<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        }<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>        if (rpcCall != null) {<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>          // If a user specifies a too-restrictive or too-slow scanner, the<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>          // client might time out and disconnect while the server side<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>          // is still processing the request. We should abort aggressively<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>          // in that case.<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>          long afterTime = rpcCall.disconnectSince();<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>          if (afterTime &gt;= 0) {<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>            throw new CallerDisconnectedException(<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>                "Aborting on region " + getRegionInfo().getRegionNameAsString() + ", call " +<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>                    this + " after " + afterTime + " ms, since " +<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>                    "caller disconnected");<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          }<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span><a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>        // Let's see what we have in the storeHeap.<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>        Cell current = this.storeHeap.peek();<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span><a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>        boolean stopRow = isStopRow(current);<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // When has filter row is true it means that the all the cells for a particular row must be<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        // read before a filtering decision can be made. This means that filters where hasFilterRow<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>        // run the risk of encountering out of memory errors in the case that they are applied to a<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>        // table that has very large rows.<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>        boolean hasFilterRow = this.filter != null &amp;&amp; this.filter.hasFilterRow();<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span><a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>        // If filter#hasFilterRow is true, partial results are not allowed since allowing them<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>        // would prevent the filters from being evaluated. Thus, if it is true, change the<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>        // scope of any limits that could potentially create partial results to<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>        // LimitScope.BETWEEN_ROWS so that those limits are not reached mid-row<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>        if (hasFilterRow) {<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>          if (LOG.isTraceEnabled()) {<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>            LOG.trace("filter#hasFilterRow is true which prevents partial results from being "<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>                + " formed. Changing scope of limits that may create partials");<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span>          }<a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>          scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>          scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>        }<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span><a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>        // Check if we were getting data from the joinedHeap and hit the limit.<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>        // If not, then it's main path - getting results from storeHeap.<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>        if (joinedContinuationRow == null) {<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>          // First, check if we are at a stop row. If so, there are no more results.<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>          if (stopRow) {<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>            if (hasFilterRow) {<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>              filter.filterRowCells(results);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>            }<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>          }<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span><a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>          // Check if rowkey filter wants to exclude this row. If so, loop to next.<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>          // Technically, if we hit limits before on this row, we don't need this call.<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>          if (filterRowKey(current)) {<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>            // Typically the count of rows scanned is incremented inside #populateResult. However,<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>            // here we are filtering a row based purely on its row key, preventing us from calling<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>            // #populateResult. Thus, perform the necessary increment here to rows scanned metric<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>            incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>            if (!moreRows) {<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>            }<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>            results.clear();<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>            continue;<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>          }<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span><a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>          // Ok, we are good, let's try to get some results from the main heap.<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>          populateResult(results, this.storeHeap, scannerContext, current);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>            if (hasFilterRow) {<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>              throw new IncompatibleFilterException(<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>                  "Filter whose hasFilterRow() returns true is incompatible with scans that must "<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>                      + " stop mid-row because of a limit. ScannerContext:" + scannerContext);<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>            }<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>            return true;<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>          }<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span><a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>          Cell nextKv = this.storeHeap.peek();<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>          stopRow = nextKv == null || isStopRow(nextKv);<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>          // save that the row was empty before filters applied to it.<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>          final boolean isEmptyRow = results.isEmpty();<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span><a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>          // We have the part of the row necessary for filtering (all of it, usually).<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>          // First filter with the filterRow(List).<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>          FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>          if (hasFilterRow) {<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>            ret = filter.filterRowCellsWithRet(results);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span><a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>            // We don't know how the results have changed after being filtered. Must set progress<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>            // according to contents of results now. However, a change in the results should not<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>            // affect the time progress. Thus preserve whatever time progress has been made<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>            long timeProgress = scannerContext.getTimeProgress();<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>            if (scannerContext.getKeepProgress()) {<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>              scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>                initialTimeProgress);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>            } else {<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>              scannerContext.clearProgress();<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>            }<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>            scannerContext.setTimeProgress(timeProgress);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>            scannerContext.incrementBatchProgress(results.size());<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>            for (Cell cell : results) {<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>              scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOf(cell));<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>            }<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>          }<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span><a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>          if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>            results.clear();<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>            if (!moreRows) {<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>            }<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>            // This row was totally filtered out, if this is NOT the last row,<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>            // we should continue on. Otherwise, nothing else to do.<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>            if (!stopRow) continue;<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>          }<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>          // Ok, we are done with storeHeap for this row.<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>          // Now we may need to fetch additional, non-essential data into row.<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>          // These values are not needed for filter to work, so we postpone their<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>          // fetch to (possibly) reduce amount of data loads from disk.<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>          if (this.joinedHeap != null) {<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>            boolean mayHaveData = joinedHeapMayHaveData(current);<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>            if (mayHaveData) {<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>              joinedContinuationRow = current;<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>              populateFromJoinedHeap(results, scannerContext);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span><a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>              if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>                return true;<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>              }<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>            }<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>          }<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>        } else {<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>          // Populating from the joined heap was stopped by limits, populate some more.<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>          populateFromJoinedHeap(results, scannerContext);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>            return true;<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>          }<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>        }<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>        // We may have just called populateFromJoinedMap and hit the limits. If that is<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>        // the case, we need to call it again on the next next() invocation.<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span>        if (joinedContinuationRow != null) {<a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>        }<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span><a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>        // Finally, we are done with both joinedHeap and storeHeap.<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>        // Double check to prevent empty rows from appearing in result. It could be<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>        // the case when SingleColumnValueExcludeFilter is used.<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>        if (results.isEmpty()) {<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>          incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>          boolean moreRows = nextRow(scannerContext, current);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>          if (!moreRows) {<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>          }<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>          if (!stopRow) continue;<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>        }<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>        if (stopRow) {<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>        } else {<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>        }<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      }<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    }<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span><a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    protected void incrementCountOfRowsFilteredMetric(ScannerContext scannerContext) {<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span><a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      scannerContext.getMetrics().countOfRowsFiltered.incrementAndGet();<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    }<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span><a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    protected void incrementCountOfRowsScannedMetric(ScannerContext scannerContext) {<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span><a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      scannerContext.getMetrics().countOfRowsScanned.incrementAndGet();<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    }<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span><a name="line.6036"></a>
-<span 

<TRUNCATED>

[50/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 1f03463..86654f3 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160204" />
+    <meta name="Date-Revision-yyyymmdd" content="20160205" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -243,7 +243,7 @@
           <div id="banner">
         <div class="pull-left">
                                     <a href="http://hbasecon.com/" id="bannerLeft">
-                                                                                                <img src="images/hbasecon2016-stack-logo.jpg"  alt="hbasecon2016"/>
+                                                                                                <img src="images/hbasecon2016-stacked.png"  alt="hbasecon2016"/>
                 </a>
                       </div>
         <div class="pull-right">                                <a href="./" id="bannerRight">
@@ -280,10 +280,10 @@
 <th><img src="images/icon_warning_sml.gif" alt="" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" alt="" />&#160;Errors</th></tr>
 <tr class="b">
-<td>1672</td>
+<td>1673</td>
 <td>0</td>
 <td>0</td>
-<td>12853</td></tr></table></div>
+<td>12850</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -2126,7 +2126,7 @@
 <td><a href="#org.apache.hadoop.hbase.ipc.IPCUtil.java">org/apache/hadoop/hbase/ipc/IPCUtil.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>50</td></tr>
+<td>48</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.MasterCoprocessorRpcChannel.java">org/apache/hadoop/hbase/ipc/MasterCoprocessorRpcChannel.java</a></td>
 <td>0</td>
@@ -2181,7 +2181,7 @@
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcClientImpl.java">org/apache/hadoop/hbase/ipc/RpcClientImpl.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>27</td></tr>
+<td>26</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcExecutor.java">org/apache/hadoop/hbase/ipc/RpcExecutor.java</a></td>
 <td>0</td>
@@ -6033,7 +6033,7 @@
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_blocks.html#NeedBraces">NeedBraces</a></td>
-<td>1795</td>
+<td>1794</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>coding</td>
@@ -6129,7 +6129,7 @@
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3425</td>
+<td>3423</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>misc</td>
@@ -14553,7 +14553,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 64 has parse error. Missed HTML close tag 'code'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/HBaseAdmin.html#L1767">1767</a></td></tr>
 <tr class="a">
@@ -16832,13 +16832,13 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L354">354</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L358">358</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L357">357</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L361">361</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.java">org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.java</h3>
 <table border="0" class="table table-striped">
@@ -31955,7 +31955,7 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L32">32</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L31">31</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
@@ -32109,147 +32109,135 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L188">188</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L189">189</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L190">190</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L192">192</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L191">191</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L202">202</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L201">201</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L218">218</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L216">216</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L219">219</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L217">217</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L231">231</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L229">229</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L233">233</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L231">231</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L236">236</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L234">234</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L251">251</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L249">249</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L252">252</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L250">250</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L253">253</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L251">251</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L254">254</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L252">252</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L256">256</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L254">254</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L265">265</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L263">263</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L276">276</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L274">274</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L277">277</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L275">275</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L284">284</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L282">282</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L285">285</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L283">283</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L286">286</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L284">284</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L287">287</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L285">285</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L288">288</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L286">286</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L305">305</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/IPCUtil.html#L303">303</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.MasterCoprocessorRpcChannel.java">org/apache/hadoop/hbase/ipc/MasterCoprocessorRpcChannel.java</h3>
 <table border="0" class="table table-striped">
@@ -32576,131 +32564,125 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L903">903</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L916">916</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L914">914</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L944">944</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L942">942</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L959">959</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L957">957</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1018">1018</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1016">1016</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1023">1023</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1021">1021</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1057">1057</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1055">1055</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1159">1159</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1157">1157</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1160">1160</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1158">1158</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1208">1208</a></td></tr>
-<tr class="b">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1210">1210</a></td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1209">1209</a></td></tr>
-<tr class="a">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1211">1211</a></td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 8, expected level should be 6.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1229">1229</a></td></tr>
-<tr class="b">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1231">1231</a></td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' have incorrect indentation level 8, expected level should be 6.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1235">1235</a></td></tr>
-<tr class="a">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1237">1237</a></td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 10, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1237">1237</a></td></tr>
-<tr class="b">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1239">1239</a></td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 10, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1238">1238</a></td></tr>
-<tr class="a">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1240">1240</a></td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' have incorrect indentation level 8, expected level should be 6.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1239">1239</a></td></tr>
-<tr class="b">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1241">1241</a></td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1247">1247</a></td></tr>
-<tr class="a">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1249">1249</a></td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1256">1256</a></td></tr>
-<tr class="b">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1258">1258</a></td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1261">1261</a></td></tr>
-<tr class="a">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1263">1263</a></td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1309">1309</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcClientImpl.html#L1311">1311</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcExecutor.java">org/apache/hadoop/hbase/ipc/RpcExecutor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -32709,19 +32691,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcScheduler.java">org/apache/hadoop/hbase/ipc/RpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcScheduler.html#L22">22</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -32730,13 +32712,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcSchedulerContext.java">org/apache/hadoop/hbase/ipc/RpcSchedulerContext.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -32745,538 +32727,538 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcServer.java">org/apache/hadoop/hbase/ipc/RpcServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.ByteArrayInputStream' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L23">23</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.google.common.util.concurrent.ThreadFactoryBuilder' import.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L131">131</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L133">133</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L395">395</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L396">396</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L496">496</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 35 should have line break after.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L746">746</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L749">749</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L756">756</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L758">758</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L780">780</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L784">784</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L823">823</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L879">879</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L987">987</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L994">994</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method call' child have incorrect indentation level 9, expected level should be 10.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1109">1109</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child have incorrect indentation level 9, expected level should be 10.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1109">1109</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1127">1127</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1158">1158</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1159">1159</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1160">1160</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'attemptingUser' must be private and have accessor methods.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1277">1277</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' have incorrect indentation level 6, expected level should be 4.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1304">1304</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1373">1373</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child have incorrect indentation level 12, expected level should be 14.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1389">1389</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1390">1390</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child have incorrect indentation level 16, expected level should be 18.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1391">1391</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1393">1393</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1394">1394</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1398">1398</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child have incorrect indentation level 12, expected level should be 14.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1399">1399</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1400">1400</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'member def type' have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1400">1400</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1401">1401</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'member def type' have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1401">1401</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1402">1402</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child have incorrect indentation level 16, expected level should be 18.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1403">1403</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method call' child have incorrect indentation level 16, expected level should be 18.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1403">1403</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1404">1404</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1405">1405</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'member def modifier' have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1405">1405</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1405">1405</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1406">1406</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child have incorrect indentation level 16, expected level should be 18.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1407">1407</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1410">1410</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1411">1411</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method call' child have incorrect indentation level 14, expected level should be 16.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1411">1411</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L392">392</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1421">1421</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1588">1588</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1589">1589</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child have incorrect indentation level 6, expected level should be 8.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1673">1673</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child have incorrect indentation level 6, expected level should be 8.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1674">1674</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L393">393</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1695">1695</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L459">459</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1697">1697</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1753">1753</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1758">1758</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1760">1760</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1766">1766</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1783">1783</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1792">1792</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1801">1801</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1832">1832</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1833">1833</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1834">1834</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1874">1874</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1963">1963</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
-<td>'{' at column 35 should have line break after.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L706">706</a></td></tr>
+<td>'{' at column 11 should have line break after.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1965">1965</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 13 should have line break after.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1971">1971</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2035">2035</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2039">2039</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2040">2040</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2132">2132</a></td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L709">709</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2136">2136</a></td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 46 should have line break after.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2157">2157</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L716">716</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2167">2167</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L718">718</a></td></tr>
+<td>'if' construct must use '{}'s.</td>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2189">2189</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L740">740</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2190">2190</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L744">744</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2263">2263</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L783">783</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2268">2268</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L839">839</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2269">2269</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L946">946</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L953">953</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method call' child have incorrect indentation level 9, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1068">1068</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child have incorrect indentation level 9, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1068">1068</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1086">1086</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1117">1117</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1118">1118</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1119">1119</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'attemptingUser' must be private and have accessor methods.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1236">1236</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' have incorrect indentation level 6, expected level should be 4.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1263">1263</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1332">1332</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child have incorrect indentation level 12, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1347">1347</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1348">1348</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child have incorrect indentation level 16, expected level should be 18.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1349">1349</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1351">1351</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1352">1352</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1356">1356</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child have incorrect indentation level 12, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1357">1357</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1358">1358</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def type' have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1358">1358</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1359">1359</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def type' have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1359">1359</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1360">1360</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child have incorrect indentation level 16, expected level should be 18.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1361">1361</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method call' child have incorrect indentation level 16, expected level should be 18.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1361">1361</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1362">1362</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1363">1363</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def modifier' have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1363">1363</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1363">1363</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1364">1364</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child have incorrect indentation level 16, expected level should be 18.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1365">1365</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1368">1368</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1369">1369</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method call' child have incorrect indentation level 14, expected level should be 16.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1369">1369</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1379">1379</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1546">1546</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1547">1547</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1629">1629</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1630">1630</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1650">1650</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1652">1652</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1708">1708</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1713">1713</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1715">1715</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1721">1721</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1738">1738</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1747">1747</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1756">1756</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1786">1786</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1787">1787</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1788">1788</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1828">1828</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1918">1918</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 11 should have line break after.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1920">1920</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 13 should have line break after.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1926">1926</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1990">1990</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1994">1994</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2362">2362</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L1995">1995</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2087">2087</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2091">2091</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 46 should have line break after.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2112">2112</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2122">2122</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2144">2144</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2145">2145</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2218">2218</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2223">2223</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2224">2224</a></td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2317">2317</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2380">2380</a></td></tr>
-<tr class="b">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2425">2425</a></td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2396">2396</a></td></tr>
-<tr class="a">
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2441">2441</a></td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2401">2401</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServer.html#L2446">2446</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.RpcServerInterface.java">org/apache/hadoop/hbase/ipc/RpcServerInterface.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.CellScanner' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServerInterface.html#L27">27</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.google.common.annotations.VisibleForTesting' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/RpcServerInterface.html#L33">33</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -33285,13 +33267,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.ServerRpcController.java">org/apache/hadoop/hbase/ipc/ServerRpcController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -33300,61 +33282,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.java">org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.html#L100">100</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.html#L104">104</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child have incorrect indentation level 3, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.html#L157">157</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child have incorrect indentation level 5, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.html#L158">158</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>FileTabCharacter</td>
 <td>File contains tab characters (this is the first instance).</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.html#L163">163</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.html#L181">181</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.html#L182">182</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.html#L188">188</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -33363,13 +33345,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ipc.TimeLimitedRpcController.java">org/apache/hadoop/hbase/ipc/TimeLimitedRpcController.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -33378,31 +33360,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.Driver.java">org/apache/hadoop/hbase/mapred/Driver.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.google.common.annotations.VisibleForTesting' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/Driver.html#L26">26</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/Driver.html#L32">32</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/Driver.html#L44">44</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -33411,73 +33393,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.GroupingTableMap.java">org/apache/hadoop/hbase/mapred/GroupingTableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/GroupingTableMap.html#L26">26</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' have incorrect indentation level 0, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/GroupingTableMap.html#L44">44</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' have incorrect indentation level 0, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/GroupingTableMap.html#L45">45</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/GroupingTableMap.html#L63">63</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/GroupingTableMap.html#L91">91</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/GroupingTableMap.html#L92">92</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/GroupingTableMap.html#L93">93</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/GroupingTableMap.html#L94">94</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/GroupingTableMap.html#L95">95</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/GroupingTableMap.html#L114">114</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -33486,31 +33468,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.HRegionPartitioner.java">org/apache/hadoop/hbase/mapred/HRegionPartitioner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/HRegionPartitioner.html#L43">43</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/HRegionPartitioner.html#L44">44</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' have incorrect indentation level 0, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/HRegionPartitioner.html#L49">49</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -33519,55 +33501,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.IdentityTableMap.java">org/apache/hadoop/hbase/mapred/IdentityTableMap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableMap.html#L26">26</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' have incorrect indentation level 0, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableMap.html#L38">38</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' have incorrect indentation level 0, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableMap.html#L39">39</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableMap.html#L65">65</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableMap.html#L66">66</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableMap.html#L67">67</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableMap.html#L68">68</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -33576,49 +33558,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.IdentityTableReduce.java">org/apache/hadoop/hbase/mapred/IdentityTableReduce.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' have incorrect indentation level 0, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableReduce.html#L40">40</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' have incorrect indentation level 0, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableReduce.html#L41">41</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableReduce.html#L48">48</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableReduce.html#L49">49</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableReduce.html#L50">50</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/IdentityTableReduce.html#L51">51</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -33627,37 +33609,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.MultiTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.html#L36">36</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.html#L120">120</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.html#L121">121</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.html#L122">122</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -33666,49 +33648,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.RowCounter.java">org/apache/hadoop/hbase/mapred/RowCounter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configured' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/RowCounter.html#L25">25</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' have incorrect indentation level 2, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/RowCounter.html#L53">53</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/RowCounter.html#L61">61</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/RowCounter.html#L74">74</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/RowCounter.html#L76">76</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/RowCounter.html#L116">116</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -33717,13 +33699,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableInputFormat.java">org/apache/hadoop/hbase/mapred/TableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -33732,43 +33714,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapred.TableInputFormatBase.java">org/apache/hadoop/hbase/mapred/TableInputFormatBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/mapred/TableInputFormatBase.html#L28">28</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="

<TRUNCATED>

[12/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
index e2c4389..d03724e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
@@ -5185,3056 +5185,3058 @@
 <span class="sourceLineNo">5177</span>   * @param readLock is the lock reader or writer. True indicates that a non-exlcusive<a name="line.5177"></a>
 <span class="sourceLineNo">5178</span>   *                 lock is requested<a name="line.5178"></a>
 <span class="sourceLineNo">5179</span>   */<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    // Make sure the row is inside of this region before getting the lock for it.<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    checkRow(row, "row lock");<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    // create an object to use a a key in the row lock map<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    HashedBytes rowKey = new HashedBytes(row);<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    RowLockContext rowLockContext = null;<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    RowLockImpl result = null;<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    TraceScope traceScope = null;<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span><a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    // If we're tracing start a span to show how long this took.<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>    if (Trace.isTracing()) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>      traceScope = Trace.startSpan("HRegion.getRowLock");<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>      traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock"));<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>    }<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span><a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    try {<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>      // Keep trying until we have a lock or error out.<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>      // TODO: do we need to add a time component here?<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>      while (result == null) {<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span><a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>        // Try adding a RowLockContext to the lockedRows.<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>        // If we can add it then there's no other transactions currently running.<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        rowLockContext = new RowLockContext(rowKey);<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span><a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>        // if there was a running transaction then there's already a context.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>        if (existingContext != null) {<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>          rowLockContext = existingContext;<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>        }<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span><a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>        // Now try an get the lock.<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>        //<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>        // This can fail as<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>        if (readLock) {<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>          result = rowLockContext.newReadLock();<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>        } else {<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>          result = rowLockContext.newWriteLock();<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>        }<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      }<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      if (!result.getLock().tryLock(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>        if (traceScope != null) {<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>          traceScope.getSpan().addTimelineAnnotation("Failed to get row lock");<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>        }<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>        result = null;<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>        // Clean up the counts just in case this was the thing keeping the context alive.<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        rowLockContext.cleanUp();<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        throw new IOException("Timed out waiting for lock for row: " + rowKey);<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>      }<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>      return result;<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>    } catch (InterruptedException ie) {<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>      LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>      iie.initCause(ie);<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>      if (traceScope != null) {<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>        traceScope.getSpan().addTimelineAnnotation("Interrupted exception getting row lock");<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>      }<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>      Thread.currentThread().interrupt();<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>      throw iie;<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    } finally {<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>      if (traceScope != null) {<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>        traceScope.close();<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>      }<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    }<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>  }<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span><a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>  @Override<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>  public void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>    if (rowLocks != null) {<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>      for (RowLock rowLock : rowLocks) {<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span>        rowLock.release();<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>      }<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>      rowLocks.clear();<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    }<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>  }<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span><a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>  @VisibleForTesting<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>  class RowLockContext {<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span>    private final HashedBytes row;<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    final AtomicBoolean usable = new AtomicBoolean(true);<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    final Object lock = new Object();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    RowLockContext(HashedBytes row) {<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>      this.row = row;<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    }<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span><a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    RowLockImpl newWriteLock() {<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>      Lock l = readWriteLock.writeLock();<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>      return getRowLock(l);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    }<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    RowLockImpl newReadLock() {<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>      Lock l = readWriteLock.readLock();<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>      return getRowLock(l);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    private RowLockImpl getRowLock(Lock l) {<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>      count.incrementAndGet();<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>      synchronized (lock) {<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        if (usable.get()) {<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>          return new RowLockImpl(this, l);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        } else {<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>          return null;<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        }<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>      }<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    }<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span><a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    void cleanUp() {<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>      long c = count.decrementAndGet();<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>      if (c &lt;= 0) {<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        synchronized (lock) {<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>          if (count.get() &lt;= 0 ){<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>            usable.set(false);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>            RowLockContext removed = lockedRows.remove(row);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>            assert removed == this: "we should never remove a different context";<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>          }<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        }<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>      }<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    }<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span><a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    @Override<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    public String toString() {<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>      return "RowLockContext{" +<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>          "row=" + row +<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>          ", readWriteLock=" + readWriteLock +<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>          ", count=" + count +<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>          '}';<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    }<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>  }<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span><a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>  /**<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>   * Class used to represent a lock on a row.<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>   */<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>  public static class RowLockImpl implements RowLock {<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    private final RowLockContext context;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    private final Lock lock;<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span><a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    public RowLockImpl(RowLockContext context, Lock lock) {<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>      this.context = context;<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>      this.lock = lock;<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    }<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span><a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    public Lock getLock() {<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>      return lock;<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    }<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span><a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    @VisibleForTesting<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>    public RowLockContext getContext() {<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      return context;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    }<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span><a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    @Override<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    public void release() {<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>      lock.unlock();<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>      context.cleanUp();<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>    }<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span><a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    @Override<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    public String toString() {<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>      return "RowLockImpl{" +<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>          "context=" + context +<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>          ", lock=" + lock +<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>          '}';<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>    }<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  }<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span><a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>  /**<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>   * Determines whether multiple column families are present<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>   * Precondition: familyPaths is not null<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>   *<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>   * @param familyPaths List of (column family, hfilePath)<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>   */<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    boolean multipleFamilies = false;<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    byte[] family = null;<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    for (Pair&lt;byte[], String&gt; pair : familyPaths) {<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>      byte[] fam = pair.getFirst();<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>      if (family == null) {<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>        family = fam;<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>      } else if (!Bytes.equals(family, fam)) {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>        multipleFamilies = true;<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>        break;<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>      }<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    }<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    return multipleFamilies;<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>  }<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span><a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  @Override<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>  public boolean bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, boolean assignSeqId,<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      BulkLoadListener bulkLoadListener) throws IOException {<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>    long seqId = -1;<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;byte[], List&lt;Path&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    Preconditions.checkNotNull(familyPaths);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    // we need writeLock for multi-family bulk load<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    try {<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      this.writeRequestsCount.increment();<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      // There possibly was a split that happened between when the split keys<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // were gathered and before the HRegion's write lock was taken.  We need<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      // to validate the HFile region before attempting to bulk load all of them<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>      List&lt;IOException&gt; ioes = new ArrayList&lt;IOException&gt;();<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;Pair&lt;byte[], String&gt;&gt;();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>        byte[] familyName = p.getFirst();<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>        String path = p.getSecond();<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span><a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>        Store store = getStore(familyName);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>        if (store == null) {<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>          IOException ioe = new org.apache.hadoop.hbase.DoNotRetryIOException(<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>              "No such column family " + Bytes.toStringBinary(familyName));<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>          ioes.add(ioe);<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>        } else {<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>          try {<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>            store.assertBulkLoadHFileOk(new Path(path));<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>          } catch (WrongRegionException wre) {<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>            // recoverable (file doesn't fit in region)<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>            failures.add(p);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>          } catch (IOException ioe) {<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>            // unrecoverable (hdfs problem)<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>            ioes.add(ioe);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>          }<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>        }<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>      }<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span><a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>      // validation failed because of some sort of IO problem.<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>      if (ioes.size() != 0) {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>        IOException e = MultipleIOException.createIOException(ioes);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>        LOG.error("There were one or more IO errors when checking if the bulk load is ok.", e);<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>        throw e;<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>      }<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span><a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>      // validation failed, bail out before doing anything permanent.<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>      if (failures.size() != 0) {<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>        StringBuilder list = new StringBuilder();<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>        for (Pair&lt;byte[], String&gt; p : failures) {<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>              .append(p.getSecond());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>        }<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        // problem when validating<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>        LOG.warn("There was a recoverable bulk load failure likely due to a" +<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>            " split.  These (family, HFile) pairs were not loaded: " + list);<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>        return false;<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>      }<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span><a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>      // We need to assign a sequential ID that's in between two memstores in order to preserve<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>      // the guarantee that all the edits lower than the highest sequential ID from all the<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>      // HFiles are flushed on disk. See HBASE-10958.  The sequence id returned when we flush is<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>      // a sequence id that we can be sure is beyond the last hfile written).<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>      if (assignSeqId) {<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        FlushResult fs = flushcache(true, false);<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>        if (fs.isFlushSucceeded()) {<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>        } else {<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>          throw new IOException("Could not bulk load with an assigned sequential ID because the "+<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>            "flush didn't run. Reason for not flushing: " + ((FlushResultImpl)fs).failureReason);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>        }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span>      }<a name="line.5441"></a>
-<span class="sourceLineNo">5442</span><a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        byte[] familyName = p.getFirst();<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>        String path = p.getSecond();<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>        Store store = getStore(familyName);<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>        try {<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>          String finalPath = path;<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>          if (bulkLoadListener != null) {<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path);<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>          }<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>          Path commitedStoreFile = store.bulkLoadHFile(finalPath, seqId);<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span><a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>          if(storeFiles.containsKey(familyName)) {<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>            storeFiles.get(familyName).add(commitedStoreFile);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>          } else {<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>            List&lt;Path&gt; storeFileNames = new ArrayList&lt;Path&gt;();<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>            storeFileNames.add(commitedStoreFile);<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>            storeFiles.put(familyName, storeFileNames);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>          }<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>          if (bulkLoadListener != null) {<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>            bulkLoadListener.doneBulkLoad(familyName, path);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>          }<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>        } catch (IOException ioe) {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>          // A failure here can cause an atomicity violation that we currently<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>          // cannot recover from since it is likely a failed HDFS operation.<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span><a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>          // TODO Need a better story for reverting partial failures due to HDFS.<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>          LOG.error("There was a partial failure due to IO when attempting to" +<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>              " load " + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>          if (bulkLoadListener != null) {<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>            try {<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>              bulkLoadListener.failedBulkLoad(familyName, path);<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>            } catch (Exception ex) {<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>              LOG.error("Error while calling failedBulkLoad for family " +<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>                  Bytes.toString(familyName) + " with path " + path, ex);<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>            }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>          }<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>          throw ioe;<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>        }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>      }<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span><a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>      return true;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    } finally {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        // write a bulk load event when not all hfiles are loaded<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        try {<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>          WALProtos.BulkLoadDescriptor loadDescriptor = ProtobufUtil.toBulkLoadDescriptor(<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>              this.getRegionInfo().getTable(),<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>              ByteStringer.wrap(this.getRegionInfo().getEncodedNameAsBytes()), storeFiles, seqId);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>          WALUtil.writeBulkLoadMarkerAndSync(wal, this.htableDescriptor, getRegionInfo(),<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>              loadDescriptor, mvcc);<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span>        } catch (IOException ioe) {<a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>          if (this.rsServices != null) {<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>            // Have to abort region server because some hfiles has been loaded but we can't write<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>            // the event into WAL<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>          }<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>        }<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>      }<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span><a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>      closeBulkRegionOperation();<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    }<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>  }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span><a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  @Override<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>  public boolean equals(Object o) {<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>                                                ((HRegion) o).getRegionInfo().getRegionName());<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>  }<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span><a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>  @Override<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>  public int hashCode() {<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    return Bytes.hashCode(getRegionInfo().getRegionName());<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>  }<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span><a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>  @Override<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>  public String toString() {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>    return getRegionInfo().getRegionNameAsString();<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>  }<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span><a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>  /**<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>   * RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>   */<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>  class RegionScannerImpl implements RegionScanner, org.apache.hadoop.hbase.ipc.RpcCallback {<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    // Package local for testability<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>    KeyValueHeap storeHeap = null;<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>    /** Heap of key-values that are not essential for the provided filters and are thus read<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>     * on demand, if on-demand column family loading is enabled.*/<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>    KeyValueHeap joinedHeap = null;<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>    /**<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>     * If the joined heap data gathering is interrupted due to scan limits, this will<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>     * contain the row for which we are populating the values.*/<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>    protected Cell joinedContinuationRow = null;<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    private boolean filterClosed = false;<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span><a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>    protected final int isScan;<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    protected final byte[] stopRow;<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    protected final HRegion region;<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    protected final CellComparator comparator;<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>    protected boolean copyCellsFromSharedMem = false;<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span><a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>    private final long readPt;<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>    private final long maxResultSize;<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>    private final ScannerContext defaultScannerContext;<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>    private final FilterWrapper filter;<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span><a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    @Override<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    public HRegionInfo getRegionInfo() {<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>      return region.getRegionInfo();<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>    }<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span><a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    public void setCopyCellsFromSharedMem(boolean copyCells) {<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>      this.copyCellsFromSharedMem = copyCells;<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    }<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span><a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    RegionScannerImpl(Scan scan, List&lt;KeyValueScanner&gt; additionalScanners, HRegion region,<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        boolean copyCellsFromSharedMem)<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>        throws IOException {<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>      this.region = region;<a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      this.maxResultSize = scan.getMaxResultSize();<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>      if (scan.hasFilter()) {<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        this.filter = new FilterWrapper(scan.getFilter());<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>      } else {<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>        this.filter = null;<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>      }<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      this.comparator = region.getCellCompartor();<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>      /**<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>       * By default, calls to next/nextRaw must enforce the batch limit. Thus, construct a default<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>       * scanner context that can be used to enforce the batch limit in the event that a<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>       * ScannerContext is not specified during an invocation of next/nextRaw<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>       */<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>      defaultScannerContext = ScannerContext.newBuilder()<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>          .setBatchLimit(scan.getBatch()).build();<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span><a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) &amp;&amp; !scan.isGetScan()) {<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>        this.stopRow = null;<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span>      } else {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        this.stopRow = scan.getStopRow();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>      }<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      // If we are doing a get, we want to be [startRow,endRow]. Normally<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>      // it is [startRow,endRow) and if startRow=endRow we get nothing.<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      this.isScan = scan.isGetScan() ? 1 : 0;<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span><a name="line.5584"></a>
-<span class="sourceLineNo">5585</span>      // synchronize on scannerReadPoints so that nobody calculates<a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>      // getSmallestReadPoint, before scannerReadPoints is updated.<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      IsolationLevel isolationLevel = scan.getIsolationLevel();<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      synchronized(scannerReadPoints) {<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>        this.readPt = getReadpoint(isolationLevel);<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        scannerReadPoints.put(this, this.readPt);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>      }<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span><a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>      // Here we separate all scanners into two lists - scanner that provide data required<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      // by the filter to operate (scanners list) and all others (joinedScanners list).<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>      List&lt;KeyValueScanner&gt; scanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>      List&lt;KeyValueScanner&gt; joinedScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>      if (additionalScanners != null) {<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>        scanners.addAll(additionalScanners);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>      }<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span><a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>      for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; entry : scan.getFamilyMap().entrySet()) {<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>        Store store = stores.get(entry.getKey());<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>        KeyValueScanner scanner;<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span>        try {<a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>          scanner = store.getScanner(scan, entry.getValue(), this.readPt);<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>        } catch (FileNotFoundException e) {<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>          throw handleFileNotFound(e);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>        }<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>        if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand()<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>          || this.filter.isFamilyEssential(entry.getKey())) {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>          scanners.add(scanner);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>        } else {<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>          joinedScanners.add(scanner);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>        }<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      }<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>      this.copyCellsFromSharedMem = copyCellsFromSharedMem;<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      initializeKVHeap(scanners, joinedScanners, region);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    }<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span><a name="line.5619"></a>
-<span class="sourceLineNo">5620</span>    protected void initializeKVHeap(List&lt;KeyValueScanner&gt; scanners,<a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>        List&lt;KeyValueScanner&gt; joinedScanners, HRegion region)<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>        throws IOException {<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      this.storeHeap = new KeyValueHeap(scanners, comparator);<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      if (!joinedScanners.isEmpty()) {<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>        this.joinedHeap = new KeyValueHeap(joinedScanners, comparator);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span>      }<a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    }<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span><a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    @Override<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    public long getMaxResultSize() {<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>      return maxResultSize;<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    @Override<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    public long getMvccReadPoint() {<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      return this.readPt;<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span>    }<a name="line.5637"></a>
-<span class="sourceLineNo">5638</span><a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>    @Override<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>    public int getBatch() {<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      return this.defaultScannerContext.getBatchLimit();<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>    }<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    /**<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>     * Reset both the filter and the old filter.<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>     *<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>     * @throws IOException in case a filter raises an I/O exception.<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>     */<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    protected void resetFilters() throws IOException {<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>      if (filter != null) {<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>        filter.reset();<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span>      }<a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    }<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span><a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    @Override<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>    public boolean next(List&lt;Cell&gt; outResults)<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>        throws IOException {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>      // apply the batching limit by default<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>      return next(outResults, defaultScannerContext);<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>    }<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span><a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    @Override<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    public synchronized boolean next(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    throws IOException {<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>      if (this.filterClosed) {<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>        throw new UnknownScannerException("Scanner was closed (timed out?) " +<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>            "after we renewed it. Could be caused by a very slow scanner " +<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>            "or a lengthy garbage collection");<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>      }<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>      startRegionOperation(Operation.SCAN);<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>      readRequestsCount.increment();<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>      try {<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>        return nextRaw(outResults, scannerContext);<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>      } finally {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>        closeRegionOperation(Operation.SCAN);<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>      }<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>    }<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span><a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    @Override<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    public boolean nextRaw(List&lt;Cell&gt; outResults) throws IOException {<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      // Use the RegionScanner's context by default<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return nextRaw(outResults, defaultScannerContext);<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span><a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>    @Override<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>    public boolean nextRaw(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        throws IOException {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>      if (storeHeap == null) {<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        // scanner is closed<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>        throw new UnknownScannerException("Scanner was closed");<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      }<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      boolean moreValues = false;<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      try {<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>        if (outResults.isEmpty()) {<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>          // Usually outResults is empty. This is true when next is called<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>          // to handle scan or get operation.<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>          moreValues = nextInternal(outResults, scannerContext);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        } else {<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>          List&lt;Cell&gt; tmpList = new ArrayList&lt;Cell&gt;();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>          moreValues = nextInternal(tmpList, scannerContext);<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>          outResults.addAll(tmpList);<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        }<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span><a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        // If the size limit was reached it means a partial Result is being<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>        // returned. Returning a<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        // partial Result means that we should not reset the filters; filters<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>        // should only be reset in<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>        // between rows<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>        if (!scannerContext.partialResultFormed()) resetFilters();<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span><a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>        if (isFilterDoneInternal()) {<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>          moreValues = false;<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>        }<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span><a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        // If copyCellsFromSharedMem = true, then we need to copy the cells. Otherwise<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>        // it is a call coming from the RsRpcServices.scan().<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        if (copyCellsFromSharedMem &amp;&amp; !outResults.isEmpty()) {<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>          // Do the copy of the results here.<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          ListIterator&lt;Cell&gt; listItr = outResults.listIterator();<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          Cell cell = null;<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          while (listItr.hasNext()) {<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>            cell = listItr.next();<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>            if (cell instanceof ShareableMemory) {<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>              listItr.set(((ShareableMemory) cell).cloneToCell());<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>            }<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>          }<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>        }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>      } finally {<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        if (copyCellsFromSharedMem) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          // In case of copyCellsFromSharedMem==true (where the CPs wrap a scanner) we return<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          // the blocks then and there (for wrapped CPs)<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>          this.shipped();<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>      return moreValues;<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    }<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    /**<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>     * @return true if more cells exist after this batch, false if scanner is done<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>     */<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>    private boolean populateFromJoinedHeap(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>            throws IOException {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      assert joinedContinuationRow != null;<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>      boolean moreValues = populateResult(results, this.joinedHeap, scannerContext,<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>          joinedContinuationRow);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      if (!scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>        // We are done with this row, reset the continuation.<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>        joinedContinuationRow = null;<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span>      }<a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>      // As the data is obtained from two independent heaps, we need to<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>      // ensure that result list is sorted, because Result relies on that.<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>      Collections.sort(results, comparator);<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>      return moreValues;<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>    }<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    /**<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>     * Fetches records with currentRow into results list, until next row, batchLimit (if not -1) is<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>     * reached, or remainingResultSize (if not -1) is reaced<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>     * @param heap KeyValueHeap to fetch data from.It must be positioned on correct row before call.<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>     * @param scannerContext<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>     * @param currentRowCell<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>     * @return state of last call to {@link KeyValueHeap#next()}<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>     */<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    private boolean populateResult(List&lt;Cell&gt; results, KeyValueHeap heap,<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>        ScannerContext scannerContext, Cell currentRowCell) throws IOException {<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      Cell nextKv;<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      boolean moreCellsInRow = false;<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      boolean tmpKeepProgress = scannerContext.getKeepProgress();<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      // Scanning between column families and thus the scope is between cells<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      LimitScope limitScope = LimitScope.BETWEEN_CELLS;<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      try {<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>        do {<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>          // We want to maintain any progress that is made towards the limits while scanning across<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>          // different column families. To do this, we toggle the keep progress flag on during calls<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>          // to the StoreScanner to ensure that any progress made thus far is not wiped away.<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>          scannerContext.setKeepProgress(true);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>          heap.next(results, scannerContext);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>          scannerContext.setKeepProgress(tmpKeepProgress);<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>          nextKv = heap.peek();<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>          moreCellsInRow = moreCellsInRow(nextKv, currentRowCell);<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>          if (!moreCellsInRow) incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>          if (scannerContext.checkBatchLimit(limitScope)) {<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>            return scannerContext.setScannerState(NextState.BATCH_LIMIT_REACHED).hasMoreValues();<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>          } else if (scannerContext.checkSizeLimit(limitScope)) {<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>            ScannerContext.NextState state =<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>              moreCellsInRow? NextState.SIZE_LIMIT_REACHED_MID_ROW: NextState.SIZE_LIMIT_REACHED;<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>          } else if (scannerContext.checkTimeLimit(limitScope)) {<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>            ScannerContext.NextState state =<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>              moreCellsInRow? NextState.TIME_LIMIT_REACHED_MID_ROW: NextState.TIME_LIMIT_REACHED;<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>          }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>        } while (moreCellsInRow);<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>      } catch (FileNotFoundException e) {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>        throw handleFileNotFound(e);<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>      }<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      return nextKv != null;<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    }<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span><a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    /**<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>     * Based on the nextKv in the heap, and the current row, decide whether or not there are more<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>     * cells to be read in the heap. If the row of the nextKv in the heap matches the current row<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>     * then there are more cells to be read in the row.<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>     * @param nextKv<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>     * @param currentRowCell<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>     * @return true When there are more cells in the row to be read<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>     */<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>    private boolean moreCellsInRow(final Cell nextKv, Cell currentRowCell) {<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      return nextKv != null &amp;&amp; CellUtil.matchingRow(nextKv, currentRowCell);<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>    }<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span><a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>    /*<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>     * @return True if a filter rules the scanner is over, done.<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>     */<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    @Override<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    public synchronized boolean isFilterDone() throws IOException {<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      return isFilterDoneInternal();<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    }<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span><a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>    private boolean isFilterDoneInternal() throws IOException {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      return this.filter != null &amp;&amp; this.filter.filterAllRemaining();<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>    }<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span><a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    private boolean nextInternal(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>        throws IOException {<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>      if (!results.isEmpty()) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>        throw new IllegalArgumentException("First parameter should be an empty list");<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>      }<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      if (scannerContext == null) {<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>        throw new IllegalArgumentException("Scanner context cannot be null");<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      RpcCallContext rpcCall = RpcServer.getCurrentCall();<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span><a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>      // Save the initial progress from the Scanner context in these local variables. The progress<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      // may need to be reset a few times if rows are being filtered out so we save the initial<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      // progress.<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      int initialBatchProgress = scannerContext.getBatchProgress();<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>      long initialSizeProgress = scannerContext.getSizeProgress();<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>      long initialTimeProgress = scannerContext.getTimeProgress();<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      // The loop here is used only when at some point during the next we determine<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      // that due to effects of filters or otherwise, we have an empty row in the result.<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>      // Then we loop and try again. Otherwise, we must get out on the first iteration via return,<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>      // "true" if there's more data to read, "false" if there isn't (storeHeap is at a stop row,<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>      // and joinedHeap has no more data to read for the last row (if set, joinedContinuationRow).<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>      while (true) {<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>        // Starting to scan a new row. Reset the scanner progress according to whether or not<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>        // progress should be kept.<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>        if (scannerContext.getKeepProgress()) {<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>          // Progress should be kept. Reset to initial values seen at start of method invocation.<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>          scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>            initialTimeProgress);<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        } else {<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>          scannerContext.clearProgress();<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        }<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>        if (rpcCall != null) {<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>          // If a user specifies a too-restrictive or too-slow scanner, the<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>          // client might time out and disconnect while the server side<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>          // is still processing the request. We should abort aggressively<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>          // in that case.<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>          long afterTime = rpcCall.disconnectSince();<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>          if (afterTime &gt;= 0) {<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>            throw new CallerDisconnectedException(<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>                "Aborting on region " + getRegionInfo().getRegionNameAsString() + ", call " +<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>                    this + " after " + afterTime + " ms, since " +<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>                    "caller disconnected");<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          }<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span><a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>        // Let's see what we have in the storeHeap.<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>        Cell current = this.storeHeap.peek();<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span><a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>        boolean stopRow = isStopRow(current);<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // When has filter row is true it means that the all the cells for a particular row must be<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        // read before a filtering decision can be made. This means that filters where hasFilterRow<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>        // run the risk of encountering out of memory errors in the case that they are applied to a<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>        // table that has very large rows.<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>        boolean hasFilterRow = this.filter != null &amp;&amp; this.filter.hasFilterRow();<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span><a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>        // If filter#hasFilterRow is true, partial results are not allowed since allowing them<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>        // would prevent the filters from being evaluated. Thus, if it is true, change the<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>        // scope of any limits that could potentially create partial results to<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>        // LimitScope.BETWEEN_ROWS so that those limits are not reached mid-row<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>        if (hasFilterRow) {<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>          if (LOG.isTraceEnabled()) {<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>            LOG.trace("filter#hasFilterRow is true which prevents partial results from being "<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>                + " formed. Changing scope of limits that may create partials");<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span>          }<a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>          scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>          scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>        }<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span><a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>        // Check if we were getting data from the joinedHeap and hit the limit.<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>        // If not, then it's main path - getting results from storeHeap.<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>        if (joinedContinuationRow == null) {<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>          // First, check if we are at a stop row. If so, there are no more results.<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>          if (stopRow) {<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>            if (hasFilterRow) {<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>              filter.filterRowCells(results);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>            }<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>          }<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span><a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>          // Check if rowkey filter wants to exclude this row. If so, loop to next.<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>          // Technically, if we hit limits before on this row, we don't need this call.<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>          if (filterRowKey(current)) {<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>            // Typically the count of rows scanned is incremented inside #populateResult. However,<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>            // here we are filtering a row based purely on its row key, preventing us from calling<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>            // #populateResult. Thus, perform the necessary increment here to rows scanned metric<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>            incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>            if (!moreRows) {<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>            }<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>            results.clear();<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>            continue;<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>          }<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span><a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>          // Ok, we are good, let's try to get some results from the main heap.<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>          populateResult(results, this.storeHeap, scannerContext, current);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>            if (hasFilterRow) {<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>              throw new IncompatibleFilterException(<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>                  "Filter whose hasFilterRow() returns true is incompatible with scans that must "<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>                      + " stop mid-row because of a limit. ScannerContext:" + scannerContext);<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>            }<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>            return true;<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>          }<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span><a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>          Cell nextKv = this.storeHeap.peek();<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>          stopRow = nextKv == null || isStopRow(nextKv);<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>          // save that the row was empty before filters applied to it.<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>          final boolean isEmptyRow = results.isEmpty();<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span><a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>          // We have the part of the row necessary for filtering (all of it, usually).<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>          // First filter with the filterRow(List).<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>          FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>          if (hasFilterRow) {<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>            ret = filter.filterRowCellsWithRet(results);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span><a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>            // We don't know how the results have changed after being filtered. Must set progress<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>            // according to contents of results now. However, a change in the results should not<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>            // affect the time progress. Thus preserve whatever time progress has been made<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>            long timeProgress = scannerContext.getTimeProgress();<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>            if (scannerContext.getKeepProgress()) {<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>              scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>                initialTimeProgress);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>            } else {<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>              scannerContext.clearProgress();<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>            }<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>            scannerContext.setTimeProgress(timeProgress);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>            scannerContext.incrementBatchProgress(results.size());<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>            for (Cell cell : results) {<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>              scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOf(cell));<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>            }<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>          }<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span><a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>          if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>            results.clear();<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>            if (!moreRows) {<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>            }<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>            // This row was totally filtered out, if this is NOT the last row,<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>            // we should continue on. Otherwise, nothing else to do.<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>            if (!stopRow) continue;<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>          }<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>          // Ok, we are done with storeHeap for this row.<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>          // Now we may need to fetch additional, non-essential data into row.<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>          // These values are not needed for filter to work, so we postpone their<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>          // fetch to (possibly) reduce amount of data loads from disk.<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>          if (this.joinedHeap != null) {<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>            boolean mayHaveData = joinedHeapMayHaveData(current);<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>            if (mayHaveData) {<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>              joinedContinuationRow = current;<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>              populateFromJoinedHeap(results, scannerContext);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span><a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>              if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>                return true;<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>              }<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>            }<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>          }<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>        } else {<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>          // Populating from the joined heap was stopped by limits, populate some more.<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>          populateFromJoinedHeap(results, scannerContext);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>            return true;<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>          }<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>        }<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>        // We may have just called populateFromJoinedMap and hit the limits. If that is<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>        // the case, we need to call it again on the next next() invocation.<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span>        if (joinedContinuationRow != null) {<a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>        }<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span><a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>        // Finally, we are done with both joinedHeap and storeHeap.<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>        // Double check to prevent empty rows from appearing in result. It could be<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>        // the case when SingleColumnValueExcludeFilter is used.<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>        if (results.isEmpty()) {<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>          incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>          boolean moreRows = nextRow(scannerContext, current);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>          if (!moreRows) {<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>          }<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>          if (!stopRow) continue;<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>        }<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>        if (stopRow) {<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>        } else {<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>        }<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      }<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    }<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span><a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    protected void incrementCountOfRowsFilteredMetric(ScannerContext scannerContext) {<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span><a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      scannerContext.getMetrics().countOfRowsFiltered.incrementAndGet();<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    }<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span><a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    protected void incrementCountOfRowsScannedMetric(ScannerContext scannerContext) {<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span><a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      scannerContext.getMetrics().countOfRowsScanned.incrementAndGet();<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    }<a name="line.6035"></a>
-<span class="sourceLineNo">6036</sp

<TRUNCATED>

[16/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html
index 7d1d60f..6948cc6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html
@@ -43,270 +43,269 @@
 <span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetStoreFileRequest;<a name="line.35"></a>
 <span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.SplitRegionRequest;<a name="line.36"></a>
 <span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetRequest;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiRequest;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutateRequest;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.42"></a>
-<span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>import com.google.common.annotations.VisibleForTesting;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import com.google.protobuf.Message;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import com.google.protobuf.TextFormat;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.security.Superusers;<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><a name="line.49"></a>
-<span class="sourceLineNo">050</span>/**<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * Reads special method annotations and table names to figure a priority for use by QoS facility in<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * ipc; e.g: rpcs to hbase:meta get priority.<a name="line.52"></a>
-<span class="sourceLineNo">053</span> */<a name="line.53"></a>
-<span class="sourceLineNo">054</span>// TODO: Remove.  This is doing way too much work just to figure a priority.  Do as Elliott<a name="line.54"></a>
-<span class="sourceLineNo">055</span>// suggests and just have the client specify a priority.<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>//The logic for figuring out high priority RPCs is as follows:<a name="line.57"></a>
-<span class="sourceLineNo">058</span>//1. if the method is annotated with a QosPriority of QOS_HIGH,<a name="line.58"></a>
-<span class="sourceLineNo">059</span>//   that is honored<a name="line.59"></a>
-<span class="sourceLineNo">060</span>//2. parse out the protobuf message and see if the request is for meta<a name="line.60"></a>
-<span class="sourceLineNo">061</span>//   region, and if so, treat it as a high priority RPC<a name="line.61"></a>
-<span class="sourceLineNo">062</span>//Some optimizations for (2) are done here -<a name="line.62"></a>
-<span class="sourceLineNo">063</span>//Clients send the argument classname as part of making the RPC. The server<a name="line.63"></a>
-<span class="sourceLineNo">064</span>//decides whether to deserialize the proto argument message based on the<a name="line.64"></a>
-<span class="sourceLineNo">065</span>//pre-established set of argument classes (knownArgumentClasses below).<a name="line.65"></a>
-<span class="sourceLineNo">066</span>//This prevents the server from having to deserialize all proto argument<a name="line.66"></a>
-<span class="sourceLineNo">067</span>//messages prematurely.<a name="line.67"></a>
-<span class="sourceLineNo">068</span>//All the argument classes declare a 'getRegion' method that returns a<a name="line.68"></a>
-<span class="sourceLineNo">069</span>//RegionSpecifier object. Methods can be invoked on the returned object<a name="line.69"></a>
-<span class="sourceLineNo">070</span>//to figure out whether it is a meta region or not.<a name="line.70"></a>
-<span class="sourceLineNo">071</span>@InterfaceAudience.Private<a name="line.71"></a>
-<span class="sourceLineNo">072</span>public class AnnotationReadingPriorityFunction implements PriorityFunction {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private static final Log LOG =<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    LogFactory.getLog(AnnotationReadingPriorityFunction.class.getName());<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  /** Used to control the scan delay, currently sqrt(numNextCall * weight) */<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public static final String SCAN_VTIME_WEIGHT_CONF_KEY = "hbase.ipc.server.scan.vtime.weight";<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  protected final Map&lt;String, Integer&gt; annotatedQos;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  //We need to mock the regionserver instance for some unit tests (set via<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  //setRegionServer method.<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private RSRpcServices rpcServices;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  @SuppressWarnings("unchecked")<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private final Class&lt;? extends Message&gt;[] knownArgumentClasses = new Class[]{<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      GetRegionInfoRequest.class,<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      GetStoreFileRequest.class,<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      CloseRegionRequest.class,<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      FlushRegionRequest.class,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      SplitRegionRequest.class,<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      CompactRegionRequest.class,<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      GetRequest.class,<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      MutateRequest.class,<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      ScanRequest.class<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  };<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>  // Some caches for helping performance<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private final Map&lt;String, Class&lt;? extends Message&gt;&gt; argumentToClassMap =<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    new HashMap&lt;String, Class&lt;? extends Message&gt;&gt;();<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private final Map&lt;String, Map&lt;Class&lt;? extends Message&gt;, Method&gt;&gt; methodMap =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    new HashMap&lt;String, Map&lt;Class&lt;? extends Message&gt;, Method&gt;&gt;();<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private final float scanVirtualTimeWeight;<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>   * Calls {@link #AnnotationReadingPriorityFunction(RSRpcServices, Class)} using the result of<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * {@code rpcServices#getClass()}<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   *<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * @param rpcServices<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   *          The RPC server implementation<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   */<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public AnnotationReadingPriorityFunction(final RSRpcServices rpcServices) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    this(rpcServices, rpcServices.getClass());<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  /**<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * Constructs the priority function given the RPC server implementation and the annotations on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * methods in the provided {@code clz}.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   *<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * @param rpcServices<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   *          The RPC server implementation<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param clz<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   *          The concrete RPC server implementation's class<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public AnnotationReadingPriorityFunction(final RSRpcServices rpcServices,<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      Class&lt;? extends RSRpcServices&gt; clz) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    Map&lt;String,Integer&gt; qosMap = new HashMap&lt;String,Integer&gt;();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    for (Method m : clz.getMethods()) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      QosPriority p = m.getAnnotation(QosPriority.class);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      if (p != null) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        // Since we protobuf'd, and then subsequently, when we went with pb style, method names<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        // are capitalized.  This meant that this brittle compare of method names gotten by<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        // reflection no longer matched the method names coming in over pb.  TODO: Get rid of this<a name="line.132"></a>
-<span class="sourceLineNo">133</span>        // check.  For now, workaround is to capitalize the names we got from reflection so they<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        // have chance of matching the pb ones.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        String capitalizedMethodName = capitalize(m.getName());<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        qosMap.put(capitalizedMethodName, p.priority());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    this.rpcServices = rpcServices;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    this.annotatedQos = qosMap;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    if (methodMap.get("getRegion") == null) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      methodMap.put("hasRegion", new HashMap&lt;Class&lt;? extends Message&gt;, Method&gt;());<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      methodMap.put("getRegion", new HashMap&lt;Class&lt;? extends Message&gt;, Method&gt;());<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    }<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    for (Class&lt;? extends Message&gt; cls : knownArgumentClasses) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      argumentToClassMap.put(cls.getName(), cls);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      try {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        methodMap.get("hasRegion").put(cls, cls.getDeclaredMethod("hasRegion"));<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        methodMap.get("getRegion").put(cls, cls.getDeclaredMethod("getRegion"));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      } catch (Exception e) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        throw new RuntimeException(e);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      }<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    Configuration conf = rpcServices.getConfiguration();<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    scanVirtualTimeWeight = conf.getFloat(SCAN_VTIME_WEIGHT_CONF_KEY, 1.0f);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private String capitalize(final String s) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    StringBuilder strBuilder = new StringBuilder(s);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    strBuilder.setCharAt(0, Character.toUpperCase(strBuilder.charAt(0)));<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    return strBuilder.toString();<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>   * Returns a 'priority' based on the request type.<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   *<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * Currently the returned priority is used for queue selection.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * See the SimpleRpcScheduler as example. It maintains a queue per 'priory type'<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * HIGH_QOS (meta requests), REPLICATION_QOS (replication requests),<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * NORMAL_QOS (user requests).<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    int priorityByAnnotation = getAnnotatedPriority(header);<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>    if (priorityByAnnotation &gt;= 0) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      return priorityByAnnotation;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>    // all requests executed by super users have high QoS<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    try {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      if (Superusers.isSuperUser(user)) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        return HConstants.ADMIN_QOS;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    } catch (IllegalStateException ex) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      // Not good throwing an exception out of here, a runtime anyways.  Let the query go into the<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      // server and have it throw the exception if still an issue.  Just mark it normal priority.<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      if (LOG.isTraceEnabled()) LOG.trace("Marking normal priority after getting exception=" + ex);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      return HConstants.NORMAL_QOS;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>    return getBasePriority(header, param);<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>  /**<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * See if the method has an annotation.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @param header<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @return Return the priority from the annotation. If there isn't<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * an annotation, this returns something below zero.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  protected int getAnnotatedPriority(RequestHeader header) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    String methodName = header.getMethodName();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    Integer priorityByAnnotation = annotatedQos.get(methodName);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    if (priorityByAnnotation != null) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      return priorityByAnnotation;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    return -1;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /**<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * Get the priority for a given request from the header and the param<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * This doesn't consider which user is sending the request at all.<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * This doesn't consider annotations<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  protected int getBasePriority(RequestHeader header, Message param) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    if (param == null) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      return HConstants.NORMAL_QOS;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    if (param instanceof MultiRequest) {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      // The multi call has its priority set in the header.  All calls should work this way but<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      // only this one has been converted so far.  No priority == NORMAL_QOS.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      return header.hasPriority()? header.getPriority(): HConstants.NORMAL_QOS;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    String cls = param.getClass().getName();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Class&lt;? extends Message&gt; rpcArgClass = argumentToClassMap.get(cls);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    RegionSpecifier regionSpecifier = null;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    //check whether the request has reference to meta region or now.<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    try {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      // Check if the param has a region specifier; the pb methods are hasRegion and getRegion if<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      // hasRegion returns true.  Not all listed methods have region specifier each time.  For<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // example, the ScanRequest has it on setup but thereafter relies on the scannerid rather than<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      // send the region over every time.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      Method hasRegion = methodMap.get("hasRegion").get(rpcArgClass);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (hasRegion != null &amp;&amp; (Boolean)hasRegion.invoke(param, (Object[])null)) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        Method getRegion = methodMap.get("getRegion").get(rpcArgClass);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        regionSpecifier = (RegionSpecifier)getRegion.invoke(param, (Object[])null);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        Region region = rpcServices.getRegion(regionSpecifier);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        if (region.getRegionInfo().isSystemTable()) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          if (LOG.isTraceEnabled()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>            LOG.trace("High priority because region=" +<a name="line.242"></a>
-<span class="sourceLineNo">243</span>              region.getRegionInfo().getRegionNameAsString());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          }<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          return HConstants.SYSTEMTABLE_QOS;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      }<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    } catch (Exception ex) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      // Not good throwing an exception out of here, a runtime anyways.  Let the query go into the<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      // server and have it throw the exception if still an issue.  Just mark it normal priority.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      if (LOG.isTraceEnabled()) LOG.trace("Marking normal priority after getting exception=" + ex);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      return HConstants.NORMAL_QOS;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>    if (param instanceof ScanRequest) { // scanner methods...<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      ScanRequest request = (ScanRequest)param;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      if (!request.hasScannerId()) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        return HConstants.NORMAL_QOS;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      RegionScanner scanner = rpcServices.getScanner(request.getScannerId());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      if (scanner != null &amp;&amp; scanner.getRegionInfo().isSystemTable()) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        if (LOG.isTraceEnabled()) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          // Scanner requests are small in size so TextFormat version should not overwhelm log.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          LOG.trace("High priority scanner request " + TextFormat.shortDebugString(request));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        return HConstants.SYSTEMTABLE_QOS;<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><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    return HConstants.NORMAL_QOS;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  /**<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * Based on the request content, returns the deadline of the request.<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   *<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   * @param header<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param param<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @return Deadline of this request. 0 now, otherwise msec of 'delay'<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   */<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  @Override<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    if (param instanceof ScanRequest) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      ScanRequest request = (ScanRequest)param;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      if (!request.hasScannerId()) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        return 0;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>      // get the 'virtual time' of the scanner, and applies sqrt() to get a<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      // nice curve for the delay. More a scanner is used the less priority it gets.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      // The weight is used to have more control on the delay.<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      long vtime = rpcServices.getScannerVirtualTime(request.getScannerId());<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      return Math.round(Math.sqrt(vtime * scanVirtualTimeWeight));<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    return 0;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>  @VisibleForTesting<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  void setRegionServer(final HRegionServer hrs) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    this.rpcServices = hrs.getRSRpcServices();<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>}<a name="line.301"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutateRequest;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>import com.google.common.annotations.VisibleForTesting;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import com.google.protobuf.Message;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import com.google.protobuf.TextFormat;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.security.Superusers;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.security.User;<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>/**<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * Reads special method annotations and table names to figure a priority for use by QoS facility in<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * ipc; e.g: rpcs to hbase:meta get priority.<a name="line.51"></a>
+<span class="sourceLineNo">052</span> */<a name="line.52"></a>
+<span class="sourceLineNo">053</span>// TODO: Remove.  This is doing way too much work just to figure a priority.  Do as Elliott<a name="line.53"></a>
+<span class="sourceLineNo">054</span>// suggests and just have the client specify a priority.<a name="line.54"></a>
+<span class="sourceLineNo">055</span><a name="line.55"></a>
+<span class="sourceLineNo">056</span>//The logic for figuring out high priority RPCs is as follows:<a name="line.56"></a>
+<span class="sourceLineNo">057</span>//1. if the method is annotated with a QosPriority of QOS_HIGH,<a name="line.57"></a>
+<span class="sourceLineNo">058</span>//   that is honored<a name="line.58"></a>
+<span class="sourceLineNo">059</span>//2. parse out the protobuf message and see if the request is for meta<a name="line.59"></a>
+<span class="sourceLineNo">060</span>//   region, and if so, treat it as a high priority RPC<a name="line.60"></a>
+<span class="sourceLineNo">061</span>//Some optimizations for (2) are done here -<a name="line.61"></a>
+<span class="sourceLineNo">062</span>//Clients send the argument classname as part of making the RPC. The server<a name="line.62"></a>
+<span class="sourceLineNo">063</span>//decides whether to deserialize the proto argument message based on the<a name="line.63"></a>
+<span class="sourceLineNo">064</span>//pre-established set of argument classes (knownArgumentClasses below).<a name="line.64"></a>
+<span class="sourceLineNo">065</span>//This prevents the server from having to deserialize all proto argument<a name="line.65"></a>
+<span class="sourceLineNo">066</span>//messages prematurely.<a name="line.66"></a>
+<span class="sourceLineNo">067</span>//All the argument classes declare a 'getRegion' method that returns a<a name="line.67"></a>
+<span class="sourceLineNo">068</span>//RegionSpecifier object. Methods can be invoked on the returned object<a name="line.68"></a>
+<span class="sourceLineNo">069</span>//to figure out whether it is a meta region or not.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>@InterfaceAudience.Private<a name="line.70"></a>
+<span class="sourceLineNo">071</span>public class AnnotationReadingPriorityFunction implements PriorityFunction {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private static final Log LOG =<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    LogFactory.getLog(AnnotationReadingPriorityFunction.class.getName());<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  /** Used to control the scan delay, currently sqrt(numNextCall * weight) */<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  public static final String SCAN_VTIME_WEIGHT_CONF_KEY = "hbase.ipc.server.scan.vtime.weight";<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>  protected final Map&lt;String, Integer&gt; annotatedQos;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  //We need to mock the regionserver instance for some unit tests (set via<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  //setRegionServer method.<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private RSRpcServices rpcServices;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  @SuppressWarnings("unchecked")<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private final Class&lt;? extends Message&gt;[] knownArgumentClasses = new Class[]{<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      GetRegionInfoRequest.class,<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      GetStoreFileRequest.class,<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      CloseRegionRequest.class,<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      FlushRegionRequest.class,<a name="line.87"></a>
+<span class="sourceLineNo">088</span>      SplitRegionRequest.class,<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      CompactRegionRequest.class,<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      GetRequest.class,<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      MutateRequest.class,<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      ScanRequest.class<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>  // Some caches for helping performance<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private final Map&lt;String, Class&lt;? extends Message&gt;&gt; argumentToClassMap =<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    new HashMap&lt;String, Class&lt;? extends Message&gt;&gt;();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private final Map&lt;String, Map&lt;Class&lt;? extends Message&gt;, Method&gt;&gt; methodMap =<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    new HashMap&lt;String, Map&lt;Class&lt;? extends Message&gt;, Method&gt;&gt;();<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private final float scanVirtualTimeWeight;<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  /**<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   * Calls {@link #AnnotationReadingPriorityFunction(RSRpcServices, Class)} using the result of<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * {@code rpcServices#getClass()}<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   *<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * @param rpcServices<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   *          The RPC server implementation<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public AnnotationReadingPriorityFunction(final RSRpcServices rpcServices) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    this(rpcServices, rpcServices.getClass());<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>  /**<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * Constructs the priority function given the RPC server implementation and the annotations on the<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * methods in the provided {@code clz}.<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   *<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * @param rpcServices<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   *          The RPC server implementation<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * @param clz<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   *          The concrete RPC server implementation's class<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  public AnnotationReadingPriorityFunction(final RSRpcServices rpcServices,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      Class&lt;? extends RSRpcServices&gt; clz) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    Map&lt;String,Integer&gt; qosMap = new HashMap&lt;String,Integer&gt;();<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    for (Method m : clz.getMethods()) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      QosPriority p = m.getAnnotation(QosPriority.class);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      if (p != null) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>        // Since we protobuf'd, and then subsequently, when we went with pb style, method names<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        // are capitalized.  This meant that this brittle compare of method names gotten by<a name="line.130"></a>
+<span class="sourceLineNo">131</span>        // reflection no longer matched the method names coming in over pb.  TODO: Get rid of this<a name="line.131"></a>
+<span class="sourceLineNo">132</span>        // check.  For now, workaround is to capitalize the names we got from reflection so they<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        // have chance of matching the pb ones.<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        String capitalizedMethodName = capitalize(m.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        qosMap.put(capitalizedMethodName, p.priority());<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>    this.rpcServices = rpcServices;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    this.annotatedQos = qosMap;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    if (methodMap.get("getRegion") == null) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      methodMap.put("hasRegion", new HashMap&lt;Class&lt;? extends Message&gt;, Method&gt;());<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      methodMap.put("getRegion", new HashMap&lt;Class&lt;? extends Message&gt;, Method&gt;());<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    for (Class&lt;? extends Message&gt; cls : knownArgumentClasses) {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      argumentToClassMap.put(cls.getName(), cls);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      try {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        methodMap.get("hasRegion").put(cls, cls.getDeclaredMethod("hasRegion"));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        methodMap.get("getRegion").put(cls, cls.getDeclaredMethod("getRegion"));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      } catch (Exception e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        throw new RuntimeException(e);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>    Configuration conf = rpcServices.getConfiguration();<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    scanVirtualTimeWeight = conf.getFloat(SCAN_VTIME_WEIGHT_CONF_KEY, 1.0f);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private String capitalize(final String s) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    StringBuilder strBuilder = new StringBuilder(s);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    strBuilder.setCharAt(0, Character.toUpperCase(strBuilder.charAt(0)));<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    return strBuilder.toString();<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<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>   * Returns a 'priority' based on the request type.<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   *<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * Currently the returned priority is used for queue selection.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * See the SimpleRpcScheduler as example. It maintains a queue per 'priory type'<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * HIGH_QOS (meta requests), REPLICATION_QOS (replication requests),<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * NORMAL_QOS (user requests).<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   */<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    int priorityByAnnotation = getAnnotatedPriority(header);<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span>    if (priorityByAnnotation &gt;= 0) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      return priorityByAnnotation;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>    // all requests executed by super users have high QoS<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    try {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      if (Superusers.isSuperUser(user)) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        return HConstants.ADMIN_QOS;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    } catch (IllegalStateException ex) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      // Not good throwing an exception out of here, a runtime anyways.  Let the query go into the<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      // server and have it throw the exception if still an issue.  Just mark it normal priority.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      if (LOG.isTraceEnabled()) LOG.trace("Marking normal priority after getting exception=" + ex);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      return HConstants.NORMAL_QOS;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    return getBasePriority(header, param);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  }<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>   * See if the method has an annotation.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @param header<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @return Return the priority from the annotation. If there isn't<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * an annotation, this returns something below zero.<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  protected int getAnnotatedPriority(RequestHeader header) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    String methodName = header.getMethodName();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    Integer priorityByAnnotation = annotatedQos.get(methodName);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    if (priorityByAnnotation != null) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      return priorityByAnnotation;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    return -1;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  /**<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   * Get the priority for a given request from the header and the param<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   * This doesn't consider which user is sending the request at all.<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * This doesn't consider annotations<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  protected int getBasePriority(RequestHeader header, Message param) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    if (param == null) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      return HConstants.NORMAL_QOS;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // Trust the client-set priorities if set<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    if (header.hasPriority()) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      return header.getPriority();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>    String cls = param.getClass().getName();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Class&lt;? extends Message&gt; rpcArgClass = argumentToClassMap.get(cls);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    RegionSpecifier regionSpecifier = null;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    //check whether the request has reference to meta region or now.<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    try {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // Check if the param has a region specifier; the pb methods are hasRegion and getRegion if<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      // hasRegion returns true.  Not all listed methods have region specifier each time.  For<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      // example, the ScanRequest has it on setup but thereafter relies on the scannerid rather than<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      // send the region over every time.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      Method hasRegion = methodMap.get("hasRegion").get(rpcArgClass);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      if (hasRegion != null &amp;&amp; (Boolean)hasRegion.invoke(param, (Object[])null)) {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        Method getRegion = methodMap.get("getRegion").get(rpcArgClass);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        regionSpecifier = (RegionSpecifier)getRegion.invoke(param, (Object[])null);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        Region region = rpcServices.getRegion(regionSpecifier);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        if (region.getRegionInfo().isSystemTable()) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          if (LOG.isTraceEnabled()) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>            LOG.trace("High priority because region=" +<a name="line.241"></a>
+<span class="sourceLineNo">242</span>              region.getRegionInfo().getRegionNameAsString());<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>          return HConstants.SYSTEMTABLE_QOS;<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>    } catch (Exception ex) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      // Not good throwing an exception out of here, a runtime anyways.  Let the query go into the<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      // server and have it throw the exception if still an issue.  Just mark it normal priority.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      if (LOG.isTraceEnabled()) LOG.trace("Marking normal priority after getting exception=" + ex);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      return HConstants.NORMAL_QOS;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (param instanceof ScanRequest) { // scanner methods...<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      ScanRequest request = (ScanRequest)param;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if (!request.hasScannerId()) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        return HConstants.NORMAL_QOS;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      RegionScanner scanner = rpcServices.getScanner(request.getScannerId());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      if (scanner != null &amp;&amp; scanner.getRegionInfo().isSystemTable()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        if (LOG.isTraceEnabled()) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>          // Scanner requests are small in size so TextFormat version should not overwhelm log.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          LOG.trace("High priority scanner request " + TextFormat.shortDebugString(request));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        return HConstants.SYSTEMTABLE_QOS;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      }<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>    return HConstants.NORMAL_QOS;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * Based on the request content, returns the deadline of the request.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   *<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   * @param header<a name="line.275"></a>
+<span class="sourceLineNo">276</span>   * @param param<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * @return Deadline of this request. 0 now, otherwise msec of 'delay'<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   */<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @Override<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    if (param instanceof ScanRequest) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      ScanRequest request = (ScanRequest)param;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      if (!request.hasScannerId()) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        return 0;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      }<a name="line.285"></a>
+<span class="sourceLineNo">286</span><a name="line.286"></a>
+<span class="sourceLineNo">287</span>      // get the 'virtual time' of the scanner, and applies sqrt() to get a<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      // nice curve for the delay. More a scanner is used the less priority it gets.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      // The weight is used to have more control on the delay.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      long vtime = rpcServices.getScannerVirtualTime(request.getScannerId());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return Math.round(Math.sqrt(vtime * scanVirtualTimeWeight));<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    return 0;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  }<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  void setRegionServer(final HRegionServer hrs) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    this.rpcServices = hrs.getRSRpcServices();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>}<a name="line.300"></a>
 
 
 


[39/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/client/ScannerCallable.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ScannerCallable.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ScannerCallable.html
index 1a7a6d9..cbd9fa2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ScannerCallable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ScannerCallable.html
@@ -199,300 +199,304 @@
 <span class="sourceLineNo">191</span>    if (Thread.interrupted()) {<a name="line.191"></a>
 <span class="sourceLineNo">192</span>      throw new InterruptedIOException();<a name="line.192"></a>
 <span class="sourceLineNo">193</span>    }<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (closed) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      if (scannerId != -1) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        close();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      }<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    } else {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      if (scannerId == -1L) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        this.scannerId = openScanner();<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      } else {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        Result [] rrs = null;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        ScanRequest request = null;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        // Reset the heartbeat flag prior to each RPC in case an exception is thrown by the server<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        setHeartbeatMessage(false);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        try {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          incRPCcallsMetrics();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          request =<a name="line.208"></a>
-<span class="sourceLineNo">209</span>              RequestConverter.buildScanRequest(scannerId, caching, false, nextCallSeq,<a name="line.209"></a>
-<span class="sourceLineNo">210</span>                this.scanMetrics != null, renew);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          ScanResponse response = null;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          controller = controllerFactory.newController();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          controller.setPriority(getTableName());<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          controller.setCallTimeout(callTimeout);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          try {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>            response = getStub().scan(controller, request);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>            // Client and RS maintain a nextCallSeq number during the scan. Every next() call<a name="line.217"></a>
-<span class="sourceLineNo">218</span>            // from client to server will increment this number in both sides. Client passes this<a name="line.218"></a>
-<span class="sourceLineNo">219</span>            // number along with the request and at RS side both the incoming nextCallSeq and its<a name="line.219"></a>
-<span class="sourceLineNo">220</span>            // nextCallSeq will be matched. In case of a timeout this increment at the client side<a name="line.220"></a>
-<span class="sourceLineNo">221</span>            // should not happen. If at the server side fetching of next batch of data was over,<a name="line.221"></a>
-<span class="sourceLineNo">222</span>            // there will be mismatch in the nextCallSeq number. Server will throw<a name="line.222"></a>
-<span class="sourceLineNo">223</span>            // OutOfOrderScannerNextException and then client will reopen the scanner with startrow<a name="line.223"></a>
-<span class="sourceLineNo">224</span>            // as the last successfully retrieved row.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>            // See HBASE-5974<a name="line.225"></a>
-<span class="sourceLineNo">226</span>            nextCallSeq++;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>            long timestamp = System.currentTimeMillis();<a name="line.227"></a>
-<span class="sourceLineNo">228</span>            setHeartbeatMessage(response.hasHeartbeatMessage() &amp;&amp; response.getHeartbeatMessage());<a name="line.228"></a>
-<span class="sourceLineNo">229</span>            // Results are returned via controller<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            CellScanner cellScanner = controller.cellScanner();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>            rrs = ResponseConverter.getResults(cellScanner, response);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>            if (logScannerActivity) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>              long now = System.currentTimeMillis();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>              if (now - timestamp &gt; logCutOffLatency) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>                int rows = rrs == null ? 0 : rrs.length;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>                LOG.info("Took " + (now-timestamp) + "ms to fetch "<a name="line.236"></a>
-<span class="sourceLineNo">237</span>                  + rows + " rows from scanner=" + scannerId);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>              }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>            updateServerSideMetrics(response);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>            // moreResults is only used for the case where a filter exhausts all elements<a name="line.241"></a>
-<span class="sourceLineNo">242</span>            if (response.hasMoreResults() &amp;&amp; !response.getMoreResults()) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>              scannerId = -1L;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>              closed = true;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>              // Implied that no results were returned back, either.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>              return null;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>            }<a name="line.247"></a>
-<span class="sourceLineNo">248</span>            // moreResultsInRegion explicitly defines when a RS may choose to terminate a batch due<a name="line.248"></a>
-<span class="sourceLineNo">249</span>            // to size or quantity of results in the response.<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            if (response.hasMoreResultsInRegion()) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>              // Set what the RS said<a name="line.251"></a>
-<span class="sourceLineNo">252</span>              setHasMoreResultsContext(true);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>              setServerHasMoreResults(response.getMoreResultsInRegion());<a name="line.253"></a>
-<span class="sourceLineNo">254</span>            } else {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>              // Server didn't respond whether it has more results or not.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>              setHasMoreResultsContext(false);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>            }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          } catch (ServiceException se) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>            throw ProtobufUtil.getRemoteException(se);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          updateResultsMetrics(rrs);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        } catch (IOException e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          if (logScannerActivity) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>            LOG.info("Got exception making request " + TextFormat.shortDebugString(request)<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              + " to " + getLocation(), e);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          IOException ioe = e;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          if (e instanceof RemoteException) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>            ioe = ((RemoteException) e).unwrapRemoteException();<a name="line.269"></a>
+<span class="sourceLineNo">194</span><a name="line.194"></a>
+<span class="sourceLineNo">195</span>    if (controller == null) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      controller = controllerFactory.newController();<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      controller.setPriority(getTableName());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      controller.setCallTimeout(callTimeout);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>    if (closed) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      if (scannerId != -1) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        close();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      }<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } else {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      if (scannerId == -1L) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        this.scannerId = openScanner();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      } else {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        Result [] rrs = null;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        ScanRequest request = null;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        // Reset the heartbeat flag prior to each RPC in case an exception is thrown by the server<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        setHeartbeatMessage(false);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        try {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>          incRPCcallsMetrics();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          request =<a name="line.215"></a>
+<span class="sourceLineNo">216</span>              RequestConverter.buildScanRequest(scannerId, caching, false, nextCallSeq,<a name="line.216"></a>
+<span class="sourceLineNo">217</span>                this.scanMetrics != null, renew);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          ScanResponse response = null;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          try {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>            response = getStub().scan(controller, request);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            // Client and RS maintain a nextCallSeq number during the scan. Every next() call<a name="line.221"></a>
+<span class="sourceLineNo">222</span>            // from client to server will increment this number in both sides. Client passes this<a name="line.222"></a>
+<span class="sourceLineNo">223</span>            // number along with the request and at RS side both the incoming nextCallSeq and its<a name="line.223"></a>
+<span class="sourceLineNo">224</span>            // nextCallSeq will be matched. In case of a timeout this increment at the client side<a name="line.224"></a>
+<span class="sourceLineNo">225</span>            // should not happen. If at the server side fetching of next batch of data was over,<a name="line.225"></a>
+<span class="sourceLineNo">226</span>            // there will be mismatch in the nextCallSeq number. Server will throw<a name="line.226"></a>
+<span class="sourceLineNo">227</span>            // OutOfOrderScannerNextException and then client will reopen the scanner with startrow<a name="line.227"></a>
+<span class="sourceLineNo">228</span>            // as the last successfully retrieved row.<a name="line.228"></a>
+<span class="sourceLineNo">229</span>            // See HBASE-5974<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            nextCallSeq++;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>            long timestamp = System.currentTimeMillis();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>            setHeartbeatMessage(response.hasHeartbeatMessage() &amp;&amp; response.getHeartbeatMessage());<a name="line.232"></a>
+<span class="sourceLineNo">233</span>            // Results are returned via controller<a name="line.233"></a>
+<span class="sourceLineNo">234</span>            CellScanner cellScanner = controller.cellScanner();<a name="line.234"></a>
+<span class="sourceLineNo">235</span>            rrs = ResponseConverter.getResults(cellScanner, response);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>            if (logScannerActivity) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>              long now = System.currentTimeMillis();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>              if (now - timestamp &gt; logCutOffLatency) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>                int rows = rrs == null ? 0 : rrs.length;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>                LOG.info("Took " + (now-timestamp) + "ms to fetch "<a name="line.240"></a>
+<span class="sourceLineNo">241</span>                  + rows + " rows from scanner=" + scannerId);<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>            updateServerSideMetrics(response);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>            // moreResults is only used for the case where a filter exhausts all elements<a name="line.245"></a>
+<span class="sourceLineNo">246</span>            if (response.hasMoreResults() &amp;&amp; !response.getMoreResults()) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>              scannerId = -1L;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>              closed = true;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>              // Implied that no results were returned back, either.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>              return null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>            }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>            // moreResultsInRegion explicitly defines when a RS may choose to terminate a batch due<a name="line.252"></a>
+<span class="sourceLineNo">253</span>            // to size or quantity of results in the response.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            if (response.hasMoreResultsInRegion()) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>              // Set what the RS said<a name="line.255"></a>
+<span class="sourceLineNo">256</span>              setHasMoreResultsContext(true);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>              setServerHasMoreResults(response.getMoreResultsInRegion());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>            } else {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>              // Server didn't respond whether it has more results or not.<a name="line.259"></a>
+<span class="sourceLineNo">260</span>              setHasMoreResultsContext(false);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>            }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>          } catch (ServiceException se) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>            throw ProtobufUtil.getRemoteException(se);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          updateResultsMetrics(rrs);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        } catch (IOException e) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          if (logScannerActivity) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>            LOG.info("Got exception making request " + TextFormat.shortDebugString(request)<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              + " to " + getLocation(), e);<a name="line.269"></a>
 <span class="sourceLineNo">270</span>          }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>          if (logScannerActivity &amp;&amp; (ioe instanceof UnknownScannerException)) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>            try {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>              HRegionLocation location =<a name="line.273"></a>
-<span class="sourceLineNo">274</span>                getConnection().relocateRegion(getTableName(), scan.getStartRow());<a name="line.274"></a>
-<span class="sourceLineNo">275</span>              LOG.info("Scanner=" + scannerId<a name="line.275"></a>
-<span class="sourceLineNo">276</span>                + " expired, current region location is " + location.toString());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            } catch (Throwable t) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>              LOG.info("Failed to relocate region", t);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          }<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          // The below convertion of exceptions into DoNotRetryExceptions is a little strange.<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          // Why not just have these exceptions implment DNRIOE you ask?  Well, usually we want<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          // ServerCallable#withRetries to just retry when it gets these exceptions.  In here in<a name="line.283"></a>
-<span class="sourceLineNo">284</span>          // a scan when doing a next in particular, we want to break out and get the scanner to<a name="line.284"></a>
-<span class="sourceLineNo">285</span>          // reset itself up again.  Throwing a DNRIOE is how we signal this to happen (its ugly,<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          // yeah and hard to follow and in need of a refactor).<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          if (ioe instanceof NotServingRegionException) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            // Throw a DNRE so that we break out of cycle of calling NSRE<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            // when what we need is to open scanner against new location.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>            // Attach NSRE to signal client that it needs to re-setup scanner.<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            if (this.scanMetrics != null) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>              this.scanMetrics.countOfNSRE.incrementAndGet();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            throw new DoNotRetryIOException("Resetting the scanner -- see exception cause", ioe);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          } else if (ioe instanceof RegionServerStoppedException) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>            // Throw a DNRE so that we break out of cycle of the retries and instead go and<a name="line.296"></a>
-<span class="sourceLineNo">297</span>            // open scanner against new location.<a name="line.297"></a>
+<span class="sourceLineNo">271</span>          IOException ioe = e;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          if (e instanceof RemoteException) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            ioe = ((RemoteException) e).unwrapRemoteException();<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          if (logScannerActivity &amp;&amp; (ioe instanceof UnknownScannerException)) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            try {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>              HRegionLocation location =<a name="line.277"></a>
+<span class="sourceLineNo">278</span>                getConnection().relocateRegion(getTableName(), scan.getStartRow());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>              LOG.info("Scanner=" + scannerId<a name="line.279"></a>
+<span class="sourceLineNo">280</span>                + " expired, current region location is " + location.toString());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            } catch (Throwable t) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>              LOG.info("Failed to relocate region", t);<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>          // The below convertion of exceptions into DoNotRetryExceptions is a little strange.<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          // Why not just have these exceptions implment DNRIOE you ask?  Well, usually we want<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          // ServerCallable#withRetries to just retry when it gets these exceptions.  In here in<a name="line.287"></a>
+<span class="sourceLineNo">288</span>          // a scan when doing a next in particular, we want to break out and get the scanner to<a name="line.288"></a>
+<span class="sourceLineNo">289</span>          // reset itself up again.  Throwing a DNRIOE is how we signal this to happen (its ugly,<a name="line.289"></a>
+<span class="sourceLineNo">290</span>          // yeah and hard to follow and in need of a refactor).<a name="line.290"></a>
+<span class="sourceLineNo">291</span>          if (ioe instanceof NotServingRegionException) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>            // Throw a DNRE so that we break out of cycle of calling NSRE<a name="line.292"></a>
+<span class="sourceLineNo">293</span>            // when what we need is to open scanner against new location.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>            // Attach NSRE to signal client that it needs to re-setup scanner.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>            if (this.scanMetrics != null) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>              this.scanMetrics.countOfNSRE.incrementAndGet();<a name="line.296"></a>
+<span class="sourceLineNo">297</span>            }<a name="line.297"></a>
 <span class="sourceLineNo">298</span>            throw new DoNotRetryIOException("Resetting the scanner -- see exception cause", ioe);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          } else {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            // The outer layers will retry<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            throw ioe;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        return rrs;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    return null;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * @return true when the most recent RPC response indicated that the response was a heartbeat<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   *         message. Heartbeat messages are sent back from the server when the processing of the<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   *         scan request exceeds a certain time threshold. Heartbeats allow the server to avoid<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   *         timeouts during long running scan operations.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   */<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  protected boolean isHeartbeatMessage() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return heartbeatMessage;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  protected void setHeartbeatMessage(boolean heartbeatMessage) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    this.heartbeatMessage = heartbeatMessage;<a name="line.321"></a>
+<span class="sourceLineNo">299</span>          } else if (ioe instanceof RegionServerStoppedException) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            // Throw a DNRE so that we break out of cycle of the retries and instead go and<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            // open scanner against new location.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>            throw new DoNotRetryIOException("Resetting the scanner -- see exception cause", ioe);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            // The outer layers will retry<a name="line.304"></a>
+<span class="sourceLineNo">305</span>            throw ioe;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>          }<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        return rrs;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    return null;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  /**<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * @return true when the most recent RPC response indicated that the response was a heartbeat<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   *         message. Heartbeat messages are sent back from the server when the processing of the<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   *         scan request exceeds a certain time threshold. Heartbeats allow the server to avoid<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   *         timeouts during long running scan operations.<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  protected boolean isHeartbeatMessage() {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return heartbeatMessage;<a name="line.321"></a>
 <span class="sourceLineNo">322</span>  }<a name="line.322"></a>
 <span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private void incRPCcallsMetrics() {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    if (this.scanMetrics == null) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      return;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    this.scanMetrics.countOfRPCcalls.incrementAndGet();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    if (isRegionServerRemote) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      this.scanMetrics.countOfRemoteRPCcalls.incrementAndGet();<a name="line.330"></a>
+<span class="sourceLineNo">324</span>  protected void setHeartbeatMessage(boolean heartbeatMessage) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    this.heartbeatMessage = heartbeatMessage;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private void incRPCcallsMetrics() {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    if (this.scanMetrics == null) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      return;<a name="line.330"></a>
 <span class="sourceLineNo">331</span>    }<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>  protected void updateResultsMetrics(Result[] rrs) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    if (this.scanMetrics == null || rrs == null || rrs.length == 0) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      return;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    long resultSize = 0;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    for (Result rr : rrs) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      for (Cell cell : rr.rawCells()) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        resultSize += CellUtil.estimatedSerializedSizeOf(cell);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    this.scanMetrics.countOfBytesInResults.addAndGet(resultSize);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    if (isRegionServerRemote) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      this.scanMetrics.countOfBytesInRemoteResults.addAndGet(resultSize);<a name="line.346"></a>
+<span class="sourceLineNo">332</span>    this.scanMetrics.countOfRPCcalls.incrementAndGet();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    if (isRegionServerRemote) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      this.scanMetrics.countOfRemoteRPCcalls.incrementAndGet();<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    }<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>  protected void updateResultsMetrics(Result[] rrs) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    if (this.scanMetrics == null || rrs == null || rrs.length == 0) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      return;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    long resultSize = 0;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    for (Result rr : rrs) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      for (Cell cell : rr.rawCells()) {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        resultSize += CellUtil.estimatedSerializedSizeOf(cell);<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>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * Use the scan metrics returned by the server to add to the identically named counters in the<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * client side metrics. If a counter does not exist with the same name as the server side metric,<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * the attempt to increase the counter will fail.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @param response<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  private void updateServerSideMetrics(ScanResponse response) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    if (this.scanMetrics == null || response == null || !response.hasScanMetrics()) return;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>    Map&lt;String, Long&gt; serverMetrics = ResponseConverter.getScanMetrics(response);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    for (Entry&lt;String, Long&gt; entry : serverMetrics.entrySet()) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      this.scanMetrics.addToCounter(entry.getKey(), entry.getValue());<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private void close() {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    if (this.scannerId == -1L) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      return;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    try {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      incRPCcallsMetrics();<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      ScanRequest request =<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          RequestConverter.buildScanRequest(this.scannerId, 0, true, this.scanMetrics != null);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      try {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        getStub().scan(null, request);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      } catch (ServiceException se) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        throw ProtobufUtil.getRemoteException(se);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      }<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    } catch (IOException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      LOG.warn("Ignore, probably already closed", e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    this.scannerId = -1L;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  }<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  protected long openScanner() throws IOException {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    incRPCcallsMetrics();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    ScanRequest request =<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      RequestConverter.buildScanRequest(<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        getLocation().getRegionInfo().getRegionName(),<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        this.scan, 0, false);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    try {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      ScanResponse response = getStub().scan(null, request);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      long id = response.getScannerId();<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (logScannerActivity) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        LOG.info("Open scanner=" + id + " for scan=" + scan.toString()<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          + " on region " + getLocation().toString());<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      return id;<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    } catch (ServiceException se) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      throw ProtobufUtil.getRemoteException(se);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  protected Scan getScan() {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    return scan;<a name="line.404"></a>
+<span class="sourceLineNo">348</span>    this.scanMetrics.countOfBytesInResults.addAndGet(resultSize);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    if (isRegionServerRemote) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      this.scanMetrics.countOfBytesInRemoteResults.addAndGet(resultSize);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  /**<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * Use the scan metrics returned by the server to add to the identically named counters in the<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * client side metrics. If a counter does not exist with the same name as the server side metric,<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * the attempt to increase the counter will fail.<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * @param response<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   */<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private void updateServerSideMetrics(ScanResponse response) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    if (this.scanMetrics == null || response == null || !response.hasScanMetrics()) return;<a name="line.361"></a>
+<span class="sourceLineNo">362</span><a name="line.362"></a>
+<span class="sourceLineNo">363</span>    Map&lt;String, Long&gt; serverMetrics = ResponseConverter.getScanMetrics(response);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    for (Entry&lt;String, Long&gt; entry : serverMetrics.entrySet()) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      this.scanMetrics.addToCounter(entry.getKey(), entry.getValue());<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  private void close() {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    if (this.scannerId == -1L) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      return;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    try {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      incRPCcallsMetrics();<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      ScanRequest request =<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          RequestConverter.buildScanRequest(this.scannerId, 0, true, this.scanMetrics != null);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      try {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        getStub().scan(controller, request);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      } catch (ServiceException se) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        throw ProtobufUtil.getRemoteException(se);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      }<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    } catch (IOException e) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      LOG.warn("Ignore, probably already closed", e);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    this.scannerId = -1L;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  }<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>  protected long openScanner() throws IOException {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    incRPCcallsMetrics();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    ScanRequest request =<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      RequestConverter.buildScanRequest(<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        getLocation().getRegionInfo().getRegionName(),<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        this.scan, 0, false);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      ScanResponse response = getStub().scan(controller, request);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      long id = response.getScannerId();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      if (logScannerActivity) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        LOG.info("Open scanner=" + id + " for scan=" + scan.toString()<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          + " on region " + getLocation().toString());<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      }<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      return id;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    } catch (ServiceException se) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      throw ProtobufUtil.getRemoteException(se);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
 <span class="sourceLineNo">405</span>  }<a name="line.405"></a>
 <span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  /**<a name="line.407"></a>
-<span class="sourceLineNo">408</span>   * Call this when the next invocation of call should close the scanner<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void setClose() {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    this.closed = true;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>  /**<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   * Indicate whether we make a call only to renew the lease, but without affected the scanner in<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * any other way.<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * @param val true if only the lease should be renewed<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  public void setRenew(boolean val) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    this.renew = val;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   * @return the HRegionInfo for the current region<a name="line.424"></a>
-<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  public HRegionInfo getHRegionInfo() {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    if (!instantiated) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      return null;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    return getLocation().getRegionInfo();<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  }<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>  /**<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * Get the number of rows that will be fetched on next<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * @return the number of rows for caching<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public int getCaching() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return caching;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public ClusterConnection getConnection() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    return cConnection;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>  /**<a name="line.447"></a>
-<span class="sourceLineNo">448</span>   * Set the number of rows that will be fetched on next<a name="line.448"></a>
-<span class="sourceLineNo">449</span>   * @param caching the number of rows for caching<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   */<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public void setCaching(int caching) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    this.caching = caching;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  public ScannerCallable getScannerCallableForReplica(int id) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    ScannerCallable s = new ScannerCallable(this.getConnection(), this.tableName,<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        this.getScan(), this.scanMetrics, controllerFactory, id);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    s.setCaching(this.caching);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    return s;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>  }<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>  /**<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * Should the client attempt to fetch more results from this region<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * @return True if the client should attempt to fetch more results, false otherwise.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   */<a name="line.465"></a>
-<span class="sourceLineNo">466</span>  protected boolean getServerHasMoreResults() {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    assert serverHasMoreResultsContext;<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    return this.serverHasMoreResults;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>  protected void setServerHasMoreResults(boolean serverHasMoreResults) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    this.serverHasMoreResults = serverHasMoreResults;<a name="line.472"></a>
+<span class="sourceLineNo">407</span>  protected Scan getScan() {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    return scan;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  /**<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * Call this when the next invocation of call should close the scanner<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  public void setClose() {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    this.closed = true;<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  /**<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * Indicate whether we make a call only to renew the lease, but without affected the scanner in<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * any other way.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * @param val true if only the lease should be renewed<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   */<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  public void setRenew(boolean val) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    this.renew = val;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * @return the HRegionInfo for the current region<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
+<span class="sourceLineNo">430</span>  @Override<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  public HRegionInfo getHRegionInfo() {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    if (!instantiated) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      return null;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    return getLocation().getRegionInfo();<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  /**<a name="line.438"></a>
+<span class="sourceLineNo">439</span>   * Get the number of rows that will be fetched on next<a name="line.439"></a>
+<span class="sourceLineNo">440</span>   * @return the number of rows for caching<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  public int getCaching() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return caching;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public ClusterConnection getConnection() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return cConnection;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>  /**<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   * Set the number of rows that will be fetched on next<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   * @param caching the number of rows for caching<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   */<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  public void setCaching(int caching) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    this.caching = caching;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public ScannerCallable getScannerCallableForReplica(int id) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    ScannerCallable s = new ScannerCallable(this.getConnection(), this.tableName,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        this.getScan(), this.scanMetrics, controllerFactory, id);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    s.setCaching(this.caching);<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    return s;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
+<span class="sourceLineNo">465</span><a name="line.465"></a>
+<span class="sourceLineNo">466</span>  /**<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * Should the client attempt to fetch more results from this region<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * @return True if the client should attempt to fetch more results, false otherwise.<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   */<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  protected boolean getServerHasMoreResults() {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    assert serverHasMoreResultsContext;<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    return this.serverHasMoreResults;<a name="line.472"></a>
 <span class="sourceLineNo">473</span>  }<a name="line.473"></a>
 <span class="sourceLineNo">474</span><a name="line.474"></a>
-<span class="sourceLineNo">475</span>  /**<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * Did the server respond with information about whether more results might exist.<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * Not guaranteed to respond with older server versions<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @return True if the server responded with information about more results.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   */<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  protected boolean hasMoreResultsContext() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    return serverHasMoreResultsContext;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  protected void setHasMoreResultsContext(boolean serverHasMoreResultsContext) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    this.serverHasMoreResultsContext = serverHasMoreResultsContext;<a name="line.485"></a>
+<span class="sourceLineNo">475</span>  protected void setServerHasMoreResults(boolean serverHasMoreResults) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    this.serverHasMoreResults = serverHasMoreResults;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
+<span class="sourceLineNo">478</span><a name="line.478"></a>
+<span class="sourceLineNo">479</span>  /**<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Did the server respond with information about whether more results might exist.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * Not guaranteed to respond with older server versions<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * @return True if the server responded with information about more results.<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   */<a name="line.483"></a>
+<span class="sourceLineNo">484</span>  protected boolean hasMoreResultsContext() {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    return serverHasMoreResultsContext;<a name="line.485"></a>
 <span class="sourceLineNo">486</span>  }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>}<a name="line.487"></a>
+<span class="sourceLineNo">487</span><a name="line.487"></a>
+<span class="sourceLineNo">488</span>  protected void setHasMoreResultsContext(boolean serverHasMoreResultsContext) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    this.serverHasMoreResultsContext = serverHasMoreResultsContext;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>  }<a name="line.490"></a>
+<span class="sourceLineNo">491</span>}<a name="line.491"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html
new file mode 100644
index 0000000..b53b902
--- /dev/null
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/ByteBufferInputStream.html
@@ -0,0 +1,179 @@
+<!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.io;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import java.io.InputStream;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.nio.ByteBuffer;<a name="line.21"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.util.ByteBufferUtils;<a name="line.24"></a>
+<span class="sourceLineNo">025</span><a name="line.25"></a>
+<span class="sourceLineNo">026</span>/**<a name="line.26"></a>
+<span class="sourceLineNo">027</span> * Not thread safe!<a name="line.27"></a>
+<span class="sourceLineNo">028</span> * &lt;p&gt;<a name="line.28"></a>
+<span class="sourceLineNo">029</span> * Please note that the reads will cause position movement on wrapped ByteBuffer.<a name="line.29"></a>
+<span class="sourceLineNo">030</span> */<a name="line.30"></a>
+<span class="sourceLineNo">031</span>@InterfaceAudience.Private<a name="line.31"></a>
+<span class="sourceLineNo">032</span>public class ByteBufferInputStream extends InputStream {<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>  private ByteBuffer buf;<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>  public ByteBufferInputStream(ByteBuffer buf) {<a name="line.36"></a>
+<span class="sourceLineNo">037</span>    this.buf = buf;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>  }<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>   * Reads the next byte of data from this input stream. The value byte is returned as an<a name="line.41"></a>
+<span class="sourceLineNo">042</span>   * &lt;code&gt;int&lt;/code&gt; in the range &lt;code&gt;0&lt;/code&gt; to &lt;code&gt;255&lt;/code&gt;. If no byte is available<a name="line.42"></a>
+<span class="sourceLineNo">043</span>   * because the end of the stream has been reached, the value &lt;code&gt;-1&lt;/code&gt; is returned.<a name="line.43"></a>
+<span class="sourceLineNo">044</span>   * @return the next byte of data, or &lt;code&gt;-1&lt;/code&gt; if the end of the stream has been reached.<a name="line.44"></a>
+<span class="sourceLineNo">045</span>   */<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  @Override<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  public int read() {<a name="line.47"></a>
+<span class="sourceLineNo">048</span>    if (this.buf.hasRemaining()) {<a name="line.48"></a>
+<span class="sourceLineNo">049</span>      return (this.buf.get() &amp; 0xff);<a name="line.49"></a>
+<span class="sourceLineNo">050</span>    }<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    return -1;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  }<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  /**<a name="line.54"></a>
+<span class="sourceLineNo">055</span>   * Reads up to next &lt;code&gt;len&lt;/code&gt; bytes of data from buffer into passed array(starting from<a name="line.55"></a>
+<span class="sourceLineNo">056</span>   * given offset).<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   * @param b the array into which the data is read.<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   * @param off the start offset in the destination array &lt;code&gt;b&lt;/code&gt;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>   * @param len the maximum number of bytes to read.<a name="line.59"></a>
+<span class="sourceLineNo">060</span>   * @return the total number of bytes actually read into the buffer, or &lt;code&gt;-1&lt;/code&gt; if not even<a name="line.60"></a>
+<span class="sourceLineNo">061</span>   *         1 byte can be read because the end of the stream has been reached.<a name="line.61"></a>
+<span class="sourceLineNo">062</span>   */<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  @Override<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  public int read(byte[] b, int off, int len) {<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    int avail = available();<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    if (avail &lt;= 0) {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      return -1;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    }<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>    if (len &gt; avail) {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      len = avail;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    }<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    if (len &lt;= 0) {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>      return 0;<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>    ByteBufferUtils.copyFromBufferToArray(b, this.buf, this.buf.position(), off, len);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    this.buf.position(this.buf.position() + len); // we should advance the buffer position<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    return len;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  }<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>   * Skips &lt;code&gt;n&lt;/code&gt; bytes of input from this input stream. Fewer bytes might be skipped if the<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   * end of the input stream is reached. The actual number &lt;code&gt;k&lt;/code&gt; of bytes to be skipped is<a name="line.84"></a>
+<span class="sourceLineNo">085</span>   * equal to the smaller of &lt;code&gt;n&lt;/code&gt; and remaining bytes in the stream.<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   * @param n the number of bytes to be skipped.<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * @return the actual number of bytes skipped.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   */<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @Override<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public long skip(long n) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    long k = Math.min(n, available());<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    if (k &lt; 0) {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      k = 0;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    }<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    this.buf.position((int) (this.buf.position() + k));<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    return k;<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>  /**<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * @return  the number of remaining bytes that can be read (or skipped<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   *          over) from this input stream.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   */<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  @Override<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  public int available() {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    return this.buf.remaining();<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>}<a name="line.107"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
index 86ba709..f4bddcd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
@@ -420,7 +420,7 @@
 <span class="sourceLineNo">412</span>        requestHeaderBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.412"></a>
 <span class="sourceLineNo">413</span>      }<a name="line.413"></a>
 <span class="sourceLineNo">414</span>      // Only pass priority if there one.  Let zero be same as no priority.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      if (call.controller.getPriority() != 0) {<a name="line.415"></a>
+<span class="sourceLineNo">415</span>      if (call.controller.getPriority() != PayloadCarryingRpcController.PRIORITY_UNSET) {<a name="line.415"></a>
 <span class="sourceLineNo">416</span>        requestHeaderBuilder.setPriority(call.controller.getPriority());<a name="line.416"></a>
 <span class="sourceLineNo">417</span>      }<a name="line.417"></a>
 <span class="sourceLineNo">418</span><a name="line.418"></a>
@@ -668,96 +668,97 @@
 <span class="sourceLineNo">660</span>  private void handleSaslConnectionFailure(final int currRetries, final Throwable ex,<a name="line.660"></a>
 <span class="sourceLineNo">661</span>      final UserGroupInformation user) throws IOException, InterruptedException {<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    user.doAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      public Void run() throws IOException, InterruptedException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        if (shouldAuthenticateOverKrb()) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          if (currRetries &lt; MAX_SASL_RETRIES) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>            LOG.debug("Exception encountered while connecting to the server : " + ex);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            //try re-login<a name="line.667"></a>
-<span class="sourceLineNo">668</span>            if (UserGroupInformation.isLoginKeytabBased()) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>              UserGroupInformation.getLoginUser().reloginFromKeytab();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>            } else {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>              UserGroupInformation.getLoginUser().reloginFromTicketCache();<a name="line.671"></a>
-<span class="sourceLineNo">672</span>            }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>            // Should reconnect<a name="line.674"></a>
-<span class="sourceLineNo">675</span>            return null;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>          } else {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>            String msg = "Couldn't setup connection for " +<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                UserGroupInformation.getLoginUser().getUserName() +<a name="line.678"></a>
-<span class="sourceLineNo">679</span>                " to " + serverPrincipal;<a name="line.679"></a>
-<span class="sourceLineNo">680</span>            LOG.warn(msg);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>            throw (IOException) new IOException(msg).initCause(ex);<a name="line.681"></a>
-<span class="sourceLineNo">682</span>          }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        } else {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>          LOG.warn("Exception encountered while connecting to " +<a name="line.684"></a>
-<span class="sourceLineNo">685</span>              "the server : " + ex);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        if (ex instanceof RemoteException) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          throw (RemoteException) ex;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        }<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        if (ex instanceof SaslException) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          String msg = "SASL authentication failed." +<a name="line.691"></a>
-<span class="sourceLineNo">692</span>              " The most likely cause is missing or invalid credentials." +<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              " Consider 'kinit'.";<a name="line.693"></a>
-<span class="sourceLineNo">694</span>          LOG.fatal(msg, ex);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>          throw new RuntimeException(msg, ex);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>        throw new IOException(ex);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      }<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    });<a name="line.699"></a>
-<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>  public int getConnectionHashCode() {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return ConnectionId.hashCode(ticket, serviceName, address);<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  <a name="line.705"></a>
-<span class="sourceLineNo">706</span>  @Override<a name="line.706"></a>
-<span class="sourceLineNo">707</span>  public int hashCode() {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    return getConnectionHashCode();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>     <a name="line.710"></a>
-<span class="sourceLineNo">711</span>  @Override<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  public boolean equals(Object obj) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    if (obj instanceof AsyncRpcChannel) {<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      AsyncRpcChannel channel = (AsyncRpcChannel) obj;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      return channel.hashCode() == obj.hashCode();<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    }<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    return false;<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
+<span class="sourceLineNo">663</span>      @Override<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      public Void run() throws IOException, InterruptedException {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>        if (shouldAuthenticateOverKrb()) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          if (currRetries &lt; MAX_SASL_RETRIES) {<a name="line.666"></a>
+<span class="sourceLineNo">667</span>            LOG.debug("Exception encountered while connecting to the server : " + ex);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>            //try re-login<a name="line.668"></a>
+<span class="sourceLineNo">669</span>            if (UserGroupInformation.isLoginKeytabBased()) {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>              UserGroupInformation.getLoginUser().reloginFromKeytab();<a name="line.670"></a>
+<span class="sourceLineNo">671</span>            } else {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>              UserGroupInformation.getLoginUser().reloginFromTicketCache();<a name="line.672"></a>
+<span class="sourceLineNo">673</span>            }<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>            // Should reconnect<a name="line.675"></a>
+<span class="sourceLineNo">676</span>            return null;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>          } else {<a name="line.677"></a>
+<span class="sourceLineNo">678</span>            String msg = "Couldn't setup connection for " +<a name="line.678"></a>
+<span class="sourceLineNo">679</span>                UserGroupInformation.getLoginUser().getUserName() +<a name="line.679"></a>
+<span class="sourceLineNo">680</span>                " to " + serverPrincipal;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>            LOG.warn(msg);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>            throw (IOException) new IOException(msg).initCause(ex);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>          }<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        } else {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          LOG.warn("Exception encountered while connecting to " +<a name="line.685"></a>
+<span class="sourceLineNo">686</span>              "the server : " + ex);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        }<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (ex instanceof RemoteException) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw (RemoteException) ex;<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        if (ex instanceof SaslException) {<a name="line.691"></a>
+<span class="sourceLineNo">692</span>          String msg = "SASL authentication failed." +<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              " The most likely cause is missing or invalid credentials." +<a name="line.693"></a>
+<span class="sourceLineNo">694</span>              " Consider 'kinit'.";<a name="line.694"></a>
+<span class="sourceLineNo">695</span>          LOG.fatal(msg, ex);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          throw new RuntimeException(msg, ex);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>        }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>        throw new IOException(ex);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    });<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
+<span class="sourceLineNo">702</span><a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public int getConnectionHashCode() {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    return ConnectionId.hashCode(ticket, serviceName, address);<a name="line.704"></a>
+<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
+<span class="sourceLineNo">706</span><a name="line.706"></a>
+<span class="sourceLineNo">707</span>  @Override<a name="line.707"></a>
+<span class="sourceLineNo">708</span>  public int hashCode() {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    return getConnectionHashCode();<a name="line.709"></a>
+<span class="sourceLineNo">710</span>  }<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>  @Override<a name="line.712"></a>
+<span class="sourceLineNo">713</span>  public boolean equals(Object obj) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    if (obj instanceof AsyncRpcChannel) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      AsyncRpcChannel channel = (AsyncRpcChannel) obj;<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      return channel.hashCode() == obj.hashCode();<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    return false;<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
 <span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>  @Override<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  public String toString() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    return this.address.toString() + "/" + this.serviceName + "/" + this.ticket;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>  /**<a name="line.726"></a>
-<span class="sourceLineNo">727</span>   * Listens to call writes and fails if write failed<a name="line.727"></a>
-<span class="sourceLineNo">728</span>   */<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  private static final class CallWriteListener implements ChannelFutureListener {<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    private final AsyncRpcChannel rpcChannel;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    private final int id;<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>    public CallWriteListener(AsyncRpcChannel asyncRpcChannel, int id) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      this.rpcChannel = asyncRpcChannel;<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      this.id = id;<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
-<span class="sourceLineNo">737</span><a name="line.737"></a>
-<span class="sourceLineNo">738</span>    @Override<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    public void operationComplete(ChannelFuture future) throws Exception {<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      if (!future.isSuccess()) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>        AsyncCall call = rpcChannel.removePendingCall(id);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>        if (call != null) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>          if (future.cause() instanceof IOException) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>            call.setFailed((IOException) future.cause());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>          } else {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>            call.setFailed(new IOException(future.cause()));<a name="line.746"></a>
-<span class="sourceLineNo">747</span>          }<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        }<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      }<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>}<a name="line.752"></a>
+<span class="sourceLineNo">721</span><a name="line.721"></a>
+<span class="sourceLineNo">722</span>  @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>  public String toString() {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    return this.address.toString() + "/" + this.serviceName + "/" + this.ticket;<a name="line.724"></a>
+<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
+<span class="sourceLineNo">726</span><a name="line.726"></a>
+<span class="sourceLineNo">727</span>  /**<a name="line.727"></a>
+<span class="sourceLineNo">728</span>   * Listens to call writes and fails if write failed<a name="line.728"></a>
+<span class="sourceLineNo">729</span>   */<a name="line.729"></a>
+<span class="sourceLineNo">730</span>  private static final class CallWriteListener implements ChannelFutureListener {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    private final AsyncRpcChannel rpcChannel;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    private final int id;<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public CallWriteListener(AsyncRpcChannel asyncRpcChannel, int id) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      this.rpcChannel = asyncRpcChannel;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      this.id = id;<a name="line.736"></a>
+<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
+<span class="sourceLineNo">738</span><a name="line.738"></a>
+<span class="sourceLineNo">739</span>    @Override<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    public void operationComplete(ChannelFuture future) throws Exception {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      if (!future.isSuccess()) {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>        AsyncCall call = rpcChannel.removePendingCall(id);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        if (call != null) {<a name="line.743"></a>
+<span class="sourceLineNo">744</span>          if (future.cause() instanceof IOException) {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>            call.setFailed((IOException) future.cause());<a name="line.745"></a>
+<span class="sourceLineNo">746</span>          } else {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>            call.setFailed(new IOException(future.cause()));<a name="line.747"></a>
+<span class="sourceLineNo">748</span>          }<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        }<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
+<span class="sourceLineNo">753</span>}<a name="line.753"></a>
 
 
 


[18/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
index 8fc3dbd..efdc708 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
@@ -824,743 +824,747 @@
 <span class="sourceLineNo">816</span>          i++;<a name="line.816"></a>
 <span class="sourceLineNo">817</span>          lowestLocalityServerIndex = serverIndicesSortedByLocality[i];<a name="line.817"></a>
 <span class="sourceLineNo">818</span>        }<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        LOG.debug("Lowest locality region server with non zero regions is "<a name="line.819"></a>
-<span class="sourceLineNo">820</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        return lowestLocalityServerIndex;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      }<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span><a name="line.825"></a>
-<span class="sourceLineNo">826</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      if (regionFinder != null) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        float lowestLocality = 1.0f;<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        int lowestLocalityRegionIndex = 0;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          // No regions on that region server<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          return -1;<a name="line.832"></a>
-<span class="sourceLineNo">833</span>        }<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.836"></a>
-<span class="sourceLineNo">837</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          if (locality &lt; lowestLocality) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>            lowestLocality = locality;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>            lowestLocalityRegionIndex = j;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>          }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.844"></a>
-<span class="sourceLineNo">845</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            + " regions");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      } else {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        return -1;<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      }<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    float getLocalityOfRegion(int region, int server) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      if (regionFinder != null) {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      } else {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        return 0f;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      }<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      if (regionFinder != null) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        int leastLoadedServerIndex = -1;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        int load = Integer.MAX_VALUE;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        for (ServerName sn : topLocalServers) {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            continue;<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          }<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          if (regionsPerServer[index] == null) {<a name="line.872"></a>
+<span class="sourceLineNo">819</span>        if (LOG.isTraceEnabled()) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>          LOG.trace("Lowest locality region server with non zero regions is "<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.821"></a>
+<span class="sourceLineNo">822</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        return lowestLocalityServerIndex;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (regionFinder != null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        float lowestLocality = 1.0f;<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        int lowestLocalityRegionIndex = 0;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>          // No regions on that region server<a name="line.833"></a>
+<span class="sourceLineNo">834</span>          return -1;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>        }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.837"></a>
+<span class="sourceLineNo">838</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.838"></a>
+<span class="sourceLineNo">839</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.840"></a>
+<span class="sourceLineNo">841</span>          if (locality &lt; lowestLocality) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            lowestLocality = locality;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>            lowestLocalityRegionIndex = j;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>          }<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        if (LOG.isTraceEnabled()) {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.847"></a>
+<span class="sourceLineNo">848</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.848"></a>
+<span class="sourceLineNo">849</span>            + " regions");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        }<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      } else {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        return -1;<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      }<a name="line.854"></a>
+<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
+<span class="sourceLineNo">856</span><a name="line.856"></a>
+<span class="sourceLineNo">857</span>    float getLocalityOfRegion(int region, int server) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      if (regionFinder != null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      } else {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        return 0f;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      }<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>      if (regionFinder != null) {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        int leastLoadedServerIndex = -1;<a name="line.869"></a>
+<span class="sourceLineNo">870</span>        int load = Integer.MAX_VALUE;<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        for (ServerName sn : topLocalServers) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.872"></a>
 <span class="sourceLineNo">873</span>            continue;<a name="line.873"></a>
 <span class="sourceLineNo">874</span>          }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>          int tempLoad = regionsPerServer[index].length;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          if (tempLoad &lt;= load) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>            leastLoadedServerIndex = index;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>            load = tempLoad;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>        }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        return leastLoadedServerIndex;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        return -1;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      }<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>    void calculateRegionServerLocalities() {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      if (regionFinder == null) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        return;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            int regionIndex = regionsPerServer[i][j];<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          }<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        } else {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>    @VisibleForTesting<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    protected void setNumRegions(int numRegions) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      this.numRegions = numRegions;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    @VisibleForTesting<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      this.numMovedRegions = numMovedRegions;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        justification="Not important but should be fixed")<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      String desc = "Cluster{" +<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          "servers=[";<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          for(ServerName sn:servers) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>             desc += sn.getHostAndPort() + ", ";<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          }<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          desc +=<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          ", serverIndicesSortedByRegionCount="+<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.927"></a>
-<span class="sourceLineNo">928</span>          ", regionsPerServer=[";<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>          for (int[]r:regionsPerServer) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>            desc += Arrays.toString(r);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>          }<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          desc += "]" +<a name="line.933"></a>
-<span class="sourceLineNo">934</span>          ", numMaxRegionsPerTable=" +<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          ", numRegions=" +<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          numRegions +<a name="line.937"></a>
-<span class="sourceLineNo">938</span>          ", numServers=" +<a name="line.938"></a>
-<span class="sourceLineNo">939</span>          numServers +<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          ", numTables=" +<a name="line.940"></a>
-<span class="sourceLineNo">941</span>          numTables +<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          ", numMovedRegions=" +<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          numMovedRegions +<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          '}';<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      return desc;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span>  }<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>  // slop for regions<a name="line.949"></a>
-<span class="sourceLineNo">950</span>  protected float slop;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  protected Configuration config;<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  protected RackManager rackManager;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  // Regions of these tables are put on the master by default.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static final String TABLES_ON_MASTER =<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    "hbase.balancer.tablesOnMaster";<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  protected ClusterStatus clusterStatus = null;<a name="line.967"></a>
-<span class="sourceLineNo">968</span>  protected ServerName masterServerName;<a name="line.968"></a>
-<span class="sourceLineNo">969</span>  protected MasterServices services;<a name="line.969"></a>
-<span class="sourceLineNo">970</span><a name="line.970"></a>
-<span class="sourceLineNo">971</span>  /**<a name="line.971"></a>
-<span class="sourceLineNo">972</span>   * By default, regions of some small system tables such as meta,<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * want to assign any region to the active master, you need to<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   */<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    if (valueString == null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    valueString = valueString.trim();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return null;<a name="line.984"></a>
+<span class="sourceLineNo">875</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.875"></a>
+<span class="sourceLineNo">876</span>          if (regionsPerServer[index] == null) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>            continue;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          }<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          int tempLoad = regionsPerServer[index].length;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          if (tempLoad &lt;= load) {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>            leastLoadedServerIndex = index;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>            load = tempLoad;<a name="line.882"></a>
+<span class="sourceLineNo">883</span>          }<a name="line.883"></a>
+<span class="sourceLineNo">884</span>        }<a name="line.884"></a>
+<span class="sourceLineNo">885</span>        return leastLoadedServerIndex;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      } else {<a name="line.886"></a>
+<span class="sourceLineNo">887</span>        return -1;<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      }<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
+<span class="sourceLineNo">890</span><a name="line.890"></a>
+<span class="sourceLineNo">891</span>    void calculateRegionServerLocalities() {<a name="line.891"></a>
+<span class="sourceLineNo">892</span>      if (regionFinder == null) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        return;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.897"></a>
+<span class="sourceLineNo">898</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>            int regionIndex = regionsPerServer[i][j];<a name="line.900"></a>
+<span class="sourceLineNo">901</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.901"></a>
+<span class="sourceLineNo">902</span>          }<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        } else {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    @VisibleForTesting<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected void setNumRegions(int numRegions) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      this.numRegions = numRegions;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>    @VisibleForTesting<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      this.numMovedRegions = numMovedRegions;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.920"></a>
+<span class="sourceLineNo">921</span>        justification="Not important but should be fixed")<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    @Override<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public String toString() {<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      String desc = "Cluster{" +<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          "servers=[";<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          for(ServerName sn:servers) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>             desc += sn.getHostAndPort() + ", ";<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          }<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          desc +=<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          ", serverIndicesSortedByRegionCount="+<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.931"></a>
+<span class="sourceLineNo">932</span>          ", regionsPerServer=[";<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>          for (int[]r:regionsPerServer) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>            desc += Arrays.toString(r);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          desc += "]" +<a name="line.937"></a>
+<span class="sourceLineNo">938</span>          ", numMaxRegionsPerTable=" +<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          ", numRegions=" +<a name="line.940"></a>
+<span class="sourceLineNo">941</span>          numRegions +<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          ", numServers=" +<a name="line.942"></a>
+<span class="sourceLineNo">943</span>          numServers +<a name="line.943"></a>
+<span class="sourceLineNo">944</span>          ", numTables=" +<a name="line.944"></a>
+<span class="sourceLineNo">945</span>          numTables +<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          ", numMovedRegions=" +<a name="line.946"></a>
+<span class="sourceLineNo">947</span>          numMovedRegions +<a name="line.947"></a>
+<span class="sourceLineNo">948</span>          '}';<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      return desc;<a name="line.949"></a>
+<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
+<span class="sourceLineNo">952</span><a name="line.952"></a>
+<span class="sourceLineNo">953</span>  // slop for regions<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  protected float slop;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>  protected Configuration config;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  protected RackManager rackManager;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.957"></a>
+<span class="sourceLineNo">958</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.958"></a>
+<span class="sourceLineNo">959</span><a name="line.959"></a>
+<span class="sourceLineNo">960</span>  // Regions of these tables are put on the master by default.<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  public static final String TABLES_ON_MASTER =<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    "hbase.balancer.tablesOnMaster";<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.970"></a>
+<span class="sourceLineNo">971</span>  protected ClusterStatus clusterStatus = null;<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  protected ServerName masterServerName;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>  protected MasterServices services;<a name="line.973"></a>
+<span class="sourceLineNo">974</span><a name="line.974"></a>
+<span class="sourceLineNo">975</span>  /**<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * By default, regions of some small system tables such as meta,<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * want to assign any region to the active master, you need to<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.979"></a>
+<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
+<span class="sourceLineNo">981</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    if (valueString == null) {<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.984"></a>
 <span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    return StringUtils.getStrings(valueString);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
-<span class="sourceLineNo">990</span>   * Check if configured to put any tables on the active master<a name="line.990"></a>
-<span class="sourceLineNo">991</span>   */<a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    String[] tables = getTablesOnMaster(conf);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  public void setConf(Configuration conf) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    setSlop(conf);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    if (slop &lt; 0) slop = 0;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    else if (slop &gt; 1) slop = 1;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span><a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    this.config = conf;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    this.rackManager = new RackManager(getConf());<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    regionFinder.setConf(conf);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  }<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  protected void setSlop(Configuration conf) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1013"></a>
+<span class="sourceLineNo">986</span>    valueString = valueString.trim();<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      return null;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    return StringUtils.getStrings(valueString);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>  }<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>  /**<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * Check if configured to put any tables on the active master<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   */<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    String[] tables = getTablesOnMaster(conf);<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.998"></a>
+<span class="sourceLineNo">999</span>  }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span><a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>  @Override<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  public void setConf(Configuration conf) {<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    setSlop(conf);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    if (slop &lt; 0) slop = 0;<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    else if (slop &gt; 1) slop = 1;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    this.config = conf;<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.rackManager = new RackManager(getConf());<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    regionFinder.setConf(conf);<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  }<a name="line.1014"></a>
 <span class="sourceLineNo">1015</span><a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  /**<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * Check if a region belongs to some small system table.<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   */<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Balance the regions that should be on master regionserver.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    if (masterServerName == null<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (regions != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      for (HRegionInfo region: regions) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        // Find a non-master regionserver to host the region<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>        ServerName dest = keyIt.next();<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (masterServerName.equals(dest)) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          if (!keyIt.hasNext()) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>          dest = keyIt.next();<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        // Move this region away from the master regionserver<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (plans == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>        plans.add(plan);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        // Move this region to the master regionserver<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        if (plans == null) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        plans.add(plan);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    return plans;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>  }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span><a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>  /**<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>   * Assign the regions that should be on master regionserver.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>   */<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      return null;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      for (HRegionInfo region: regions) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        if (shouldBeOnMaster(region)) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          assignments.get(masterServerName).add(region);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    return assignments;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>  }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>  @Override<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public Configuration getConf() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    return this.config;<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  @Override<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    this.clusterStatus = st;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    regionFinder.setClusterStatus(st);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @Override<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    masterServerName = masterServices.getServerName();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    this.services = masterServices;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    this.regionFinder.setServices(masterServices);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  public void setRackManager(RackManager rackManager) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    this.rackManager = rackManager;<a name="line.1115"></a>
+<span class="sourceLineNo">1016</span>  protected void setSlop(Configuration conf) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>  }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span><a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>  /**<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * Check if a region belongs to some small system table.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   */<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  /**<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>   * Balance the regions that should be on master regionserver.<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>   */<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (masterServerName == null<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    if (regions != null) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      for (HRegionInfo region: regions) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        // Find a non-master regionserver to host the region<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>        ServerName dest = keyIt.next();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        if (masterServerName.equals(dest)) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          if (!keyIt.hasNext()) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          dest = keyIt.next();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span><a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>        // Move this region away from the master regionserver<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>        if (plans == null) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>        }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>        plans.add(plan);<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span><a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        // Move this region to the master regionserver<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (plans == null) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        plans.add(plan);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    return plans;<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>  }<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>  /**<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>   * Assign the regions that should be on master regionserver.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>   */<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      return null;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>    }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      for (HRegionInfo region: regions) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (shouldBeOnMaster(region)) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          assignments.get(masterServerName).add(region);<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    return assignments;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  @Override<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  public Configuration getConf() {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    return this.config;<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  @Override<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    this.clusterStatus = st;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    regionFinder.setClusterStatus(st);<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span><a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    masterServerName = masterServices.getServerName();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    this.services = masterServices;<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    this.regionFinder.setServices(masterServices);<a name="line.1115"></a>
 <span class="sourceLineNo">1116</span>  }<a name="line.1116"></a>
 <span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>  protected boolean needsBalance(Cluster c) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      if (LOG.isDebugEnabled()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            + " active regionserver(s)");<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      return false;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    // Check if we even need to do any load balancing<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    // HBASE-3681 check sloppiness first<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      if (LOG.isTraceEnabled()) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          "servers=" + cs.getNumServers() +<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      return false;<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    return true;<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  /**<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * rack hosts replicas of the same region<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   * @param c Cluster information<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   * @return whether region replicas are currently co-located<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return false;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  /**<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>   * simple round-robin assignment.<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * &lt;p&gt;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>   * &lt;p&gt;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   *<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   *<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * @param regions all regions<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * @param servers all servers<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   * @return map of server to the regions it should take, or null if no<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   */<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  @Override<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      List&lt;ServerName&gt; servers) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    metricsBalancer.incrMiscInvocations();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Guarantee not to put other regions on master<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      servers.remove(masterServerName);<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>      if (!masterRegions.isEmpty()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>        for (HRegionInfo region: masterRegions) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          regions.remove(region);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (regions == null || regions.isEmpty()) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return assignments;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (numServers == 0) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      return null;<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      ServerName server = servers.get(0);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      return assignments;<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      servers, assignments);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      boolean assigned = false;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>          if (serverRegions == null) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>            assignments.put(serverName, serverRegions);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          serverRegions.add(region);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cluster.doAssignRegion(region, serverName);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          assigned = true;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          break;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!assigned) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        lastFewRegions.add(region);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    for (HRegionInfo region : lastFewRegions) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      int i = RANDOM.nextInt(numServers);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      ServerName server = servers.get(i);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      List&lt;HRegionInfo&gt; serverRegions = assignments.get(server);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (serverRegions == null) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>        assignments.put(server, serverRegions);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      serverRegions.add(region);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      cluster.doAssignRegion(region, server);<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    return assignments;<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      Collection&lt;HRegionInfo&gt; regions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // replicas of the regions that are passed (for performance).<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    for (ServerName server : servers) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      if (!clusterState.containsKey(server)) {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      rackManager);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * regions in transition that do not have an already known destination.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   *<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * assigned to.<a name="line.1283"></a>
+<span class="sourceLineNo">1118</span>  public void setRackManager(RackManager rackManager) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    this.rackManager = rackManager;<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span><a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  protected boolean needsBalance(Cluster c) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      if (LOG.isDebugEnabled()) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            + " active regionserver(s)");<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    // Check if we even need to do any load balancing<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    // HBASE-3681 check sloppiness first<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (LOG.isTraceEnabled()) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>          "servers=" + cs.getNumServers() +<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      return false;<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    return true;<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>  /**<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   * rack hosts replicas of the same region<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * @param c Cluster information<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>   * @return whether region replicas are currently co-located<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>   */<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    return false;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  /**<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * simple round-robin assignment.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * &lt;p&gt;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   * &lt;p&gt;<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>   *<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>   *<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   * @param regions all regions<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * @param servers all servers<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @return map of server to the regions it should take, or null if no<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      List&lt;ServerName&gt; servers) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    metricsBalancer.incrMiscInvocations();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      // Guarantee not to put other regions on master<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      servers.remove(masterServerName);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      if (!masterRegions.isEmpty()) {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        for (HRegionInfo region: masterRegions) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          regions.remove(region);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regions == null || regions.isEmpty()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return assignments;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    if (numServers == 0) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return null;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      ServerName server = servers.get(0);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      return assignments;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>      servers, assignments);<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span><a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      boolean assigned = false;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          if (serverRegions == null) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>            assignments.put(serverName, serverRegions);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>          serverRegions.add(region);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          cluster.doAssignRegion(region, serverName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          assigned = true;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>          break;<a name="line.1241"></a>
+<span class="sourceLine

<TRUNCATED>

[33/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html
index 704e192..e5d9af6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html
@@ -92,2526 +92,2571 @@
 <span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.conf.ConfigurationObserver;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.exceptions.RegionMovedException;<a name="line.85"></a>
 <span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.User;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.io.BytesWritable;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.io.IntWritable;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.io.Writable;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.io.WritableUtils;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.util.StringUtils;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.htrace.TraceInfo;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import com.google.protobuf.BlockingService;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import com.google.protobuf.CodedInputStream;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import com.google.protobuf.Message;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import com.google.protobuf.ServiceException;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.140"></a>
-<span class="sourceLineNo">141</span> *<a name="line.141"></a>
-<span class="sourceLineNo">142</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.142"></a>
-<span class="sourceLineNo">143</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.143"></a>
-<span class="sourceLineNo">144</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.144"></a>
-<span class="sourceLineNo">145</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.145"></a>
-<span class="sourceLineNo">146</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.146"></a>
-<span class="sourceLineNo">147</span> * and loops till done.<a name="line.147"></a>
-<span class="sourceLineNo">148</span> *<a name="line.148"></a>
-<span class="sourceLineNo">149</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.149"></a>
-<span class="sourceLineNo">150</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.150"></a>
-<span class="sourceLineNo">151</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.151"></a>
-<span class="sourceLineNo">152</span> * and keep taking while the server is up.<a name="line.152"></a>
-<span class="sourceLineNo">153</span> *<a name="line.153"></a>
-<span class="sourceLineNo">154</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.154"></a>
-<span class="sourceLineNo">155</span> * queue for Responder to pull from and return result to client.<a name="line.155"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferInputStream;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.User;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.io.BytesWritable;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.io.IntWritable;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.io.Writable;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.io.WritableUtils;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.util.StringUtils;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.htrace.TraceInfo;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import com.google.protobuf.BlockingService;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import com.google.protobuf.CodedInputStream;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import com.google.protobuf.CodedOutputStream;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import com.google.protobuf.Message;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import com.google.protobuf.ServiceException;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.143"></a>
+<span class="sourceLineNo">144</span> *<a name="line.144"></a>
+<span class="sourceLineNo">145</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.145"></a>
+<span class="sourceLineNo">146</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.146"></a>
+<span class="sourceLineNo">147</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.147"></a>
+<span class="sourceLineNo">148</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.148"></a>
+<span class="sourceLineNo">149</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.149"></a>
+<span class="sourceLineNo">150</span> * and loops till done.<a name="line.150"></a>
+<span class="sourceLineNo">151</span> *<a name="line.151"></a>
+<span class="sourceLineNo">152</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.152"></a>
+<span class="sourceLineNo">153</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.153"></a>
+<span class="sourceLineNo">154</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.154"></a>
+<span class="sourceLineNo">155</span> * and keep taking while the server is up.<a name="line.155"></a>
 <span class="sourceLineNo">156</span> *<a name="line.156"></a>
-<span class="sourceLineNo">157</span> * @see RpcClientImpl<a name="line.157"></a>
-<span class="sourceLineNo">158</span> */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.159"></a>
-<span class="sourceLineNo">160</span>@InterfaceStability.Evolving<a name="line.160"></a>
-<span class="sourceLineNo">161</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      = new CallQueueTooBigException();<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final boolean authorize;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private boolean isSecurityEnabled;<a name="line.168"></a>
+<span class="sourceLineNo">157</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.157"></a>
+<span class="sourceLineNo">158</span> * queue for Responder to pull from and return result to client.<a name="line.158"></a>
+<span class="sourceLineNo">159</span> *<a name="line.159"></a>
+<span class="sourceLineNo">160</span> * @see RpcClientImpl<a name="line.160"></a>
+<span class="sourceLineNo">161</span> */<a name="line.161"></a>
+<span class="sourceLineNo">162</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.162"></a>
+<span class="sourceLineNo">163</span>@InterfaceStability.Evolving<a name="line.163"></a>
+<span class="sourceLineNo">164</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      = new CallQueueTooBigException();<a name="line.168"></a>
 <span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public static final byte CURRENT_VERSION = 0;<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<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>   * How many calls/handler are allowed in the queue.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * The maximum size that we can hold in the RPC queue<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private final IPCUtil ipcUtil;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    Server.class.getName());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  protected ServiceAuthorizationManager authManager;<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * after the call returns.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   */<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  protected final InetSocketAddress bindAddress;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  protected int port;                             // port we listen on<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private int readThreads;                        // number of read threads<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.210"></a>
-<span class="sourceLineNo">211</span>                                                  // which a client may be<a name="line.211"></a>
-<span class="sourceLineNo">212</span>                                                  // disconnected<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.213"></a>
-<span class="sourceLineNo">214</span>                                                  // connections after which we<a name="line.214"></a>
-<span class="sourceLineNo">215</span>                                                  // will start cleaning up idle<a name="line.215"></a>
-<span class="sourceLineNo">216</span>                                                  // connections<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.217"></a>
-<span class="sourceLineNo">218</span>                                                  // connections to nuke<a name="line.218"></a>
-<span class="sourceLineNo">219</span>                                                  // during a cleanup<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  protected MetricsHBaseServer metrics;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  protected final Configuration conf;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private int maxQueueSize;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  protected int socketSendBufferSize;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  volatile boolean running = true;<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>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * for business by the call to {@link #start()}.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  volatile boolean started = false;<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>   * This is a running count of the size of all outstanding calls by size.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  protected final Counter callQueueSize = new Counter();<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  //maintain a list<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  //of client connections<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private Listener listener = null;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  protected Responder responder = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  protected int numConnections = 0;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.261"></a>
+<span class="sourceLineNo">170</span>  private final boolean authorize;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private boolean isSecurityEnabled;<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public static final byte CURRENT_VERSION = 0;<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * How many calls/handler are allowed in the queue.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * The maximum size that we can hold in the RPC queue<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private final IPCUtil ipcUtil;<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    Server.class.getName());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  protected ServiceAuthorizationManager authManager;<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * after the call returns.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   */<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected final InetSocketAddress bindAddress;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected int port;                             // port we listen on<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  private int readThreads;                        // number of read threads<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.213"></a>
+<span class="sourceLineNo">214</span>                                                  // which a client may be<a name="line.214"></a>
+<span class="sourceLineNo">215</span>                                                  // disconnected<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.216"></a>
+<span class="sourceLineNo">217</span>                                                  // connections after which we<a name="line.217"></a>
+<span class="sourceLineNo">218</span>                                                  // will start cleaning up idle<a name="line.218"></a>
+<span class="sourceLineNo">219</span>                                                  // connections<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.220"></a>
+<span class="sourceLineNo">221</span>                                                  // connections to nuke<a name="line.221"></a>
+<span class="sourceLineNo">222</span>                                                  // during a cleanup<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected MetricsHBaseServer metrics;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  protected final Configuration conf;<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private int maxQueueSize;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  protected int socketSendBufferSize;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  volatile boolean running = true;<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * for business by the call to {@link #start()}.<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  volatile boolean started = false;<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  /**<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * This is a running count of the size of all outstanding calls by size.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  protected final Counter callQueueSize = new Counter();<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  //maintain a list<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  //of client connections<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private Listener listener = null;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  protected Responder responder = null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  protected int numConnections = 0;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  /** Default value for above params */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  private final int warnResponseTime;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private final int warnResponseSize;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  private final Server server;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  private final RpcScheduler scheduler;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>  private UserProvider userProvider;<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  private final BoundedByteBufferPool reservoir;<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * the result.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  class Call implements RpcCallContext {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    protected int id;                             // the client's call id<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    protected BlockingService service;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    protected MethodDescriptor md;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    protected RequestHeader header;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    protected Message param;                      // the parameter passed<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    // Optional cell data passed outside of protobufs.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    protected CellScanner cellScanner;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    protected Connection connection;              // connection to client<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    protected long timestamp;      // the time received when response is null<a name="line.295"></a>
-<span class="sourceLineNo">296</span>                                   // the time served when response is not null<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
-<span class="sourceLineNo">298</span>     * Chain of buffers to send as response.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>     */<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    protected BufferChain response;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    protected Responder responder;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    protected long size;                          // size of current call<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    protected boolean isError;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    protected TraceInfo tinfo;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    private ByteBuffer cellBlock = null;<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private User user;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private InetAddress remoteAddress;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RpcCallback callback;<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private long responseCellSize = 0;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private long responseBlockSize = 0;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private boolean retryImmediatelySupported;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.318"></a>
-<span class="sourceLineNo">319</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.id = id;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.service = service;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.md = md;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.header = header;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      this.param = param;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      this.cellScanner = cellScanner;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      this.connection = connection;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      this.timestamp = System.currentTimeMillis();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      this.response = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      this.responder = responder;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      this.isError = false;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.size = size;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.tinfo = tinfo;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.remoteAddress = remoteAddress;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.retryImmediatelySupported =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    /**<a name="line.340"></a>
-<span class="sourceLineNo">341</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.341"></a>
-<span class="sourceLineNo">342</span>     * cleanup.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>     */<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    void done() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        // Return buffer to reservoir now we are done with it.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        reservoir.putBuffer(this.cellBlock);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        this.cellBlock = null;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>    @Override<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    public String toString() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      return toShortString() + " param: " +<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        " connection: " + connection.toString();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>    protected RequestHeader getHeader() {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      return this.header;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    /*<a name="line.366"></a>
-<span class="sourceLineNo">367</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.367"></a>
-<span class="sourceLineNo">368</span>     * the payload of a command<a name="line.368"></a>
-<span class="sourceLineNo">369</span>     */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    String toShortString() {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      String serviceName = this.connection.service != null ?<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          " connection: " + connection.toString();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    String toTraceString() {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      String serviceName = this.connection.service != null ?<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return serviceName + "." + methodName;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      this.response = new BufferChain(response);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        Throwable t, String errorMsg) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      if (this.isError) return;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (t != null) this.isError = true;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      BufferChain bc = null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      try {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        // Presume it a pb Message.  Could be null.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        Message result = (Message)m;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        // Call id.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        headerBuilder.setCallId(this.id);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (t != null) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (t instanceof RegionMovedException) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.408"></a>
-<span class="sourceLineNo">409</span>            // any kind of payload.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          // Set the exception as the result of the method invocation.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        if (this.cellBlock != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        Message header = headerBuilder.build();<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>        // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        // one big byte array; save on allocations.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        ByteBuffer bbHeader = IPCUtil.getDelimitedMessageAsByteBuffer(header);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        ByteBuffer bbResult = IPCUtil.getDelimitedMessageAsByteBuffer(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        int totalSize = bbHeader.capacity() + (bbResult == null? 0: bbResult.limit()) +<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (this.cellBlock == null? 0: this.cellBlock.limit());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        ByteBuffer bbTotalSize = ByteBuffer.wrap(Bytes.toBytes(totalSize));<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        bc = new BufferChain(bbTotalSize, bbHeader, bbResult, this.cellBlock);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        if (connection.useWrap) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          bc = wrapWithSasl(bc);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      } catch (IOException e) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        LOG.warn("Exception while creating response " + e);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      this.response = bc;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (this.callback != null) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          this.callback.run();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        } catch (Exception e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          // Don't allow any exception here to kill this handler thread.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private BufferChain wrapWithSasl(BufferChain bc)<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        throws IOException {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      if (!this.connection.useSasl) return bc;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // Looks like no way around this; saslserver wants a byte array.  I have to make it one.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // THIS IS A BIG UGLY COPY.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      byte [] responseBytes = bc.getBytes();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      byte [] token;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // synchronization may be needed since there can be multiple Handler<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      // threads using saslServer to wrap responses.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      synchronized (connection.saslServer) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        token = connection.saslServer.wrap(responseBytes, 0, responseBytes.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      if (LOG.isTraceEnabled()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        LOG.trace("Adding saslServer wrapped token of size " + token.length<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            + " as call response.");<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>      ByteBuffer bbTokenLength = ByteBuffer.wrap(Bytes.toBytes(token.length));<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      ByteBuffer bbTokenBytes = ByteBuffer.wrap(token);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return new BufferChain(bbTokenLength, bbTokenBytes);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public boolean isClientCellBlockSupported() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      return this.connection != null &amp;&amp; this.connection.codec != null;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>    @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    public long disconnectSince() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (!connection.channel.isOpen()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        return System.currentTimeMillis() - timestamp;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      } else {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        return -1L;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>    public long getSize() {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      return this.size;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>    public long getResponseCellSize() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return responseCellSize;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    public void incrementResponseCellSize(long cellSize) {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      responseCellSize += cellSize;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    @Override<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    public long getResponseBlockSize() {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return responseBlockSize;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    @Override<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    public void incrementResponseBlockSize(long blockSize) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      responseBlockSize += blockSize;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    public synchronized void sendResponseIfReady() throws IOException {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.responder.doRespond(this);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    public UserGroupInformation getRemoteUser() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      return connection.ugi;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    @Override<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    public User getRequestUser() {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      return user;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    @Override<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    public String getRequestUserName() {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      User user = getRequestUser();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return user == null? null: user.getShortName();<a name="line.531"></a>
+<span class="sourceLineNo">263</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  /** Default value for above params */<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  private final int warnResponseTime;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  private final int warnResponseSize;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  private final Server server;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  private final RpcScheduler scheduler;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  private UserProvider userProvider;<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>  private final BoundedByteBufferPool reservoir;<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * the result.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  class Call implements RpcCallContext {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int id;                             // the client's call id<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    protected BlockingService service;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    protected MethodDescriptor md;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    protected RequestHeader header;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    protected Message param;                      // the parameter passed<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // Optional cell data passed outside of protobufs.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    protected CellScanner cellScanner;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    protected Connection connection;              // connection to client<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    protected long timestamp;      // the time received when response is null<a name="line.298"></a>
+<span class="sourceLineNo">299</span>                                   // the time served when response is not null<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    /**<a name="line.300"></a>
+<span class="sourceLineNo">301</span>     * Chain of buffers to send as response.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>     */<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    protected BufferChain response;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    protected Responder responder;<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    protected long size;                          // size of current call<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    protected boolean isError;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    protected TraceInfo tinfo;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    private ByteBuffer cellBlock = null;<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    private User user;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    private InetAddress remoteAddress;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    private RpcCallback callback;<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private long responseCellSize = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private long responseBlockSize = 0;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    private boolean retryImmediatelySupported;<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.321"></a>
+<span class="sourceLineNo">322</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.322"></a>
+<span class="sourceLineNo">323</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      this.id = id;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      this.service = service;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      this.md = md;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      this.header = header;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      this.param = param;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      this.cellScanner = cellScanner;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      this.connection = connection;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.timestamp = System.currentTimeMillis();<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.response = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      this.responder = responder;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      this.isError = false;<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      this.size = size;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.tinfo = tinfo;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.remoteAddress = remoteAddress;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.retryImmediatelySupported =<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    /**<a name="line.343"></a>
+<span class="sourceLineNo">344</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.344"></a>
+<span class="sourceLineNo">345</span>     * cleanup.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>     */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    void done() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        // Return buffer to reservoir now we are done with it.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        reservoir.putBuffer(this.cellBlock);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        this.cellBlock = null;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    @Override<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    public String toString() {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      return toShortString() + " param: " +<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        " connection: " + connection.toString();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    protected RequestHeader getHeader() {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      return this.header;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>    /*<a name="line.369"></a>
+<span class="sourceLineNo">370</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.370"></a>
+<span class="sourceLineNo">371</span>     * the payload of a command<a name="line.371"></a>
+<span class="sourceLineNo">372</span>     */<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    String toShortString() {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      String serviceName = this.connection.service != null ?<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          " connection: " + connection.toString();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    String toTraceString() {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      String serviceName = this.connection.service != null ?<a name="line.383"></a>
+<span class="sourceLineNo">384</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return serviceName + "." + methodName;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      this.response = new BufferChain(response);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        Throwable t, String errorMsg) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      if (this.isError) return;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      if (t != null) this.isError = true;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      BufferChain bc = null;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      try {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        // Presume it a pb Message.  Could be null.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        Message result = (Message)m;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        // Call id.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        headerBuilder.setCallId(this.id);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (t != null) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (t instanceof RegionMovedException) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            // any kind of payload.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          // Set the exception as the result of the method invocation.<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        if (this.cellBlock != null) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        Message header = headerBuilder.build();<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>        byte[] b = createHeaderAndMessageBytes(result, header);<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>        bc = new BufferChain(ByteBuffer.wrap(b), this.cellBlock);<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>        if (connection.useWrap) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          bc = wrapWithSasl(bc);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      } catch (IOException e) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        LOG.warn("Exception while creating response " + e);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      this.response = bc;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      if (this.callback != null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          this.callback.run();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        } catch (Exception e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          // Don't allow any exception here to kill this handler thread.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>    private byte[] createHeaderAndMessageBytes(Message result, Message header)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // one big byte array; save on allocations.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      int headerSerializedSize = 0, resultSerializedSize = 0, headerVintSize = 0,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          resultVintSize = 0;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (header != null) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        headerSerializedSize = header.getSerializedSize();<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        headerVintSize = CodedOutputStream.computeRawVarint32Size(headerSerializedSize);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (result != null) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        resultSerializedSize = result.getSerializedSize();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        resultVintSize = CodedOutputStream.computeRawVarint32Size(resultSerializedSize);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      // calculate the total size<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      int totalSize = headerSerializedSize + headerVintSize<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          + (resultSerializedSize + resultVintSize)<a name="line.472"></a>
+<span class="sourceLineNo">473</span>          + (this.cellBlock == null ? 0 : this.cellBlock.limit());<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // The byte[] should also hold the totalSize of the header, message and the cellblock<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      byte[] b = new byte[headerSerializedSize + headerVintSize + resultSerializedSize<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          + resultVintSize + Bytes.SIZEOF_INT];<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      // The RpcClient expects the int to be in a format that code be decoded by<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // the DataInputStream#readInt(). Hence going with the Bytes.toBytes(int)<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // form of writing int.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Bytes.putInt(b, 0, totalSize);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      CodedOutputStream cos = CodedOutputStream.newInstance(b, Bytes.SIZEOF_INT,<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          b.length - Bytes.SIZEOF_INT);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (header != null) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        cos.writeMessageNoTag(header);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      if (result != nu

<TRUNCATED>

[44/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.html b/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.html
index 8f8e0ba..99b4308 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.html
@@ -450,7 +450,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>getMergedRegionsAndSplitParents</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/util/Triple.html" title="class in org.apache.hadoop.hbase.util">Triple</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" ti
 tle="class in org.apache.hadoop.hbase.client">Result</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.117">getMergedRegionsAndSplitParents</a>()
+<pre><a href="../../../../../org/apache/hadoop/hbase/util/Triple.html" title="class in org.apache.hadoop.hbase.util">Triple</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" ti
 tle="class in org.apache.hadoop.hbase.client">Result</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.121">getMergedRegionsAndSplitParents</a>()
                                                                                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Scans hbase:meta and returns a number of scanned rows, and a map of merged
  regions, and an ordered map of split parents.</div>
@@ -466,7 +466,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>getMergedRegionsAndSplitParents</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/util/Triple.html" title="class in org.apache.hadoop.hbase.util">Triple</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" ti
 tle="class in org.apache.hadoop.hbase.client">Result</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.132">getMergedRegionsAndSplitParents</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
+<pre><a href="../../../../../org/apache/hadoop/hbase/util/Triple.html" title="class in org.apache.hadoop.hbase.util">Triple</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" ti
 tle="class in org.apache.hadoop.hbase.client">Result</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.136">getMergedRegionsAndSplitParents</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                                                                                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Scans hbase:meta and returns a number of scanned rows, and a map of merged
  regions, and an ordered map of split parents. if the given table name is
@@ -485,7 +485,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanMergeRegion</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.182">cleanMergeRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;mergedRegion,
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.186">cleanMergeRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;mergedRegion,
                        <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionA,
                        <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionB)
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -504,7 +504,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>scan</h4>
-<pre>int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.214">scan</a>()
+<pre>int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.218">scan</a>()
    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Run janitorial scan of catalog <code>hbase:meta</code> table looking for
  garbage to collect.</div>
@@ -519,7 +519,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanParent</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.315">cleanParent</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.319">cleanParent</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
                   <a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;rowContent)
               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">If daughters no longer hold reference to the parents, delete the parent.</div>
@@ -537,7 +537,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>hasNoReferences</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.348">hasNoReferences</a>(<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;p)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.352">hasNoReferences</a>(<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;p)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>p</code> - A pair where the first boolean says whether or not the daughter
  region directory exists in the filesystem and then the second boolean says
  whether the daughter has references to the parent.</dd>
@@ -550,7 +550,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>checkDaughterInFs</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.362">checkDaughterInFs</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
+<pre><a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.366">checkDaughterInFs</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parent,
                                       <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;daughter)
                                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Checks if a daughter region -- either splitA or splitB -- still holds
@@ -569,7 +569,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableDescriptor</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.405">getTableDescriptor</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.409">getTableDescriptor</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                                      throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/FileNotFoundException.html?is-external=true" title="class or interface in java.io">FileNotFoundException</a>,
                                             <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -583,7 +583,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cleanMergeQualifier</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.417">cleanMergeQualifier</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.421">cleanMergeQualifier</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)
                             throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Checks if the specified region has merge qualifiers, if so, try to clean
  them</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
index b6afee9..3117fb1 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
@@ -1121,7 +1121,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getLowestLocalityRegionOnServer</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.826">getLowestLocalityRegionOnServer</a>(int&nbsp;serverIndex)</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.828">getLowestLocalityRegionOnServer</a>(int&nbsp;serverIndex)</pre>
 </li>
 </ul>
 <a name="getLocalityOfRegion(int, int)">
@@ -1130,7 +1130,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getLocalityOfRegion</h4>
-<pre>float&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.853">getLocalityOfRegion</a>(int&nbsp;region,
+<pre>float&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.857">getLocalityOfRegion</a>(int&nbsp;region,
                         int&nbsp;server)</pre>
 </li>
 </ul>
@@ -1140,7 +1140,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getLeastLoadedTopServerForRegion</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.862">getLeastLoadedTopServerForRegion</a>(int&nbsp;region)</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.866">getLeastLoadedTopServerForRegion</a>(int&nbsp;region)</pre>
 </li>
 </ul>
 <a name="calculateRegionServerLocalities()">
@@ -1149,7 +1149,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>calculateRegionServerLocalities</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.887">calculateRegionServerLocalities</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.891">calculateRegionServerLocalities</a>()</pre>
 </li>
 </ul>
 <a name="setNumRegions(int)">
@@ -1158,7 +1158,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setNumRegions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.907">setNumRegions</a>(int&nbsp;numRegions)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.911">setNumRegions</a>(int&nbsp;numRegions)</pre>
 </li>
 </ul>
 <a name="setNumMovedRegions(int)">
@@ -1167,7 +1167,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setNumMovedRegions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.912">setNumMovedRegions</a>(int&nbsp;numMovedRegions)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.916">setNumMovedRegions</a>(int&nbsp;numMovedRegions)</pre>
 </li>
 </ul>
 <a name="toString()">
@@ -1176,7 +1176,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.919">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#line.923">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
index 7cd38e7..709514e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
@@ -500,7 +500,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>slop</h4>
-<pre>protected&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.950">slop</a></pre>
+<pre>protected&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.954">slop</a></pre>
 </li>
 </ul>
 <a name="config">
@@ -509,7 +509,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>config</h4>
-<pre>protected&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.951">config</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.955">config</a></pre>
 </li>
 </ul>
 <a name="rackManager">
@@ -518,7 +518,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>rackManager</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.952">rackManager</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.956">rackManager</a></pre>
 </li>
 </ul>
 <a name="RANDOM">
@@ -527,7 +527,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>RANDOM</h4>
-<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.953">RANDOM</a></pre>
+<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.957">RANDOM</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -536,7 +536,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.954">LOG</a></pre>
+<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.958">LOG</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_TABLES_ON_MASTER">
@@ -545,7 +545,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_TABLES_ON_MASTER</h4>
-<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.957">DEFAULT_TABLES_ON_MASTER</a></pre>
+<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.961">DEFAULT_TABLES_ON_MASTER</a></pre>
 </li>
 </ul>
 <a name="TABLES_ON_MASTER">
@@ -554,7 +554,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLES_ON_MASTER</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.962">TABLES_ON_MASTER</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.966">TABLES_ON_MASTER</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.TABLES_ON_MASTER">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -564,7 +564,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>tablesOnMaster</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.965">tablesOnMaster</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.969">tablesOnMaster</a></pre>
 </li>
 </ul>
 <a name="metricsBalancer">
@@ -573,7 +573,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>metricsBalancer</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/MetricsBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">MetricsBalancer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.966">metricsBalancer</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/MetricsBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">MetricsBalancer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.970">metricsBalancer</a></pre>
 </li>
 </ul>
 <a name="clusterStatus">
@@ -582,7 +582,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>clusterStatus</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ClusterStatus.html" title="class in org.apache.hadoop.hbase">ClusterStatus</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.967">clusterStatus</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ClusterStatus.html" title="class in org.apache.hadoop.hbase">ClusterStatus</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.971">clusterStatus</a></pre>
 </li>
 </ul>
 <a name="masterServerName">
@@ -591,7 +591,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>masterServerName</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.968">masterServerName</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.972">masterServerName</a></pre>
 </li>
 </ul>
 <a name="services">
@@ -600,7 +600,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockListLast">
 <li class="blockList">
 <h4>services</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.969">services</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.973">services</a></pre>
 </li>
 </ul>
 </li>
@@ -646,7 +646,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>getTablesOnMaster</h4>
-<pre>protected static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.977">getTablesOnMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>protected static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.981">getTablesOnMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">By default, regions of some small system tables such as meta,
  namespace, and acl are assigned to the active master. If you don't
  want to assign any region to the active master, you need to
@@ -659,7 +659,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>tablesOnMaster</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.992">tablesOnMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.996">tablesOnMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Check if configured to put any tables on the active master</div>
 </li>
 </ul>
@@ -669,7 +669,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>setConf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.998">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1002">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code>setConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -682,7 +682,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>setSlop</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1012">setSlop</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1016">setSlop</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="shouldBeOnMaster(org.apache.hadoop.hbase.HRegionInfo)">
@@ -691,7 +691,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldBeOnMaster</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1020">shouldBeOnMaster</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1024">shouldBeOnMaster</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)</pre>
 <div class="block">Check if a region belongs to some small system table.
  If so, the primary replica may be expected to be put on the master regionserver.</div>
 </li>
@@ -702,7 +702,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceMasterRegions</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1028">balanceMasterRegions</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;clusterMap)</pr
 e>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1032">balanceMasterRegions</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;clusterMap)</pr
 e>
 <div class="block">Balance the regions that should be on master regionserver.</div>
 </li>
 </ul>
@@ -712,7 +712,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>assignMasterRegions</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1078">assignMasterRegions</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1082">assignMasterRegions</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                     <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 <div class="block">Assign the regions that should be on master regionserver.</div>
 </li>
@@ -723,7 +723,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>getConf</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1097">getConf</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1101">getConf</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code>getConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -736,7 +736,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterStatus</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1102">setClusterStatus</a>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterStatus.html" title="class in org.apache.hadoop.hbase">ClusterStatus</a>&nbsp;st)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1106">setClusterStatus</a>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterStatus.html" title="class in org.apache.hadoop.hbase">ClusterStatus</a>&nbsp;st)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterStatus(org.apache.hadoop.hbase.ClusterStatus)">LoadBalancer</a></code></strong></div>
 <div class="block">Set the current cluster status.  This allows a LoadBalancer to map host name to a server</div>
 <dl>
@@ -751,7 +751,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>setMasterServices</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1108">setMasterServices</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1112">setMasterServices</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setMasterServices(org.apache.hadoop.hbase.master.MasterServices)">LoadBalancer</a></code></strong></div>
 <div class="block">Set the master service.</div>
 <dl>
@@ -766,7 +766,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>setRackManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1114">setRackManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a>&nbsp;rackManager)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1118">setRackManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a>&nbsp;rackManager)</pre>
 </li>
 </ul>
 <a name="needsBalance(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">
@@ -775,7 +775,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>needsBalance</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1118">needsBalance</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;c)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1122">needsBalance</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;c)</pre>
 </li>
 </ul>
 <a name="areSomeRegionReplicasColocated(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">
@@ -784,7 +784,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>areSomeRegionReplicasColocated</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1155">areSomeRegionReplicasColocated</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;c)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1159">areSomeRegionReplicasColocated</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;c)</pre>
 <div class="block">Subclasses should implement this to return true if the cluster has nodes that hosts
  multiple replicas for the same region, or, if there are multiple racks and the same
  rack hosts replicas of the same region</div>
@@ -798,7 +798,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>roundRobinAssignment</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1177">roundRobinAssignment</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1181">roundRobinAssignment</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                      <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 <div class="block">Generates a bulk assignment plan to be used on cluster startup using a
  simple round-robin assignment.
@@ -824,7 +824,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>createCluster</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1260">createCluster</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1264">createCluster</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                                      <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</pre>
 </li>
 </ul>
@@ -834,7 +834,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>immediateAssignment</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1295">immediateAssignment</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1299">immediateAssignment</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                               <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 <div class="block">Generates an immediate assignment plan to be used by a new master for
  regions in transition that do not have an already known destination.
@@ -860,7 +860,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>randomAssignment</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1314">randomAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1318">randomAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                           <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 <div class="block">Used to assign a single region to a random server.</div>
 <dl>
@@ -876,7 +876,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>retainAssignment</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1357">retainAssignment</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/
 hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1361">retainAssignment</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/
 hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                                  <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 <div class="block">Generates a bulk assignment startup plan, attempting to reuse the existing
  assignment information from META, but adjusting for the specified list of
@@ -902,7 +902,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>initialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1469">initialize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1473">initialize</a>()
                 throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#initialize()">LoadBalancer</a></code></strong></div>
 <div class="block">Initialize the load balancer. Must be called after setters.</div>
@@ -919,7 +919,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOnline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1473">regionOnline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1477">regionOnline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                 <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOnline(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName)">LoadBalancer</a></code></strong></div>
 <div class="block">Marks the region as online at balancer.</div>
@@ -935,7 +935,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOffline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1477">regionOffline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1481">regionOffline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOffline(org.apache.hadoop.hbase.HRegionInfo)">LoadBalancer</a></code></strong></div>
 <div class="block">Marks the region as offline at balancer.</div>
 <dl>
@@ -950,7 +950,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>isStopped</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1481">isStopped</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1485">isStopped</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html#isStopped()">isStopped</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a></code></dd>
@@ -963,7 +963,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1486">stop</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1490">stop</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html#stop(java.lang.String)">Stoppable</a></code></strong></div>
 <div class="block">Stop this service.</div>
 <dl>
@@ -978,7 +978,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>randomAssignment</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1494">randomAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1498">randomAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                           <a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                           <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 <div class="block">Used to assign a single region to a random server.</div>
@@ -990,7 +990,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>roundRobinAssignment</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1513">roundRobinAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1517">roundRobinAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                         <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                         <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;unassignedRegions,
                         <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
@@ -1004,7 +1004,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionAssignmentsByServer</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1543">getRegionAssignmentsByServer</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions
 )</pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1547">getRegionAssignmentsByServer</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions
 )</pre>
 </li>
 </ul>
 <a name="onConfigurationChange(org.apache.hadoop.conf.Configuration)">
@@ -1013,7 +1013,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1553">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1557">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html#onConfigurationChange(org.apache.hadoop.conf.Configuration)">ConfigurationObserver</a></code></strong></div>
 <div class="block">This method would be called by the <a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index 27791d9..1e91a14 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -318,11 +318,11 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="strong">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="strong">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="strong">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="strong">RegionState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="strong">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="strong">MasterRpcServices.BalanceSwitchMode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="strong">SplitLogManager.ResubmitDirective</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index 409bb8a..e5bf586 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -145,9 +145,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.MarkRegionOfflineOpResult.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">DisableTableProcedure.MarkRegionOfflineOpResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">ServerProcedureInterface.ServerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">TableProcedureInterface.TableOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.MarkRegionOfflineOpResult.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">DisableTableProcedure.MarkRegionOfflineOpResult</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 2984cec..0e00304 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -361,13 +361,13 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="strong">KeepDeletedCells</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="strong">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="strong">KeyValue.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HConstants.OperationStatusCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="strong">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="strong">KeepDeletedCells</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="strong">Coprocessor.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="strong">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HealthChecker.HealthCheckerExitStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HConstants.OperationStatusCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.Modify.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HConstants.Modify</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index 9150b3d..6a8da0b 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -172,11 +172,11 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">ThrottleType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">QuotaScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">ThrottleType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">QuotaType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">OperationQuota.OperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">ThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">OperationQuota.OperationType</span></a></li>
 </ul>
 </li>
 </ul>


[42/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
index 95b557f..0ac0edb 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -2824,7 +2824,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>FIXED_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7588">FIXED_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7590">FIXED_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="DEEP_OVERHEAD">
@@ -2833,7 +2833,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>DEEP_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7605">DEEP_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7607">DEEP_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="MOCKED_LIST">
@@ -2842,7 +2842,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MOCKED_LIST</h4>
-<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8057">MOCKED_LIST</a></pre>
+<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8059">MOCKED_LIST</a></pre>
 <div class="block">A mocked list implementation - discards all updates.</div>
 </li>
 </ul>
@@ -5026,7 +5026,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowLock</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5180">getRowLock</a>(byte[]&nbsp;row,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5181">getRowLock</a>(byte[]&nbsp;row,
                         boolean&nbsp;readLock)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Get a row lock for the specified row. All locks are reentrant.
@@ -5050,7 +5050,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseRowLocks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5247">releaseRowLocks</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;rowLocks)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5248">releaseRowLocks</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;rowLocks)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#releaseRowLocks(java.util.List)">Region</a></code></strong></div>
 <div class="block">If the given list of row locks is not null, releases all locks.</div>
 <dl>
@@ -5065,7 +5065,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>hasMultipleColumnFamilies</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5353">hasMultipleColumnFamilies</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;familyPaths)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5354">hasMultipleColumnFamilies</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;familyPaths)</pre>
 <div class="block">Determines whether multiple column families are present
  Precondition: familyPaths is not null</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>familyPaths</code> - List of (column family, hfilePath)</dd></dl>
@@ -5077,7 +5077,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkLoadHFiles</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5369">bulkLoadHFiles</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;familyPaths,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5370">bulkLoadHFiles</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;familyPaths,
                      boolean&nbsp;assignSeqId,
                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.BulkLoadListener.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.BulkLoadListener</a>&nbsp;bulkLoadListener)
                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -5100,7 +5100,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5507">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5508">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -5113,7 +5113,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5513">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5514">hashCode</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -5126,7 +5126,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5518">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5519">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -5139,7 +5139,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>newHRegion</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6200">newHRegion</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6202">newHRegion</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                  <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                  org.apache.hadoop.fs.FileSystem&nbsp;fs,
                  org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -5165,7 +5165,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>createHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6230">createHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6232">createHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                     org.apache.hadoop.fs.Path&nbsp;rootDir,
                     org.apache.hadoop.conf.Configuration&nbsp;conf,
                     <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;hTableDescriptor,
@@ -5185,7 +5185,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>createHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6245">createHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6247">createHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                     org.apache.hadoop.fs.Path&nbsp;rootDir,
                     org.apache.hadoop.conf.Configuration&nbsp;conf,
                     <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;hTableDescriptor,
@@ -5201,7 +5201,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6265">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6267">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                   <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                   <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                   org.apache.hadoop.conf.Configuration&nbsp;conf)
@@ -5222,7 +5222,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6287">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6289">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                   <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                   <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                   org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -5245,7 +5245,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6308">openHRegion</a>(org.apache.hadoop.fs.Path&nbsp;rootDir,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6310">openHRegion</a>(org.apache.hadoop.fs.Path&nbsp;rootDir,
                   <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                   <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                   <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
@@ -5267,7 +5267,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6329">openHRegion</a>(org.apache.hadoop.fs.Path&nbsp;rootDir,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6331">openHRegion</a>(org.apache.hadoop.fs.Path&nbsp;rootDir,
                   <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                   <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                   <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
@@ -5291,7 +5291,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6358">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6360">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   org.apache.hadoop.fs.FileSystem&nbsp;fs,
                   org.apache.hadoop.fs.Path&nbsp;rootDir,
                   <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
@@ -5314,7 +5314,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6380">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6382">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   org.apache.hadoop.fs.FileSystem&nbsp;fs,
                   org.apache.hadoop.fs.Path&nbsp;rootDir,
                   <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
@@ -5339,7 +5339,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6404">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6406">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   org.apache.hadoop.fs.FileSystem&nbsp;fs,
                   org.apache.hadoop.fs.Path&nbsp;rootDir,
                   org.apache.hadoop.fs.Path&nbsp;tableDir,
@@ -5365,7 +5365,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6425">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;other,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6427">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;other,
                   <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
                            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Useful when reopening a closed region (normally for unit tests)</div>
@@ -5381,7 +5381,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6433">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;other,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6435">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;other,
                  <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -5394,7 +5394,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6444">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6446">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Open HRegion.
  Calls initialize and sets sequenceId.</div>
@@ -5409,7 +5409,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>warmupHRegion</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6465">warmupHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6467">warmupHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                  <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                  <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                  org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -5426,7 +5426,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkCompressionCodecs</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6494">checkCompressionCodecs</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6496">checkCompressionCodecs</a>()
                              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5438,7 +5438,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkEncryption</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6501">checkEncryption</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6503">checkEncryption</a>()
                       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5450,7 +5450,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkClassLoading</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6507">checkClassLoading</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6509">checkClassLoading</a>()
                         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5462,7 +5462,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>createDaughterRegionFromSplits</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6517">createDaughterRegionFromSplits</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6519">createDaughterRegionFromSplits</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)
                                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Create a daughter region from given a temp directory with the region data.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>hri</code> - Spec. for daughter region to open.</dd>
@@ -5476,7 +5476,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>createMergedRegionFromMerges</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6535">createMergedRegionFromMerges</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;mergedRegionInfo,
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6537">createMergedRegionFromMerges</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;mergedRegionInfo,
                                    <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region_b)
                                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Create a merged region given a temp directory with the region data.</div>
@@ -5492,7 +5492,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegionToMETA</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6560">addRegionToMETA</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;meta,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6562">addRegionToMETA</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;meta,
                    <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)
                             throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Inserts a new region's meta information into the passed
@@ -5510,7 +5510,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <li class="blockList">
 <h4>getRegionDir</h4>
 <pre><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6585">getRegionDir</a>(org.apache.hadoop.fs.Path&nbsp;tabledir,
+public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6587">getRegionDir</a>(org.apache.hadoop.fs.Path&nbsp;tabledir,
                                                 <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block"><span class="strong">Deprecated.</span>&nbsp;<i>For tests only; to be removed.</i></div>
 <div class="block">Computes the Path of the HRegion</div>
@@ -5525,7 +5525,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <li class="blockList">
 <h4>getRegionDir</h4>
 <pre><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6599">getRegionDir</a>(org.apache.hadoop.fs.Path&nbsp;rootdir,
+public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6601">getRegionDir</a>(org.apache.hadoop.fs.Path&nbsp;rootdir,
                                                 <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info)</pre>
 <div class="block"><span class="strong">Deprecated.</span>&nbsp;<i>For tests only; to be removed.</i></div>
 <div class="block">Computes the Path of the HRegion</div>
@@ -5539,7 +5539,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>rowIsInRange</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6612">rowIsInRange</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6614">rowIsInRange</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                    byte[]&nbsp;row)</pre>
 <div class="block">Determines if the specified row is within the row range specified by the
  specified HRegionInfo</div>
@@ -5553,7 +5553,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>rowIsInRange</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6619">rowIsInRange</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6621">rowIsInRange</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                    byte[]&nbsp;row,
                    int&nbsp;offset,
                    short&nbsp;length)</pre>
@@ -5565,7 +5565,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>mergeAdjacent</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6634">mergeAdjacent</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;srcA,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6636">mergeAdjacent</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;srcA,
                     <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;srcB)
                              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Merge two HRegions.  The regions must be adjacent and must not overlap.</div>
@@ -5580,7 +5580,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>merge</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6668">merge</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;a,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6670">merge</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;a,
             <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;b)
                      throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Merge two regions whether they are adjacent or not.</div>
@@ -5596,7 +5596,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6735">get</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6737">get</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get)
            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#get(org.apache.hadoop.hbase.client.Get)">Region</a></code></strong></div>
 <div class="block">Do a get based on the get parameter.</div>
@@ -5615,7 +5615,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareGet</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6742">prepareGet</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6744">prepareGet</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get)
           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                  <a href="../../../../../org/apache/hadoop/hbase/regionserver/NoSuchColumnFamilyException.html" title="class in org.apache.hadoop.hbase.regionserver">NoSuchColumnFamilyException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -5629,7 +5629,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6757">get</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get,
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6759">get</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get,
              boolean&nbsp;withCoprocessor)
                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#get(org.apache.hadoop.hbase.client.Get,%20boolean)">Region</a></code></strong></div>
@@ -5650,7 +5650,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>metricsUpdateForGet</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6789">metricsUpdateForGet</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6791">metricsUpdateForGet</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results)</pre>
 </li>
 </ul>
 <a name="mutateRow(org.apache.hadoop.hbase.client.RowMutations)">
@@ -5659,7 +5659,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>mutateRow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6802">mutateRow</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RowMutations.html" title="class in org.apache.hadoop.hbase.client">RowMutations</a>&nbsp;rm)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6804">mutateRow</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RowMutations.html" title="class in org.apache.hadoop.hbase.client">RowMutations</a>&nbsp;rm)
                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#mutateRow(org.apache.hadoop.hbase.client.RowMutations)">Region</a></code></strong></div>
 <div class="block">Performs multiple mutations atomically on a single row. Currently
@@ -5678,7 +5678,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>mutateRowsWithLocks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6811">mutateRowsWithLocks</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;mutations,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6813">mutateRowsWithLocks</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;mutations,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;byte[]&gt;&nbsp;rowsToLock)
                          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Perform atomic mutations within the region w/o nonces.
@@ -5693,7 +5693,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>mutateRowsWithLocks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6829">mutateRowsWithLocks</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;mutations,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6831">mutateRowsWithLocks</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;mutations,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;byte[]&gt;&nbsp;rowsToLock,
                        long&nbsp;nonceGroup,
                        long&nbsp;nonce)
@@ -5717,7 +5717,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStats</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionLoadStats&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6838">getRegionStats</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionLoadStats&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6840">getRegionStats</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the current load statistics for the the region</dd></dl>
 </li>
 </ul>
@@ -5727,7 +5727,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>processRowsWithLocks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6852">processRowsWithLocks</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RowProcessor.html" title="interface in org.apache.hadoop.hbase.regionserver">RowProcessor</a>&lt;?,?&gt;&nbsp;processor)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6854">processRowsWithLocks</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RowProcessor.html" title="interface in org.apache.hadoop.hbase.regionserver">RowProcessor</a>&lt;?,?&gt;&nbsp;processor)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#processRowsWithLocks(org.apache.hadoop.hbase.regionserver.RowProcessor)">Region</a></code></strong></div>
 <div class="block">Performs atomic multiple reads and writes on a given row.</div>
@@ -5745,7 +5745,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>processRowsWithLocks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6858">processRowsWithLocks</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RowProcessor.html" title="interface in org.apache.hadoop.hbase.regionserver">RowProcessor</a>&lt;?,?&gt;&nbsp;processor,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6860">processRowsWithLocks</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RowProcessor.html" title="interface in org.apache.hadoop.hbase.regionserver">RowProcessor</a>&lt;?,?&gt;&nbsp;processor,
                         long&nbsp;nonceGroup,
                         long&nbsp;nonce)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -5765,7 +5765,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>processRowsWithLocks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6864">processRowsWithLocks</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RowProcessor.html" title="interface in org.apache.hadoop.hbase.regionserver">RowProcessor</a>&lt;?,?&gt;&nbsp;processor,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6866">processRowsWithLocks</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RowProcessor.html" title="interface in org.apache.hadoop.hbase.regionserver">RowProcessor</a>&lt;?,?&gt;&nbsp;processor,
                         long&nbsp;timeout,
                         long&nbsp;nonceGroup,
                         long&nbsp;nonce)
@@ -5787,7 +5787,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>doProcessRowWithTimeout</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7029">doProcessRowWithTimeout</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RowProcessor.html" title="interface in org.apache.hadoop.hbase.regionserver">RowProcessor</a>&lt;?,?&gt;&nbsp;processor,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7031">doProcessRowWithTimeout</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RowProcessor.html" title="interface in org.apache.hadoop.hbase.regionserver">RowProcessor</a>&lt;?,?&gt;&nbsp;processor,
                            long&nbsp;now,
                            <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                            <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;mutations,
@@ -5804,7 +5804,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>carryForwardTags</h4>
-<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Tag.html" title="interface in org.apache.hadoop.hbase">Tag</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7082">carryForwardTags</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
+<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Tag.html" title="interface in org.apache.hadoop.hbase">Tag</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7084">carryForwardTags</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
                          <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Tag.html" title="interface in org.apache.hadoop.hbase">Tag</a>&gt;&nbsp;tags)</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>The passed-in <code>tags</code> but with the tags from <code>cell</code> added.</dd></dl>
 </li>
@@ -5815,7 +5815,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>doGet</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7094">doGet</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;store,
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7096">doGet</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;store,
                byte[]&nbsp;row,
                <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html?is-external=true" title="class or interface in java.util">Map.Entry</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;family,
                <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;tr)
@@ -5832,7 +5832,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>append</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7111">append</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Append.html" title="class in org.apache.hadoop.hbase.client">Append</a>&nbsp;append)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7113">append</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Append.html" title="class in org.apache.hadoop.hbase.client">Append</a>&nbsp;append)
               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5844,7 +5844,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>append</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7120">append</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Append.html" title="class in org.apache.hadoop.hbase.client">Append</a>&nbsp;mutate,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7122">append</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Append.html" title="class in org.apache.hadoop.hbase.client">Append</a>&nbsp;mutate,
             long&nbsp;nonceGroup,
             long&nbsp;nonce)
               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -5864,7 +5864,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>increment</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7350">increment</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;increment)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7352">increment</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;increment)
                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5876,7 +5876,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>increment</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7363">increment</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;mutation,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7365">increment</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;mutation,
                long&nbsp;nonceGroup,
                long&nbsp;nonce)
                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -5896,7 +5896,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>checkFamily</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7579">checkFamily</a>(byte[]&nbsp;family)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7581">checkFamily</a>(byte[]&nbsp;family)
            throws <a href="../../../../../org/apache/hadoop/hbase/regionserver/NoSuchColumnFamilyException.html" title="class in org.apache.hadoop.hbase.regionserver">NoSuchColumnFamilyException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/NoSuchColumnFamilyException.html" title="class in org.apache.hadoop.hbase.regionserver">NoSuchColumnFamilyException</a></code></dd></dl>
@@ -5908,7 +5908,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>heapSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7619">heapSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7621">heapSize</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html#heapSize()">heapSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" title="interface in org.apache.hadoop.hbase.io">HeapSize</a></code></dd>
@@ -5922,7 +5922,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsageAndExit</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7632">printUsageAndExit</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;message)</pre>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7634">printUsageAndExit</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;message)</pre>
 </li>
 </ul>
 <a name="registerService(com.google.protobuf.Service)">
@@ -5931,7 +5931,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>registerService</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7643">registerService</a>(com.google.protobuf.Service&nbsp;instance)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7645">registerService</a>(com.google.protobuf.Service&nbsp;instance)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#registerService(com.google.protobuf.Service)">Region</a></code></strong></div>
 <div class="block">Registers a new protocol buffer <code>Service</code> subclass as a coprocessor endpoint to
  be available for handling
@@ -5958,7 +5958,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>execService</h4>
-<pre>public&nbsp;com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7665">execService</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7667">execService</a>(com.google.protobuf.RpcController&nbsp;controller,
                                       org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall&nbsp;call)
                                         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#execService(com.google.protobuf.RpcController,%20org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall)">Region</a></code></strong></div>
@@ -5983,7 +5983,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>processTable</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7720">processTable</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7722">processTable</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                 org.apache.hadoop.fs.Path&nbsp;p,
                 <a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;walFactory,
                 org.apache.hadoop.conf.Configuration&nbsp;c,
@@ -5999,7 +5999,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldForceSplit</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7762">shouldForceSplit</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7764">shouldForceSplit</a>()</pre>
 </li>
 </ul>
 <a name="getExplicitSplitPoint()">
@@ -6008,7 +6008,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getExplicitSplitPoint</h4>
-<pre>byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7766">getExplicitSplitPoint</a>()</pre>
+<pre>byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7768">getExplicitSplitPoint</a>()</pre>
 </li>
 </ul>
 <a name="forceSplit(byte[])">
@@ -6017,7 +6017,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>forceSplit</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7770">forceSplit</a>(byte[]&nbsp;sp)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7772">forceSplit</a>(byte[]&nbsp;sp)</pre>
 </li>
 </ul>
 <a name="clearSplit()">
@@ -6026,7 +6026,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>clearSplit</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7779">clearSplit</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7781">clearSplit</a>()</pre>
 </li>
 </ul>
 <a name="prepareToSplit()">
@@ -6035,7 +6035,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareToSplit</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7787">prepareToSplit</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7789">prepareToSplit</a>()</pre>
 <div class="block">Give the region a chance to prepare before it is split.</div>
 </li>
 </ul>
@@ -6045,7 +6045,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>checkSplit</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7797">checkSplit</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7799">checkSplit</a>()</pre>
 <div class="block">Return the splitpoint. null indicates the region isn't splittable
  If the splitpoint isn't explicitly specified, it will go over the stores
  to find the best splitpoint. Currently the criteria of best splitpoint
@@ -6058,7 +6058,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactPriority</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7833">getCompactPriority</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7835">getCompactPriority</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>The priority that this region should have in the compaction queue</dd></dl>
 </li>
 </ul>
@@ -6068,7 +6068,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCoprocessorHost</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7844">getCoprocessorHost</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7846">getCoprocessorHost</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#getCoprocessorHost()">getCoprocessorHost</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a></code></dd>
@@ -6081,7 +6081,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>setCoprocessorHost</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7849">setCoprocessorHost</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;coprocessorHost)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7851">setCoprocessorHost</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;coprocessorHost)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>coprocessorHost</code> - the new coprocessor host</dd></dl>
 </li>
 </ul>
@@ -6091,7 +6091,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>startRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7854">startRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7856">startRegionOperation</a>()
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#startRegionOperation()">Region</a></code></strong></div>
 <div class="block">This method needs to be called before any public call that reads or
@@ -6112,7 +6112,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>startRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7861">startRegionOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;op)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7863">startRegionOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;op)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#startRegionOperation(org.apache.hadoop.hbase.regionserver.Region.Operation)">Region</a></code></strong></div>
 <div class="block">This method needs to be called before any public call that reads or
@@ -6134,7 +6134,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7909">closeRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7911">closeRegionOperation</a>()
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#closeRegionOperation()">Region</a></code></strong></div>
 <div class="block">Closes the region operation lock.</div>
@@ -6151,7 +6151,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7918">closeRegionOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;operation)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7920">closeRegionOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;operation)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Closes the lock. This needs to be called in the finally block corresponding
  to the try block of <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#startRegionOperation(org.apache.hadoop.hbase.regionserver.Region.Operation)"><code>Region.startRegionOperation(Operation)</code></a></div>
@@ -6165,7 +6165,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>startBulkRegionOperation</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7934">startBulkRegionOperation</a>(boolean&nbsp;writeLockNeeded)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7936">startBulkRegionOperation</a>(boolean&nbsp;writeLockNeeded)
                                throws <a href="../../../../../org/apache/hadoop/hbase/NotServingRegionException.html" title="class in org.apache.hadoop.hbase">NotServingRegionException</a>,
                                       <a href="../../../../../org/apache/hadoop/hbase/RegionTooBusyException.html" title="class in org.apache.hadoop.hbase">RegionTooBusyException</a>,
                                       <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
@@ -6185,7 +6185,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>closeBulkRegionOperation</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7952">closeBulkRegionOperation</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7954">closeBulkRegionOperation</a>()</pre>
 <div class="block">Closes the lock. This needs to be called in the finally block corresponding
  to the try block of #startRegionOperation</div>
 </li>
@@ -6196,7 +6196,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>recordMutationWithoutWal</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7961">recordMutationWithoutWal</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7963">recordMutationWithoutWal</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap)</pre>
 <div class="block">Update counters for number of puts without wal and the size of possible data loss.
  These information are exposed by the region server metrics.</div>
 </li>
@@ -6207,7 +6207,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>lock</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7982">lock</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;lock)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7984">lock</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;lock)
            throws <a href="../../../../../org/apache/hadoop/hbase/RegionTooBusyException.html" title="class in org.apache.hadoop.hbase">RegionTooBusyException</a>,
                   <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -6221,7 +6221,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>lock</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7992">lock</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;lock,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7994">lock</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;lock,
         int&nbsp;multiplier)
            throws <a href="../../../../../org/apache/hadoop/hbase/RegionTooBusyException.html" title="class in org.apache.hadoop.hbase">RegionTooBusyException</a>,
                   <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
@@ -6239,7 +6239,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>syncOrDefer</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8019">syncOrDefer</a>(long&nbsp;txid,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8021">syncOrDefer</a>(long&nbsp;txid,
                <a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;durability)
                   throws <a href="http://docs.oracle.com/javase/7/docs/api/

<TRUNCATED>

[24/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
index 8fc3dbd..efdc708 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
@@ -824,743 +824,747 @@
 <span class="sourceLineNo">816</span>          i++;<a name="line.816"></a>
 <span class="sourceLineNo">817</span>          lowestLocalityServerIndex = serverIndicesSortedByLocality[i];<a name="line.817"></a>
 <span class="sourceLineNo">818</span>        }<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        LOG.debug("Lowest locality region server with non zero regions is "<a name="line.819"></a>
-<span class="sourceLineNo">820</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        return lowestLocalityServerIndex;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      }<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span><a name="line.825"></a>
-<span class="sourceLineNo">826</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      if (regionFinder != null) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        float lowestLocality = 1.0f;<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        int lowestLocalityRegionIndex = 0;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          // No regions on that region server<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          return -1;<a name="line.832"></a>
-<span class="sourceLineNo">833</span>        }<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.836"></a>
-<span class="sourceLineNo">837</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          if (locality &lt; lowestLocality) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>            lowestLocality = locality;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>            lowestLocalityRegionIndex = j;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>          }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.844"></a>
-<span class="sourceLineNo">845</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            + " regions");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      } else {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        return -1;<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      }<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    float getLocalityOfRegion(int region, int server) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      if (regionFinder != null) {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      } else {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        return 0f;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      }<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      if (regionFinder != null) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        int leastLoadedServerIndex = -1;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        int load = Integer.MAX_VALUE;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        for (ServerName sn : topLocalServers) {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            continue;<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          }<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          if (regionsPerServer[index] == null) {<a name="line.872"></a>
+<span class="sourceLineNo">819</span>        if (LOG.isTraceEnabled()) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>          LOG.trace("Lowest locality region server with non zero regions is "<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.821"></a>
+<span class="sourceLineNo">822</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        return lowestLocalityServerIndex;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (regionFinder != null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        float lowestLocality = 1.0f;<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        int lowestLocalityRegionIndex = 0;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>          // No regions on that region server<a name="line.833"></a>
+<span class="sourceLineNo">834</span>          return -1;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>        }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.837"></a>
+<span class="sourceLineNo">838</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.838"></a>
+<span class="sourceLineNo">839</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.840"></a>
+<span class="sourceLineNo">841</span>          if (locality &lt; lowestLocality) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            lowestLocality = locality;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>            lowestLocalityRegionIndex = j;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>          }<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        if (LOG.isTraceEnabled()) {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.847"></a>
+<span class="sourceLineNo">848</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.848"></a>
+<span class="sourceLineNo">849</span>            + " regions");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        }<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      } else {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        return -1;<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      }<a name="line.854"></a>
+<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
+<span class="sourceLineNo">856</span><a name="line.856"></a>
+<span class="sourceLineNo">857</span>    float getLocalityOfRegion(int region, int server) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      if (regionFinder != null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      } else {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        return 0f;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      }<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>      if (regionFinder != null) {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        int leastLoadedServerIndex = -1;<a name="line.869"></a>
+<span class="sourceLineNo">870</span>        int load = Integer.MAX_VALUE;<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        for (ServerName sn : topLocalServers) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.872"></a>
 <span class="sourceLineNo">873</span>            continue;<a name="line.873"></a>
 <span class="sourceLineNo">874</span>          }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>          int tempLoad = regionsPerServer[index].length;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          if (tempLoad &lt;= load) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>            leastLoadedServerIndex = index;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>            load = tempLoad;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>        }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        return leastLoadedServerIndex;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        return -1;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      }<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>    void calculateRegionServerLocalities() {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      if (regionFinder == null) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        return;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            int regionIndex = regionsPerServer[i][j];<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          }<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        } else {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>    @VisibleForTesting<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    protected void setNumRegions(int numRegions) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      this.numRegions = numRegions;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    @VisibleForTesting<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      this.numMovedRegions = numMovedRegions;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        justification="Not important but should be fixed")<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      String desc = "Cluster{" +<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          "servers=[";<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          for(ServerName sn:servers) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>             desc += sn.getHostAndPort() + ", ";<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          }<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          desc +=<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          ", serverIndicesSortedByRegionCount="+<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.927"></a>
-<span class="sourceLineNo">928</span>          ", regionsPerServer=[";<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>          for (int[]r:regionsPerServer) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>            desc += Arrays.toString(r);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>          }<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          desc += "]" +<a name="line.933"></a>
-<span class="sourceLineNo">934</span>          ", numMaxRegionsPerTable=" +<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          ", numRegions=" +<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          numRegions +<a name="line.937"></a>
-<span class="sourceLineNo">938</span>          ", numServers=" +<a name="line.938"></a>
-<span class="sourceLineNo">939</span>          numServers +<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          ", numTables=" +<a name="line.940"></a>
-<span class="sourceLineNo">941</span>          numTables +<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          ", numMovedRegions=" +<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          numMovedRegions +<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          '}';<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      return desc;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span>  }<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>  // slop for regions<a name="line.949"></a>
-<span class="sourceLineNo">950</span>  protected float slop;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  protected Configuration config;<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  protected RackManager rackManager;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  // Regions of these tables are put on the master by default.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static final String TABLES_ON_MASTER =<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    "hbase.balancer.tablesOnMaster";<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  protected ClusterStatus clusterStatus = null;<a name="line.967"></a>
-<span class="sourceLineNo">968</span>  protected ServerName masterServerName;<a name="line.968"></a>
-<span class="sourceLineNo">969</span>  protected MasterServices services;<a name="line.969"></a>
-<span class="sourceLineNo">970</span><a name="line.970"></a>
-<span class="sourceLineNo">971</span>  /**<a name="line.971"></a>
-<span class="sourceLineNo">972</span>   * By default, regions of some small system tables such as meta,<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * want to assign any region to the active master, you need to<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   */<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    if (valueString == null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    valueString = valueString.trim();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return null;<a name="line.984"></a>
+<span class="sourceLineNo">875</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.875"></a>
+<span class="sourceLineNo">876</span>          if (regionsPerServer[index] == null) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>            continue;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          }<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          int tempLoad = regionsPerServer[index].length;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          if (tempLoad &lt;= load) {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>            leastLoadedServerIndex = index;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>            load = tempLoad;<a name="line.882"></a>
+<span class="sourceLineNo">883</span>          }<a name="line.883"></a>
+<span class="sourceLineNo">884</span>        }<a name="line.884"></a>
+<span class="sourceLineNo">885</span>        return leastLoadedServerIndex;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      } else {<a name="line.886"></a>
+<span class="sourceLineNo">887</span>        return -1;<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      }<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
+<span class="sourceLineNo">890</span><a name="line.890"></a>
+<span class="sourceLineNo">891</span>    void calculateRegionServerLocalities() {<a name="line.891"></a>
+<span class="sourceLineNo">892</span>      if (regionFinder == null) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        return;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.897"></a>
+<span class="sourceLineNo">898</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>            int regionIndex = regionsPerServer[i][j];<a name="line.900"></a>
+<span class="sourceLineNo">901</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.901"></a>
+<span class="sourceLineNo">902</span>          }<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        } else {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    @VisibleForTesting<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected void setNumRegions(int numRegions) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      this.numRegions = numRegions;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>    @VisibleForTesting<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      this.numMovedRegions = numMovedRegions;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.920"></a>
+<span class="sourceLineNo">921</span>        justification="Not important but should be fixed")<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    @Override<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public String toString() {<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      String desc = "Cluster{" +<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          "servers=[";<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          for(ServerName sn:servers) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>             desc += sn.getHostAndPort() + ", ";<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          }<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          desc +=<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          ", serverIndicesSortedByRegionCount="+<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.931"></a>
+<span class="sourceLineNo">932</span>          ", regionsPerServer=[";<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>          for (int[]r:regionsPerServer) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>            desc += Arrays.toString(r);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          desc += "]" +<a name="line.937"></a>
+<span class="sourceLineNo">938</span>          ", numMaxRegionsPerTable=" +<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          ", numRegions=" +<a name="line.940"></a>
+<span class="sourceLineNo">941</span>          numRegions +<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          ", numServers=" +<a name="line.942"></a>
+<span class="sourceLineNo">943</span>          numServers +<a name="line.943"></a>
+<span class="sourceLineNo">944</span>          ", numTables=" +<a name="line.944"></a>
+<span class="sourceLineNo">945</span>          numTables +<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          ", numMovedRegions=" +<a name="line.946"></a>
+<span class="sourceLineNo">947</span>          numMovedRegions +<a name="line.947"></a>
+<span class="sourceLineNo">948</span>          '}';<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      return desc;<a name="line.949"></a>
+<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
+<span class="sourceLineNo">952</span><a name="line.952"></a>
+<span class="sourceLineNo">953</span>  // slop for regions<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  protected float slop;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>  protected Configuration config;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  protected RackManager rackManager;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.957"></a>
+<span class="sourceLineNo">958</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.958"></a>
+<span class="sourceLineNo">959</span><a name="line.959"></a>
+<span class="sourceLineNo">960</span>  // Regions of these tables are put on the master by default.<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  public static final String TABLES_ON_MASTER =<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    "hbase.balancer.tablesOnMaster";<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.970"></a>
+<span class="sourceLineNo">971</span>  protected ClusterStatus clusterStatus = null;<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  protected ServerName masterServerName;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>  protected MasterServices services;<a name="line.973"></a>
+<span class="sourceLineNo">974</span><a name="line.974"></a>
+<span class="sourceLineNo">975</span>  /**<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * By default, regions of some small system tables such as meta,<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * want to assign any region to the active master, you need to<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.979"></a>
+<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
+<span class="sourceLineNo">981</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    if (valueString == null) {<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.984"></a>
 <span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    return StringUtils.getStrings(valueString);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
-<span class="sourceLineNo">990</span>   * Check if configured to put any tables on the active master<a name="line.990"></a>
-<span class="sourceLineNo">991</span>   */<a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    String[] tables = getTablesOnMaster(conf);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  public void setConf(Configuration conf) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    setSlop(conf);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    if (slop &lt; 0) slop = 0;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    else if (slop &gt; 1) slop = 1;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span><a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    this.config = conf;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    this.rackManager = new RackManager(getConf());<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    regionFinder.setConf(conf);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  }<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  protected void setSlop(Configuration conf) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1013"></a>
+<span class="sourceLineNo">986</span>    valueString = valueString.trim();<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      return null;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    return StringUtils.getStrings(valueString);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>  }<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>  /**<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * Check if configured to put any tables on the active master<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   */<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    String[] tables = getTablesOnMaster(conf);<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.998"></a>
+<span class="sourceLineNo">999</span>  }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span><a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>  @Override<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  public void setConf(Configuration conf) {<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    setSlop(conf);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    if (slop &lt; 0) slop = 0;<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    else if (slop &gt; 1) slop = 1;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    this.config = conf;<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.rackManager = new RackManager(getConf());<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    regionFinder.setConf(conf);<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  }<a name="line.1014"></a>
 <span class="sourceLineNo">1015</span><a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  /**<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * Check if a region belongs to some small system table.<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   */<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Balance the regions that should be on master regionserver.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    if (masterServerName == null<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (regions != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      for (HRegionInfo region: regions) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        // Find a non-master regionserver to host the region<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>        ServerName dest = keyIt.next();<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (masterServerName.equals(dest)) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          if (!keyIt.hasNext()) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>          dest = keyIt.next();<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        // Move this region away from the master regionserver<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (plans == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>        plans.add(plan);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        // Move this region to the master regionserver<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        if (plans == null) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        plans.add(plan);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    return plans;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>  }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span><a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>  /**<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>   * Assign the regions that should be on master regionserver.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>   */<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      return null;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      for (HRegionInfo region: regions) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        if (shouldBeOnMaster(region)) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          assignments.get(masterServerName).add(region);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    return assignments;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>  }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>  @Override<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public Configuration getConf() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    return this.config;<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  @Override<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    this.clusterStatus = st;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    regionFinder.setClusterStatus(st);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @Override<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    masterServerName = masterServices.getServerName();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    this.services = masterServices;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    this.regionFinder.setServices(masterServices);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  public void setRackManager(RackManager rackManager) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    this.rackManager = rackManager;<a name="line.1115"></a>
+<span class="sourceLineNo">1016</span>  protected void setSlop(Configuration conf) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>  }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span><a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>  /**<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * Check if a region belongs to some small system table.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   */<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  /**<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>   * Balance the regions that should be on master regionserver.<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>   */<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (masterServerName == null<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    if (regions != null) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      for (HRegionInfo region: regions) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        // Find a non-master regionserver to host the region<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>        ServerName dest = keyIt.next();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        if (masterServerName.equals(dest)) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          if (!keyIt.hasNext()) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          dest = keyIt.next();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span><a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>        // Move this region away from the master regionserver<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>        if (plans == null) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>        }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>        plans.add(plan);<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span><a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        // Move this region to the master regionserver<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (plans == null) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        plans.add(plan);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    return plans;<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>  }<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>  /**<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>   * Assign the regions that should be on master regionserver.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>   */<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      return null;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>    }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      for (HRegionInfo region: regions) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (shouldBeOnMaster(region)) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          assignments.get(masterServerName).add(region);<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    return assignments;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  @Override<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  public Configuration getConf() {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    return this.config;<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  @Override<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    this.clusterStatus = st;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    regionFinder.setClusterStatus(st);<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span><a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    masterServerName = masterServices.getServerName();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    this.services = masterServices;<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    this.regionFinder.setServices(masterServices);<a name="line.1115"></a>
 <span class="sourceLineNo">1116</span>  }<a name="line.1116"></a>
 <span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>  protected boolean needsBalance(Cluster c) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      if (LOG.isDebugEnabled()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            + " active regionserver(s)");<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      return false;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    // Check if we even need to do any load balancing<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    // HBASE-3681 check sloppiness first<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      if (LOG.isTraceEnabled()) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          "servers=" + cs.getNumServers() +<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      return false;<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    return true;<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  /**<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * rack hosts replicas of the same region<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   * @param c Cluster information<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   * @return whether region replicas are currently co-located<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return false;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  /**<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>   * simple round-robin assignment.<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * &lt;p&gt;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>   * &lt;p&gt;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   *<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   *<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * @param regions all regions<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * @param servers all servers<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   * @return map of server to the regions it should take, or null if no<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   */<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  @Override<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      List&lt;ServerName&gt; servers) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    metricsBalancer.incrMiscInvocations();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Guarantee not to put other regions on master<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      servers.remove(masterServerName);<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>      if (!masterRegions.isEmpty()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>        for (HRegionInfo region: masterRegions) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          regions.remove(region);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (regions == null || regions.isEmpty()) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return assignments;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (numServers == 0) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      return null;<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      ServerName server = servers.get(0);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      return assignments;<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      servers, assignments);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      boolean assigned = false;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>          if (serverRegions == null) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>            assignments.put(serverName, serverRegions);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          serverRegions.add(region);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cluster.doAssignRegion(region, serverName);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          assigned = true;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          break;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!assigned) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        lastFewRegions.add(region);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    for (HRegionInfo region : lastFewRegions) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      int i = RANDOM.nextInt(numServers);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      ServerName server = servers.get(i);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      List&lt;HRegionInfo&gt; serverRegions = assignments.get(server);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (serverRegions == null) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>        assignments.put(server, serverRegions);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      serverRegions.add(region);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      cluster.doAssignRegion(region, server);<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    return assignments;<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      Collection&lt;HRegionInfo&gt; regions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // replicas of the regions that are passed (for performance).<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    for (ServerName server : servers) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      if (!clusterState.containsKey(server)) {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      rackManager);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * regions in transition that do not have an already known destination.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   *<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * assigned to.<a name="line.1283"></a>
+<span class="sourceLineNo">1118</span>  public void setRackManager(RackManager rackManager) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    this.rackManager = rackManager;<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span><a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  protected boolean needsBalance(Cluster c) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      if (LOG.isDebugEnabled()) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            + " active regionserver(s)");<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    // Check if we even need to do any load balancing<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    // HBASE-3681 check sloppiness first<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (LOG.isTraceEnabled()) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>          "servers=" + cs.getNumServers() +<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      return false;<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    return true;<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>  /**<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   * rack hosts replicas of the same region<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * @param c Cluster information<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>   * @return whether region replicas are currently co-located<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>   */<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    return false;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  /**<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * simple round-robin assignment.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * &lt;p&gt;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   * &lt;p&gt;<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>   *<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>   *<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   * @param regions all regions<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * @param servers all servers<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @return map of server to the regions it should take, or null if no<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      List&lt;ServerName&gt; servers) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    metricsBalancer.incrMiscInvocations();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      // Guarantee not to put other regions on master<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      servers.remove(masterServerName);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      if (!masterRegions.isEmpty()) {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        for (HRegionInfo region: masterRegions) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          regions.remove(region);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regions == null || regions.isEmpty()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return assignments;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    if (numServers == 0) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return null;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      ServerName server = servers.get(0);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      return assignments;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>      servers, assignments);<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span><a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      boolean assigned = false;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          if (serverRegions == null) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>            assignments.put(serverName, serverRegions);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>          serverRegions.add(region);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          cluster.doAssignRegion(region, serverName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          assigned = true;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>          break;<a name="line.1241"></a>
+<span class="sourc

<TRUNCATED>

[19/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
index 8fc3dbd..efdc708 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
@@ -824,743 +824,747 @@
 <span class="sourceLineNo">816</span>          i++;<a name="line.816"></a>
 <span class="sourceLineNo">817</span>          lowestLocalityServerIndex = serverIndicesSortedByLocality[i];<a name="line.817"></a>
 <span class="sourceLineNo">818</span>        }<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        LOG.debug("Lowest locality region server with non zero regions is "<a name="line.819"></a>
-<span class="sourceLineNo">820</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        return lowestLocalityServerIndex;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      }<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span><a name="line.825"></a>
-<span class="sourceLineNo">826</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      if (regionFinder != null) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        float lowestLocality = 1.0f;<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        int lowestLocalityRegionIndex = 0;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          // No regions on that region server<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          return -1;<a name="line.832"></a>
-<span class="sourceLineNo">833</span>        }<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.836"></a>
-<span class="sourceLineNo">837</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          if (locality &lt; lowestLocality) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>            lowestLocality = locality;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>            lowestLocalityRegionIndex = j;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>          }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.844"></a>
-<span class="sourceLineNo">845</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            + " regions");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      } else {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        return -1;<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      }<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    float getLocalityOfRegion(int region, int server) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      if (regionFinder != null) {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      } else {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        return 0f;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      }<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      if (regionFinder != null) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        int leastLoadedServerIndex = -1;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        int load = Integer.MAX_VALUE;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        for (ServerName sn : topLocalServers) {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            continue;<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          }<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          if (regionsPerServer[index] == null) {<a name="line.872"></a>
+<span class="sourceLineNo">819</span>        if (LOG.isTraceEnabled()) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>          LOG.trace("Lowest locality region server with non zero regions is "<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.821"></a>
+<span class="sourceLineNo">822</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        return lowestLocalityServerIndex;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (regionFinder != null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        float lowestLocality = 1.0f;<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        int lowestLocalityRegionIndex = 0;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>          // No regions on that region server<a name="line.833"></a>
+<span class="sourceLineNo">834</span>          return -1;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>        }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.837"></a>
+<span class="sourceLineNo">838</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.838"></a>
+<span class="sourceLineNo">839</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.840"></a>
+<span class="sourceLineNo">841</span>          if (locality &lt; lowestLocality) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            lowestLocality = locality;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>            lowestLocalityRegionIndex = j;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>          }<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        if (LOG.isTraceEnabled()) {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.847"></a>
+<span class="sourceLineNo">848</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.848"></a>
+<span class="sourceLineNo">849</span>            + " regions");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        }<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      } else {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        return -1;<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      }<a name="line.854"></a>
+<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
+<span class="sourceLineNo">856</span><a name="line.856"></a>
+<span class="sourceLineNo">857</span>    float getLocalityOfRegion(int region, int server) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      if (regionFinder != null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      } else {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        return 0f;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      }<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>      if (regionFinder != null) {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        int leastLoadedServerIndex = -1;<a name="line.869"></a>
+<span class="sourceLineNo">870</span>        int load = Integer.MAX_VALUE;<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        for (ServerName sn : topLocalServers) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.872"></a>
 <span class="sourceLineNo">873</span>            continue;<a name="line.873"></a>
 <span class="sourceLineNo">874</span>          }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>          int tempLoad = regionsPerServer[index].length;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          if (tempLoad &lt;= load) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>            leastLoadedServerIndex = index;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>            load = tempLoad;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>        }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        return leastLoadedServerIndex;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        return -1;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      }<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>    void calculateRegionServerLocalities() {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      if (regionFinder == null) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        return;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            int regionIndex = regionsPerServer[i][j];<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          }<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        } else {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>    @VisibleForTesting<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    protected void setNumRegions(int numRegions) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      this.numRegions = numRegions;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    @VisibleForTesting<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      this.numMovedRegions = numMovedRegions;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        justification="Not important but should be fixed")<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      String desc = "Cluster{" +<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          "servers=[";<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          for(ServerName sn:servers) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>             desc += sn.getHostAndPort() + ", ";<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          }<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          desc +=<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          ", serverIndicesSortedByRegionCount="+<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.927"></a>
-<span class="sourceLineNo">928</span>          ", regionsPerServer=[";<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>          for (int[]r:regionsPerServer) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>            desc += Arrays.toString(r);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>          }<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          desc += "]" +<a name="line.933"></a>
-<span class="sourceLineNo">934</span>          ", numMaxRegionsPerTable=" +<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          ", numRegions=" +<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          numRegions +<a name="line.937"></a>
-<span class="sourceLineNo">938</span>          ", numServers=" +<a name="line.938"></a>
-<span class="sourceLineNo">939</span>          numServers +<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          ", numTables=" +<a name="line.940"></a>
-<span class="sourceLineNo">941</span>          numTables +<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          ", numMovedRegions=" +<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          numMovedRegions +<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          '}';<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      return desc;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span>  }<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>  // slop for regions<a name="line.949"></a>
-<span class="sourceLineNo">950</span>  protected float slop;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  protected Configuration config;<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  protected RackManager rackManager;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  // Regions of these tables are put on the master by default.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static final String TABLES_ON_MASTER =<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    "hbase.balancer.tablesOnMaster";<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  protected ClusterStatus clusterStatus = null;<a name="line.967"></a>
-<span class="sourceLineNo">968</span>  protected ServerName masterServerName;<a name="line.968"></a>
-<span class="sourceLineNo">969</span>  protected MasterServices services;<a name="line.969"></a>
-<span class="sourceLineNo">970</span><a name="line.970"></a>
-<span class="sourceLineNo">971</span>  /**<a name="line.971"></a>
-<span class="sourceLineNo">972</span>   * By default, regions of some small system tables such as meta,<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * want to assign any region to the active master, you need to<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   */<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    if (valueString == null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    valueString = valueString.trim();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return null;<a name="line.984"></a>
+<span class="sourceLineNo">875</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.875"></a>
+<span class="sourceLineNo">876</span>          if (regionsPerServer[index] == null) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>            continue;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          }<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          int tempLoad = regionsPerServer[index].length;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          if (tempLoad &lt;= load) {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>            leastLoadedServerIndex = index;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>            load = tempLoad;<a name="line.882"></a>
+<span class="sourceLineNo">883</span>          }<a name="line.883"></a>
+<span class="sourceLineNo">884</span>        }<a name="line.884"></a>
+<span class="sourceLineNo">885</span>        return leastLoadedServerIndex;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      } else {<a name="line.886"></a>
+<span class="sourceLineNo">887</span>        return -1;<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      }<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
+<span class="sourceLineNo">890</span><a name="line.890"></a>
+<span class="sourceLineNo">891</span>    void calculateRegionServerLocalities() {<a name="line.891"></a>
+<span class="sourceLineNo">892</span>      if (regionFinder == null) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        return;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.897"></a>
+<span class="sourceLineNo">898</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>            int regionIndex = regionsPerServer[i][j];<a name="line.900"></a>
+<span class="sourceLineNo">901</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.901"></a>
+<span class="sourceLineNo">902</span>          }<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        } else {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    @VisibleForTesting<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected void setNumRegions(int numRegions) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      this.numRegions = numRegions;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>    @VisibleForTesting<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      this.numMovedRegions = numMovedRegions;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.920"></a>
+<span class="sourceLineNo">921</span>        justification="Not important but should be fixed")<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    @Override<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public String toString() {<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      String desc = "Cluster{" +<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          "servers=[";<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          for(ServerName sn:servers) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>             desc += sn.getHostAndPort() + ", ";<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          }<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          desc +=<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          ", serverIndicesSortedByRegionCount="+<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.931"></a>
+<span class="sourceLineNo">932</span>          ", regionsPerServer=[";<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>          for (int[]r:regionsPerServer) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>            desc += Arrays.toString(r);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          desc += "]" +<a name="line.937"></a>
+<span class="sourceLineNo">938</span>          ", numMaxRegionsPerTable=" +<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          ", numRegions=" +<a name="line.940"></a>
+<span class="sourceLineNo">941</span>          numRegions +<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          ", numServers=" +<a name="line.942"></a>
+<span class="sourceLineNo">943</span>          numServers +<a name="line.943"></a>
+<span class="sourceLineNo">944</span>          ", numTables=" +<a name="line.944"></a>
+<span class="sourceLineNo">945</span>          numTables +<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          ", numMovedRegions=" +<a name="line.946"></a>
+<span class="sourceLineNo">947</span>          numMovedRegions +<a name="line.947"></a>
+<span class="sourceLineNo">948</span>          '}';<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      return desc;<a name="line.949"></a>
+<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
+<span class="sourceLineNo">952</span><a name="line.952"></a>
+<span class="sourceLineNo">953</span>  // slop for regions<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  protected float slop;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>  protected Configuration config;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  protected RackManager rackManager;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.957"></a>
+<span class="sourceLineNo">958</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.958"></a>
+<span class="sourceLineNo">959</span><a name="line.959"></a>
+<span class="sourceLineNo">960</span>  // Regions of these tables are put on the master by default.<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  public static final String TABLES_ON_MASTER =<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    "hbase.balancer.tablesOnMaster";<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.970"></a>
+<span class="sourceLineNo">971</span>  protected ClusterStatus clusterStatus = null;<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  protected ServerName masterServerName;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>  protected MasterServices services;<a name="line.973"></a>
+<span class="sourceLineNo">974</span><a name="line.974"></a>
+<span class="sourceLineNo">975</span>  /**<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * By default, regions of some small system tables such as meta,<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * want to assign any region to the active master, you need to<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.979"></a>
+<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
+<span class="sourceLineNo">981</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    if (valueString == null) {<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.984"></a>
 <span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    return StringUtils.getStrings(valueString);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
-<span class="sourceLineNo">990</span>   * Check if configured to put any tables on the active master<a name="line.990"></a>
-<span class="sourceLineNo">991</span>   */<a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    String[] tables = getTablesOnMaster(conf);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  public void setConf(Configuration conf) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    setSlop(conf);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    if (slop &lt; 0) slop = 0;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    else if (slop &gt; 1) slop = 1;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span><a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    this.config = conf;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    this.rackManager = new RackManager(getConf());<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    regionFinder.setConf(conf);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  }<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  protected void setSlop(Configuration conf) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1013"></a>
+<span class="sourceLineNo">986</span>    valueString = valueString.trim();<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      return null;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    return StringUtils.getStrings(valueString);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>  }<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>  /**<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * Check if configured to put any tables on the active master<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   */<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    String[] tables = getTablesOnMaster(conf);<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.998"></a>
+<span class="sourceLineNo">999</span>  }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span><a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>  @Override<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  public void setConf(Configuration conf) {<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    setSlop(conf);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    if (slop &lt; 0) slop = 0;<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    else if (slop &gt; 1) slop = 1;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    this.config = conf;<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.rackManager = new RackManager(getConf());<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    regionFinder.setConf(conf);<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  }<a name="line.1014"></a>
 <span class="sourceLineNo">1015</span><a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  /**<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * Check if a region belongs to some small system table.<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   */<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Balance the regions that should be on master regionserver.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    if (masterServerName == null<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (regions != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      for (HRegionInfo region: regions) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        // Find a non-master regionserver to host the region<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>        ServerName dest = keyIt.next();<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (masterServerName.equals(dest)) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          if (!keyIt.hasNext()) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>          dest = keyIt.next();<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        // Move this region away from the master regionserver<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (plans == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>        plans.add(plan);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        // Move this region to the master regionserver<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        if (plans == null) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        plans.add(plan);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    return plans;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>  }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span><a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>  /**<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>   * Assign the regions that should be on master regionserver.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>   */<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      return null;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      for (HRegionInfo region: regions) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        if (shouldBeOnMaster(region)) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          assignments.get(masterServerName).add(region);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    return assignments;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>  }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>  @Override<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public Configuration getConf() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    return this.config;<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  @Override<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    this.clusterStatus = st;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    regionFinder.setClusterStatus(st);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @Override<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    masterServerName = masterServices.getServerName();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    this.services = masterServices;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    this.regionFinder.setServices(masterServices);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  public void setRackManager(RackManager rackManager) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    this.rackManager = rackManager;<a name="line.1115"></a>
+<span class="sourceLineNo">1016</span>  protected void setSlop(Configuration conf) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>  }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span><a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>  /**<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * Check if a region belongs to some small system table.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   */<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  /**<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>   * Balance the regions that should be on master regionserver.<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>   */<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (masterServerName == null<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    if (regions != null) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      for (HRegionInfo region: regions) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        // Find a non-master regionserver to host the region<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>        ServerName dest = keyIt.next();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        if (masterServerName.equals(dest)) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          if (!keyIt.hasNext()) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          dest = keyIt.next();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span><a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>        // Move this region away from the master regionserver<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>        if (plans == null) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>        }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>        plans.add(plan);<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span><a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        // Move this region to the master regionserver<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (plans == null) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        plans.add(plan);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    return plans;<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>  }<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>  /**<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>   * Assign the regions that should be on master regionserver.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>   */<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      return null;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>    }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      for (HRegionInfo region: regions) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (shouldBeOnMaster(region)) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          assignments.get(masterServerName).add(region);<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    return assignments;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  @Override<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  public Configuration getConf() {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    return this.config;<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  @Override<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    this.clusterStatus = st;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    regionFinder.setClusterStatus(st);<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span><a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    masterServerName = masterServices.getServerName();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    this.services = masterServices;<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    this.regionFinder.setServices(masterServices);<a name="line.1115"></a>
 <span class="sourceLineNo">1116</span>  }<a name="line.1116"></a>
 <span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>  protected boolean needsBalance(Cluster c) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      if (LOG.isDebugEnabled()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            + " active regionserver(s)");<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      return false;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    // Check if we even need to do any load balancing<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    // HBASE-3681 check sloppiness first<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      if (LOG.isTraceEnabled()) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          "servers=" + cs.getNumServers() +<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      return false;<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    return true;<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  /**<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * rack hosts replicas of the same region<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   * @param c Cluster information<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   * @return whether region replicas are currently co-located<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return false;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  /**<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>   * simple round-robin assignment.<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * &lt;p&gt;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>   * &lt;p&gt;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   *<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   *<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * @param regions all regions<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * @param servers all servers<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   * @return map of server to the regions it should take, or null if no<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   */<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  @Override<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      List&lt;ServerName&gt; servers) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    metricsBalancer.incrMiscInvocations();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Guarantee not to put other regions on master<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      servers.remove(masterServerName);<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>      if (!masterRegions.isEmpty()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>        for (HRegionInfo region: masterRegions) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          regions.remove(region);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (regions == null || regions.isEmpty()) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return assignments;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (numServers == 0) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      return null;<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      ServerName server = servers.get(0);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      return assignments;<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      servers, assignments);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      boolean assigned = false;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>          if (serverRegions == null) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>            assignments.put(serverName, serverRegions);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          serverRegions.add(region);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cluster.doAssignRegion(region, serverName);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          assigned = true;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          break;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!assigned) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        lastFewRegions.add(region);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    for (HRegionInfo region : lastFewRegions) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      int i = RANDOM.nextInt(numServers);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      ServerName server = servers.get(i);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      List&lt;HRegionInfo&gt; serverRegions = assignments.get(server);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (serverRegions == null) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>        assignments.put(server, serverRegions);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      serverRegions.add(region);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      cluster.doAssignRegion(region, server);<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    return assignments;<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      Collection&lt;HRegionInfo&gt; regions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // replicas of the regions that are passed (for performance).<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    for (ServerName server : servers) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      if (!clusterState.containsKey(server)) {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      rackManager);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * regions in transition that do not have an already known destination.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   *<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * assigned to.<a name="line.1283"></a>
+<span class="sourceLineNo">1118</span>  public void setRackManager(RackManager rackManager) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    this.rackManager = rackManager;<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span><a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  protected boolean needsBalance(Cluster c) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      if (LOG.isDebugEnabled()) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            + " active regionserver(s)");<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    // Check if we even need to do any load balancing<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    // HBASE-3681 check sloppiness first<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (LOG.isTraceEnabled()) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>          "servers=" + cs.getNumServers() +<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      return false;<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    return true;<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>  /**<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   * rack hosts replicas of the same region<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * @param c Cluster information<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>   * @return whether region replicas are currently co-located<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>   */<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    return false;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  /**<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * simple round-robin assignment.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * &lt;p&gt;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   * &lt;p&gt;<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>   *<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>   *<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   * @param regions all regions<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * @param servers all servers<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @return map of server to the regions it should take, or null if no<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      List&lt;ServerName&gt; servers) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    metricsBalancer.incrMiscInvocations();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      // Guarantee not to put other regions on master<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      servers.remove(masterServerName);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      if (!masterRegions.isEmpty()) {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        for (HRegionInfo region: masterRegions) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          regions.remove(region);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regions == null || regions.isEmpty()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return assignments;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    if (numServers == 0) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return null;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      ServerName server = servers.get(0);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      return assignments;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>      servers, assignments);<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span><a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      boolean assigned = false;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          if (serverRegions == null) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>            assignments.put(serverName, serverRegions);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>          serverRegions.add(region);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          cluster.doAssignRegion(region, serverName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          assigned = true;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>          break;<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        }<a name="line.1242"></a>
+<span

<TRUNCATED>

[13/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatch.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatch.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatch.html
index e2c4389..d03724e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatch.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatch.html
@@ -5185,3056 +5185,3058 @@
 <span class="sourceLineNo">5177</span>   * @param readLock is the lock reader or writer. True indicates that a non-exlcusive<a name="line.5177"></a>
 <span class="sourceLineNo">5178</span>   *                 lock is requested<a name="line.5178"></a>
 <span class="sourceLineNo">5179</span>   */<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    // Make sure the row is inside of this region before getting the lock for it.<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    checkRow(row, "row lock");<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    // create an object to use a a key in the row lock map<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    HashedBytes rowKey = new HashedBytes(row);<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    RowLockContext rowLockContext = null;<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    RowLockImpl result = null;<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    TraceScope traceScope = null;<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span><a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    // If we're tracing start a span to show how long this took.<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>    if (Trace.isTracing()) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>      traceScope = Trace.startSpan("HRegion.getRowLock");<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>      traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock"));<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>    }<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span><a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    try {<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>      // Keep trying until we have a lock or error out.<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>      // TODO: do we need to add a time component here?<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>      while (result == null) {<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span><a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>        // Try adding a RowLockContext to the lockedRows.<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>        // If we can add it then there's no other transactions currently running.<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        rowLockContext = new RowLockContext(rowKey);<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span><a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>        // if there was a running transaction then there's already a context.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>        if (existingContext != null) {<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>          rowLockContext = existingContext;<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>        }<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span><a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>        // Now try an get the lock.<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>        //<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>        // This can fail as<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>        if (readLock) {<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>          result = rowLockContext.newReadLock();<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>        } else {<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>          result = rowLockContext.newWriteLock();<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>        }<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      }<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      if (!result.getLock().tryLock(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>        if (traceScope != null) {<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>          traceScope.getSpan().addTimelineAnnotation("Failed to get row lock");<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>        }<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>        result = null;<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>        // Clean up the counts just in case this was the thing keeping the context alive.<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        rowLockContext.cleanUp();<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        throw new IOException("Timed out waiting for lock for row: " + rowKey);<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>      }<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>      return result;<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>    } catch (InterruptedException ie) {<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>      LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>      iie.initCause(ie);<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>      if (traceScope != null) {<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>        traceScope.getSpan().addTimelineAnnotation("Interrupted exception getting row lock");<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>      }<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>      Thread.currentThread().interrupt();<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>      throw iie;<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    } finally {<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>      if (traceScope != null) {<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>        traceScope.close();<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>      }<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    }<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>  }<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span><a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>  @Override<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>  public void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>    if (rowLocks != null) {<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>      for (RowLock rowLock : rowLocks) {<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span>        rowLock.release();<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>      }<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>      rowLocks.clear();<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    }<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>  }<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span><a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>  @VisibleForTesting<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>  class RowLockContext {<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span>    private final HashedBytes row;<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    final AtomicBoolean usable = new AtomicBoolean(true);<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    final Object lock = new Object();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    RowLockContext(HashedBytes row) {<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>      this.row = row;<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    }<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span><a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    RowLockImpl newWriteLock() {<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>      Lock l = readWriteLock.writeLock();<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>      return getRowLock(l);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    }<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    RowLockImpl newReadLock() {<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>      Lock l = readWriteLock.readLock();<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>      return getRowLock(l);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    private RowLockImpl getRowLock(Lock l) {<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>      count.incrementAndGet();<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>      synchronized (lock) {<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        if (usable.get()) {<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>          return new RowLockImpl(this, l);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        } else {<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>          return null;<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        }<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>      }<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    }<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span><a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    void cleanUp() {<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>      long c = count.decrementAndGet();<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>      if (c &lt;= 0) {<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        synchronized (lock) {<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>          if (count.get() &lt;= 0 ){<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>            usable.set(false);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>            RowLockContext removed = lockedRows.remove(row);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>            assert removed == this: "we should never remove a different context";<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>          }<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        }<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>      }<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    }<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span><a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    @Override<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    public String toString() {<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>      return "RowLockContext{" +<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>          "row=" + row +<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>          ", readWriteLock=" + readWriteLock +<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>          ", count=" + count +<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>          '}';<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    }<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>  }<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span><a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>  /**<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>   * Class used to represent a lock on a row.<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>   */<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>  public static class RowLockImpl implements RowLock {<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    private final RowLockContext context;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    private final Lock lock;<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span><a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    public RowLockImpl(RowLockContext context, Lock lock) {<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>      this.context = context;<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>      this.lock = lock;<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    }<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span><a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    public Lock getLock() {<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>      return lock;<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    }<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span><a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    @VisibleForTesting<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>    public RowLockContext getContext() {<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      return context;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    }<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span><a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    @Override<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    public void release() {<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>      lock.unlock();<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>      context.cleanUp();<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>    }<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span><a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    @Override<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    public String toString() {<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>      return "RowLockImpl{" +<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>          "context=" + context +<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>          ", lock=" + lock +<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>          '}';<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>    }<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  }<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span><a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>  /**<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>   * Determines whether multiple column families are present<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>   * Precondition: familyPaths is not null<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>   *<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>   * @param familyPaths List of (column family, hfilePath)<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>   */<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    boolean multipleFamilies = false;<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    byte[] family = null;<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    for (Pair&lt;byte[], String&gt; pair : familyPaths) {<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>      byte[] fam = pair.getFirst();<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>      if (family == null) {<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>        family = fam;<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>      } else if (!Bytes.equals(family, fam)) {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>        multipleFamilies = true;<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>        break;<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>      }<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    }<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    return multipleFamilies;<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>  }<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span><a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  @Override<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>  public boolean bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, boolean assignSeqId,<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      BulkLoadListener bulkLoadListener) throws IOException {<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>    long seqId = -1;<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;byte[], List&lt;Path&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    Preconditions.checkNotNull(familyPaths);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    // we need writeLock for multi-family bulk load<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    try {<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      this.writeRequestsCount.increment();<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      // There possibly was a split that happened between when the split keys<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // were gathered and before the HRegion's write lock was taken.  We need<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      // to validate the HFile region before attempting to bulk load all of them<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>      List&lt;IOException&gt; ioes = new ArrayList&lt;IOException&gt;();<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;Pair&lt;byte[], String&gt;&gt;();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>        byte[] familyName = p.getFirst();<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>        String path = p.getSecond();<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span><a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>        Store store = getStore(familyName);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>        if (store == null) {<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>          IOException ioe = new org.apache.hadoop.hbase.DoNotRetryIOException(<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>              "No such column family " + Bytes.toStringBinary(familyName));<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>          ioes.add(ioe);<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>        } else {<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>          try {<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>            store.assertBulkLoadHFileOk(new Path(path));<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>          } catch (WrongRegionException wre) {<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>            // recoverable (file doesn't fit in region)<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>            failures.add(p);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>          } catch (IOException ioe) {<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>            // unrecoverable (hdfs problem)<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>            ioes.add(ioe);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>          }<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>        }<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>      }<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span><a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>      // validation failed because of some sort of IO problem.<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>      if (ioes.size() != 0) {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>        IOException e = MultipleIOException.createIOException(ioes);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>        LOG.error("There were one or more IO errors when checking if the bulk load is ok.", e);<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>        throw e;<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>      }<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span><a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>      // validation failed, bail out before doing anything permanent.<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>      if (failures.size() != 0) {<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>        StringBuilder list = new StringBuilder();<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>        for (Pair&lt;byte[], String&gt; p : failures) {<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>              .append(p.getSecond());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>        }<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        // problem when validating<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>        LOG.warn("There was a recoverable bulk load failure likely due to a" +<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>            " split.  These (family, HFile) pairs were not loaded: " + list);<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>        return false;<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>      }<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span><a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>      // We need to assign a sequential ID that's in between two memstores in order to preserve<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>      // the guarantee that all the edits lower than the highest sequential ID from all the<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>      // HFiles are flushed on disk. See HBASE-10958.  The sequence id returned when we flush is<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>      // a sequence id that we can be sure is beyond the last hfile written).<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>      if (assignSeqId) {<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        FlushResult fs = flushcache(true, false);<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>        if (fs.isFlushSucceeded()) {<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>        } else {<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>          throw new IOException("Could not bulk load with an assigned sequential ID because the "+<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>            "flush didn't run. Reason for not flushing: " + ((FlushResultImpl)fs).failureReason);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>        }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span>      }<a name="line.5441"></a>
-<span class="sourceLineNo">5442</span><a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        byte[] familyName = p.getFirst();<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>        String path = p.getSecond();<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>        Store store = getStore(familyName);<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>        try {<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>          String finalPath = path;<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>          if (bulkLoadListener != null) {<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path);<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>          }<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>          Path commitedStoreFile = store.bulkLoadHFile(finalPath, seqId);<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span><a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>          if(storeFiles.containsKey(familyName)) {<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>            storeFiles.get(familyName).add(commitedStoreFile);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>          } else {<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>            List&lt;Path&gt; storeFileNames = new ArrayList&lt;Path&gt;();<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>            storeFileNames.add(commitedStoreFile);<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>            storeFiles.put(familyName, storeFileNames);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>          }<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>          if (bulkLoadListener != null) {<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>            bulkLoadListener.doneBulkLoad(familyName, path);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>          }<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>        } catch (IOException ioe) {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>          // A failure here can cause an atomicity violation that we currently<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>          // cannot recover from since it is likely a failed HDFS operation.<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span><a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>          // TODO Need a better story for reverting partial failures due to HDFS.<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>          LOG.error("There was a partial failure due to IO when attempting to" +<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>              " load " + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>          if (bulkLoadListener != null) {<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>            try {<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>              bulkLoadListener.failedBulkLoad(familyName, path);<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>            } catch (Exception ex) {<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>              LOG.error("Error while calling failedBulkLoad for family " +<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>                  Bytes.toString(familyName) + " with path " + path, ex);<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>            }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>          }<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>          throw ioe;<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>        }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>      }<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span><a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>      return true;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    } finally {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        // write a bulk load event when not all hfiles are loaded<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        try {<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>          WALProtos.BulkLoadDescriptor loadDescriptor = ProtobufUtil.toBulkLoadDescriptor(<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>              this.getRegionInfo().getTable(),<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>              ByteStringer.wrap(this.getRegionInfo().getEncodedNameAsBytes()), storeFiles, seqId);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>          WALUtil.writeBulkLoadMarkerAndSync(wal, this.htableDescriptor, getRegionInfo(),<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>              loadDescriptor, mvcc);<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span>        } catch (IOException ioe) {<a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>          if (this.rsServices != null) {<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>            // Have to abort region server because some hfiles has been loaded but we can't write<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>            // the event into WAL<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>          }<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>        }<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>      }<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span><a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>      closeBulkRegionOperation();<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    }<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>  }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span><a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  @Override<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>  public boolean equals(Object o) {<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>                                                ((HRegion) o).getRegionInfo().getRegionName());<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>  }<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span><a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>  @Override<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>  public int hashCode() {<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    return Bytes.hashCode(getRegionInfo().getRegionName());<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>  }<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span><a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>  @Override<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>  public String toString() {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>    return getRegionInfo().getRegionNameAsString();<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>  }<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span><a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>  /**<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>   * RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>   */<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>  class RegionScannerImpl implements RegionScanner, org.apache.hadoop.hbase.ipc.RpcCallback {<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    // Package local for testability<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>    KeyValueHeap storeHeap = null;<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>    /** Heap of key-values that are not essential for the provided filters and are thus read<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>     * on demand, if on-demand column family loading is enabled.*/<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>    KeyValueHeap joinedHeap = null;<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>    /**<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>     * If the joined heap data gathering is interrupted due to scan limits, this will<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>     * contain the row for which we are populating the values.*/<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>    protected Cell joinedContinuationRow = null;<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    private boolean filterClosed = false;<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span><a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>    protected final int isScan;<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    protected final byte[] stopRow;<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    protected final HRegion region;<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    protected final CellComparator comparator;<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>    protected boolean copyCellsFromSharedMem = false;<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span><a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>    private final long readPt;<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>    private final long maxResultSize;<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>    private final ScannerContext defaultScannerContext;<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>    private final FilterWrapper filter;<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span><a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    @Override<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    public HRegionInfo getRegionInfo() {<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>      return region.getRegionInfo();<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>    }<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span><a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    public void setCopyCellsFromSharedMem(boolean copyCells) {<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>      this.copyCellsFromSharedMem = copyCells;<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    }<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span><a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    RegionScannerImpl(Scan scan, List&lt;KeyValueScanner&gt; additionalScanners, HRegion region,<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        boolean copyCellsFromSharedMem)<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>        throws IOException {<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>      this.region = region;<a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      this.maxResultSize = scan.getMaxResultSize();<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>      if (scan.hasFilter()) {<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        this.filter = new FilterWrapper(scan.getFilter());<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>      } else {<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>        this.filter = null;<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>      }<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      this.comparator = region.getCellCompartor();<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>      /**<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>       * By default, calls to next/nextRaw must enforce the batch limit. Thus, construct a default<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>       * scanner context that can be used to enforce the batch limit in the event that a<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>       * ScannerContext is not specified during an invocation of next/nextRaw<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>       */<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>      defaultScannerContext = ScannerContext.newBuilder()<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>          .setBatchLimit(scan.getBatch()).build();<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span><a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) &amp;&amp; !scan.isGetScan()) {<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>        this.stopRow = null;<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span>      } else {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        this.stopRow = scan.getStopRow();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>      }<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      // If we are doing a get, we want to be [startRow,endRow]. Normally<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>      // it is [startRow,endRow) and if startRow=endRow we get nothing.<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      this.isScan = scan.isGetScan() ? 1 : 0;<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span><a name="line.5584"></a>
-<span class="sourceLineNo">5585</span>      // synchronize on scannerReadPoints so that nobody calculates<a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>      // getSmallestReadPoint, before scannerReadPoints is updated.<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      IsolationLevel isolationLevel = scan.getIsolationLevel();<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      synchronized(scannerReadPoints) {<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>        this.readPt = getReadpoint(isolationLevel);<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        scannerReadPoints.put(this, this.readPt);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>      }<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span><a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>      // Here we separate all scanners into two lists - scanner that provide data required<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      // by the filter to operate (scanners list) and all others (joinedScanners list).<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>      List&lt;KeyValueScanner&gt; scanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>      List&lt;KeyValueScanner&gt; joinedScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>      if (additionalScanners != null) {<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>        scanners.addAll(additionalScanners);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>      }<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span><a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>      for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; entry : scan.getFamilyMap().entrySet()) {<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>        Store store = stores.get(entry.getKey());<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>        KeyValueScanner scanner;<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span>        try {<a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>          scanner = store.getScanner(scan, entry.getValue(), this.readPt);<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>        } catch (FileNotFoundException e) {<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>          throw handleFileNotFound(e);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>        }<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>        if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand()<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>          || this.filter.isFamilyEssential(entry.getKey())) {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>          scanners.add(scanner);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>        } else {<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>          joinedScanners.add(scanner);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>        }<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      }<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>      this.copyCellsFromSharedMem = copyCellsFromSharedMem;<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      initializeKVHeap(scanners, joinedScanners, region);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    }<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span><a name="line.5619"></a>
-<span class="sourceLineNo">5620</span>    protected void initializeKVHeap(List&lt;KeyValueScanner&gt; scanners,<a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>        List&lt;KeyValueScanner&gt; joinedScanners, HRegion region)<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>        throws IOException {<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      this.storeHeap = new KeyValueHeap(scanners, comparator);<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      if (!joinedScanners.isEmpty()) {<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>        this.joinedHeap = new KeyValueHeap(joinedScanners, comparator);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span>      }<a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    }<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span><a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    @Override<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    public long getMaxResultSize() {<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>      return maxResultSize;<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    @Override<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    public long getMvccReadPoint() {<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      return this.readPt;<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span>    }<a name="line.5637"></a>
-<span class="sourceLineNo">5638</span><a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>    @Override<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>    public int getBatch() {<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      return this.defaultScannerContext.getBatchLimit();<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>    }<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    /**<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>     * Reset both the filter and the old filter.<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>     *<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>     * @throws IOException in case a filter raises an I/O exception.<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>     */<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    protected void resetFilters() throws IOException {<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>      if (filter != null) {<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>        filter.reset();<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span>      }<a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    }<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span><a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    @Override<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>    public boolean next(List&lt;Cell&gt; outResults)<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>        throws IOException {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>      // apply the batching limit by default<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>      return next(outResults, defaultScannerContext);<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>    }<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span><a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    @Override<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    public synchronized boolean next(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    throws IOException {<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>      if (this.filterClosed) {<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>        throw new UnknownScannerException("Scanner was closed (timed out?) " +<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>            "after we renewed it. Could be caused by a very slow scanner " +<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>            "or a lengthy garbage collection");<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>      }<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>      startRegionOperation(Operation.SCAN);<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>      readRequestsCount.increment();<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>      try {<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>        return nextRaw(outResults, scannerContext);<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>      } finally {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>        closeRegionOperation(Operation.SCAN);<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>      }<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>    }<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span><a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    @Override<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    public boolean nextRaw(List&lt;Cell&gt; outResults) throws IOException {<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      // Use the RegionScanner's context by default<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return nextRaw(outResults, defaultScannerContext);<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span><a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>    @Override<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>    public boolean nextRaw(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        throws IOException {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>      if (storeHeap == null) {<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        // scanner is closed<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>        throw new UnknownScannerException("Scanner was closed");<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      }<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      boolean moreValues = false;<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      try {<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>        if (outResults.isEmpty()) {<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>          // Usually outResults is empty. This is true when next is called<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>          // to handle scan or get operation.<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>          moreValues = nextInternal(outResults, scannerContext);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        } else {<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>          List&lt;Cell&gt; tmpList = new ArrayList&lt;Cell&gt;();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>          moreValues = nextInternal(tmpList, scannerContext);<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>          outResults.addAll(tmpList);<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        }<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span><a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        // If the size limit was reached it means a partial Result is being<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>        // returned. Returning a<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        // partial Result means that we should not reset the filters; filters<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>        // should only be reset in<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>        // between rows<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>        if (!scannerContext.partialResultFormed()) resetFilters();<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span><a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>        if (isFilterDoneInternal()) {<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>          moreValues = false;<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>        }<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span><a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        // If copyCellsFromSharedMem = true, then we need to copy the cells. Otherwise<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>        // it is a call coming from the RsRpcServices.scan().<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        if (copyCellsFromSharedMem &amp;&amp; !outResults.isEmpty()) {<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>          // Do the copy of the results here.<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          ListIterator&lt;Cell&gt; listItr = outResults.listIterator();<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          Cell cell = null;<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          while (listItr.hasNext()) {<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>            cell = listItr.next();<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>            if (cell instanceof ShareableMemory) {<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>              listItr.set(((ShareableMemory) cell).cloneToCell());<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>            }<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>          }<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>        }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>      } finally {<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        if (copyCellsFromSharedMem) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          // In case of copyCellsFromSharedMem==true (where the CPs wrap a scanner) we return<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          // the blocks then and there (for wrapped CPs)<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>          this.shipped();<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>      return moreValues;<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    }<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    /**<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>     * @return true if more cells exist after this batch, false if scanner is done<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>     */<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>    private boolean populateFromJoinedHeap(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>            throws IOException {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      assert joinedContinuationRow != null;<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>      boolean moreValues = populateResult(results, this.joinedHeap, scannerContext,<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>          joinedContinuationRow);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      if (!scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>        // We are done with this row, reset the continuation.<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>        joinedContinuationRow = null;<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span>      }<a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>      // As the data is obtained from two independent heaps, we need to<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>      // ensure that result list is sorted, because Result relies on that.<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>      Collections.sort(results, comparator);<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>      return moreValues;<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>    }<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    /**<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>     * Fetches records with currentRow into results list, until next row, batchLimit (if not -1) is<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>     * reached, or remainingResultSize (if not -1) is reaced<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>     * @param heap KeyValueHeap to fetch data from.It must be positioned on correct row before call.<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>     * @param scannerContext<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>     * @param currentRowCell<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>     * @return state of last call to {@link KeyValueHeap#next()}<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>     */<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    private boolean populateResult(List&lt;Cell&gt; results, KeyValueHeap heap,<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>        ScannerContext scannerContext, Cell currentRowCell) throws IOException {<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      Cell nextKv;<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      boolean moreCellsInRow = false;<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      boolean tmpKeepProgress = scannerContext.getKeepProgress();<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      // Scanning between column families and thus the scope is between cells<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      LimitScope limitScope = LimitScope.BETWEEN_CELLS;<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      try {<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>        do {<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>          // We want to maintain any progress that is made towards the limits while scanning across<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>          // different column families. To do this, we toggle the keep progress flag on during calls<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>          // to the StoreScanner to ensure that any progress made thus far is not wiped away.<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>          scannerContext.setKeepProgress(true);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>          heap.next(results, scannerContext);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>          scannerContext.setKeepProgress(tmpKeepProgress);<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>          nextKv = heap.peek();<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>          moreCellsInRow = moreCellsInRow(nextKv, currentRowCell);<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>          if (!moreCellsInRow) incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>          if (scannerContext.checkBatchLimit(limitScope)) {<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>            return scannerContext.setScannerState(NextState.BATCH_LIMIT_REACHED).hasMoreValues();<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>          } else if (scannerContext.checkSizeLimit(limitScope)) {<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>            ScannerContext.NextState state =<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>              moreCellsInRow? NextState.SIZE_LIMIT_REACHED_MID_ROW: NextState.SIZE_LIMIT_REACHED;<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>          } else if (scannerContext.checkTimeLimit(limitScope)) {<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>            ScannerContext.NextState state =<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>              moreCellsInRow? NextState.TIME_LIMIT_REACHED_MID_ROW: NextState.TIME_LIMIT_REACHED;<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>          }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>        } while (moreCellsInRow);<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>      } catch (FileNotFoundException e) {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>        throw handleFileNotFound(e);<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>      }<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      return nextKv != null;<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    }<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span><a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    /**<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>     * Based on the nextKv in the heap, and the current row, decide whether or not there are more<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>     * cells to be read in the heap. If the row of the nextKv in the heap matches the current row<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>     * then there are more cells to be read in the row.<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>     * @param nextKv<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>     * @param currentRowCell<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>     * @return true When there are more cells in the row to be read<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>     */<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>    private boolean moreCellsInRow(final Cell nextKv, Cell currentRowCell) {<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      return nextKv != null &amp;&amp; CellUtil.matchingRow(nextKv, currentRowCell);<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>    }<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span><a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>    /*<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>     * @return True if a filter rules the scanner is over, done.<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>     */<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    @Override<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    public synchronized boolean isFilterDone() throws IOException {<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      return isFilterDoneInternal();<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    }<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span><a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>    private boolean isFilterDoneInternal() throws IOException {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      return this.filter != null &amp;&amp; this.filter.filterAllRemaining();<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>    }<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span><a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    private boolean nextInternal(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>        throws IOException {<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>      if (!results.isEmpty()) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>        throw new IllegalArgumentException("First parameter should be an empty list");<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>      }<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      if (scannerContext == null) {<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>        throw new IllegalArgumentException("Scanner context cannot be null");<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      RpcCallContext rpcCall = RpcServer.getCurrentCall();<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span><a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>      // Save the initial progress from the Scanner context in these local variables. The progress<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      // may need to be reset a few times if rows are being filtered out so we save the initial<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      // progress.<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      int initialBatchProgress = scannerContext.getBatchProgress();<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>      long initialSizeProgress = scannerContext.getSizeProgress();<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>      long initialTimeProgress = scannerContext.getTimeProgress();<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      // The loop here is used only when at some point during the next we determine<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      // that due to effects of filters or otherwise, we have an empty row in the result.<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>      // Then we loop and try again. Otherwise, we must get out on the first iteration via return,<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>      // "true" if there's more data to read, "false" if there isn't (storeHeap is at a stop row,<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>      // and joinedHeap has no more data to read for the last row (if set, joinedContinuationRow).<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>      while (true) {<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>        // Starting to scan a new row. Reset the scanner progress according to whether or not<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>        // progress should be kept.<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>        if (scannerContext.getKeepProgress()) {<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>          // Progress should be kept. Reset to initial values seen at start of method invocation.<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>          scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>            initialTimeProgress);<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        } else {<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>          scannerContext.clearProgress();<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        }<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>        if (rpcCall != null) {<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>          // If a user specifies a too-restrictive or too-slow scanner, the<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>          // client might time out and disconnect while the server side<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>          // is still processing the request. We should abort aggressively<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>          // in that case.<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>          long afterTime = rpcCall.disconnectSince();<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>          if (afterTime &gt;= 0) {<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>            throw new CallerDisconnectedException(<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>                "Aborting on region " + getRegionInfo().getRegionNameAsString() + ", call " +<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>                    this + " after " + afterTime + " ms, since " +<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>                    "caller disconnected");<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          }<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span><a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>        // Let's see what we have in the storeHeap.<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>        Cell current = this.storeHeap.peek();<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span><a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>        boolean stopRow = isStopRow(current);<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // When has filter row is true it means that the all the cells for a particular row must be<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        // read before a filtering decision can be made. This means that filters where hasFilterRow<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>        // run the risk of encountering out of memory errors in the case that they are applied to a<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>        // table that has very large rows.<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>        boolean hasFilterRow = this.filter != null &amp;&amp; this.filter.hasFilterRow();<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span><a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>        // If filter#hasFilterRow is true, partial results are not allowed since allowing them<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>        // would prevent the filters from being evaluated. Thus, if it is true, change the<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>        // scope of any limits that could potentially create partial results to<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>        // LimitScope.BETWEEN_ROWS so that those limits are not reached mid-row<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>        if (hasFilterRow) {<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>          if (LOG.isTraceEnabled()) {<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>            LOG.trace("filter#hasFilterRow is true which prevents partial results from being "<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>                + " formed. Changing scope of limits that may create partials");<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span>          }<a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>          scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>          scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>        }<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span><a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>        // Check if we were getting data from the joinedHeap and hit the limit.<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>        // If not, then it's main path - getting results from storeHeap.<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>        if (joinedContinuationRow == null) {<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>          // First, check if we are at a stop row. If so, there are no more results.<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>          if (stopRow) {<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>            if (hasFilterRow) {<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>              filter.filterRowCells(results);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>            }<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>          }<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span><a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>          // Check if rowkey filter wants to exclude this row. If so, loop to next.<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>          // Technically, if we hit limits before on this row, we don't need this call.<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>          if (filterRowKey(current)) {<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>            // Typically the count of rows scanned is incremented inside #populateResult. However,<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>            // here we are filtering a row based purely on its row key, preventing us from calling<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>            // #populateResult. Thus, perform the necessary increment here to rows scanned metric<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>            incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>            if (!moreRows) {<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>            }<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>            results.clear();<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>            continue;<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>          }<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span><a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>          // Ok, we are good, let's try to get some results from the main heap.<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>          populateResult(results, this.storeHeap, scannerContext, current);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>            if (hasFilterRow) {<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>              throw new IncompatibleFilterException(<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>                  "Filter whose hasFilterRow() returns true is incompatible with scans that must "<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>                      + " stop mid-row because of a limit. ScannerContext:" + scannerContext);<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>            }<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>            return true;<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>          }<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span><a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>          Cell nextKv = this.storeHeap.peek();<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>          stopRow = nextKv == null || isStopRow(nextKv);<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>          // save that the row was empty before filters applied to it.<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>          final boolean isEmptyRow = results.isEmpty();<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span><a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>          // We have the part of the row necessary for filtering (all of it, usually).<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>          // First filter with the filterRow(List).<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>          FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>          if (hasFilterRow) {<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>            ret = filter.filterRowCellsWithRet(results);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span><a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>            // We don't know how the results have changed after being filtered. Must set progress<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>            // according to contents of results now. However, a change in the results should not<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>            // affect the time progress. Thus preserve whatever time progress has been made<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>            long timeProgress = scannerContext.getTimeProgress();<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>            if (scannerContext.getKeepProgress()) {<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>              scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>                initialTimeProgress);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>            } else {<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>              scannerContext.clearProgress();<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>            }<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>            scannerContext.setTimeProgress(timeProgress);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>            scannerContext.incrementBatchProgress(results.size());<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>            for (Cell cell : results) {<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>              scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOf(cell));<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>            }<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>          }<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span><a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>          if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>            results.clear();<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>            if (!moreRows) {<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>            }<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>            // This row was totally filtered out, if this is NOT the last row,<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>            // we should continue on. Otherwise, nothing else to do.<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>            if (!stopRow) continue;<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>          }<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>          // Ok, we are done with storeHeap for this row.<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>          // Now we may need to fetch additional, non-essential data into row.<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>          // These values are not needed for filter to work, so we postpone their<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>          // fetch to (possibly) reduce amount of data loads from disk.<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>          if (this.joinedHeap != null) {<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>            boolean mayHaveData = joinedHeapMayHaveData(current);<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>            if (mayHaveData) {<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>              joinedContinuationRow = current;<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>              populateFromJoinedHeap(results, scannerContext);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span><a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>              if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>                return true;<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>              }<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>            }<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>          }<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>        } else {<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>          // Populating from the joined heap was stopped by limits, populate some more.<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>          populateFromJoinedHeap(results, scannerContext);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>            return true;<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>          }<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>        }<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>        // We may have just called populateFromJoinedMap and hit the limits. If that is<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>        // the case, we need to call it again on the next next() invocation.<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span>        if (joinedContinuationRow != null) {<a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>        }<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span><a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>        // Finally, we are done with both joinedHeap and storeHeap.<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>        // Double check to prevent empty rows from appearing in result. It could be<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>        // the case when SingleColumnValueExcludeFilter is used.<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>        if (results.isEmpty()) {<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>          incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>          boolean moreRows = nextRow(scannerContext, current);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>          if (!moreRows) {<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>          }<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>          if (!stopRow) continue;<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>        }<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>        if (stopRow) {<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>        } else {<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>        }<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      }<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    }<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span><a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    protected void incrementCountOfRowsFilteredMetric(ScannerContext scannerContext) {<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span><a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      scannerContext.getMetrics().countOfRowsFiltered.incrementAndGet();<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    }<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span><a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    protected void incrementCountOfRowsScannedMetric(ScannerContext scannerContext) {<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span><a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      scannerContext.getMetrics().countOfRowsScanned.incrementAndGet();<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    }<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span><a name="line.6036"></

<TRUNCATED>

[29/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html
index 704e192..e5d9af6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html
@@ -92,2526 +92,2571 @@
 <span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.conf.ConfigurationObserver;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.exceptions.RegionMovedException;<a name="line.85"></a>
 <span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.User;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.io.BytesWritable;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.io.IntWritable;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.io.Writable;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.io.WritableUtils;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.util.StringUtils;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.htrace.TraceInfo;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import com.google.protobuf.BlockingService;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import com.google.protobuf.CodedInputStream;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import com.google.protobuf.Message;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import com.google.protobuf.ServiceException;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.140"></a>
-<span class="sourceLineNo">141</span> *<a name="line.141"></a>
-<span class="sourceLineNo">142</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.142"></a>
-<span class="sourceLineNo">143</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.143"></a>
-<span class="sourceLineNo">144</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.144"></a>
-<span class="sourceLineNo">145</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.145"></a>
-<span class="sourceLineNo">146</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.146"></a>
-<span class="sourceLineNo">147</span> * and loops till done.<a name="line.147"></a>
-<span class="sourceLineNo">148</span> *<a name="line.148"></a>
-<span class="sourceLineNo">149</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.149"></a>
-<span class="sourceLineNo">150</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.150"></a>
-<span class="sourceLineNo">151</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.151"></a>
-<span class="sourceLineNo">152</span> * and keep taking while the server is up.<a name="line.152"></a>
-<span class="sourceLineNo">153</span> *<a name="line.153"></a>
-<span class="sourceLineNo">154</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.154"></a>
-<span class="sourceLineNo">155</span> * queue for Responder to pull from and return result to client.<a name="line.155"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferInputStream;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.User;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.io.BytesWritable;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.io.IntWritable;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.io.Writable;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.io.WritableUtils;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.util.StringUtils;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.htrace.TraceInfo;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import com.google.protobuf.BlockingService;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import com.google.protobuf.CodedInputStream;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import com.google.protobuf.CodedOutputStream;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import com.google.protobuf.Message;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import com.google.protobuf.ServiceException;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.143"></a>
+<span class="sourceLineNo">144</span> *<a name="line.144"></a>
+<span class="sourceLineNo">145</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.145"></a>
+<span class="sourceLineNo">146</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.146"></a>
+<span class="sourceLineNo">147</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.147"></a>
+<span class="sourceLineNo">148</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.148"></a>
+<span class="sourceLineNo">149</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.149"></a>
+<span class="sourceLineNo">150</span> * and loops till done.<a name="line.150"></a>
+<span class="sourceLineNo">151</span> *<a name="line.151"></a>
+<span class="sourceLineNo">152</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.152"></a>
+<span class="sourceLineNo">153</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.153"></a>
+<span class="sourceLineNo">154</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.154"></a>
+<span class="sourceLineNo">155</span> * and keep taking while the server is up.<a name="line.155"></a>
 <span class="sourceLineNo">156</span> *<a name="line.156"></a>
-<span class="sourceLineNo">157</span> * @see RpcClientImpl<a name="line.157"></a>
-<span class="sourceLineNo">158</span> */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.159"></a>
-<span class="sourceLineNo">160</span>@InterfaceStability.Evolving<a name="line.160"></a>
-<span class="sourceLineNo">161</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      = new CallQueueTooBigException();<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final boolean authorize;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private boolean isSecurityEnabled;<a name="line.168"></a>
+<span class="sourceLineNo">157</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.157"></a>
+<span class="sourceLineNo">158</span> * queue for Responder to pull from and return result to client.<a name="line.158"></a>
+<span class="sourceLineNo">159</span> *<a name="line.159"></a>
+<span class="sourceLineNo">160</span> * @see RpcClientImpl<a name="line.160"></a>
+<span class="sourceLineNo">161</span> */<a name="line.161"></a>
+<span class="sourceLineNo">162</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.162"></a>
+<span class="sourceLineNo">163</span>@InterfaceStability.Evolving<a name="line.163"></a>
+<span class="sourceLineNo">164</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      = new CallQueueTooBigException();<a name="line.168"></a>
 <span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public static final byte CURRENT_VERSION = 0;<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<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>   * How many calls/handler are allowed in the queue.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * The maximum size that we can hold in the RPC queue<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private final IPCUtil ipcUtil;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    Server.class.getName());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  protected ServiceAuthorizationManager authManager;<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * after the call returns.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   */<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  protected final InetSocketAddress bindAddress;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  protected int port;                             // port we listen on<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private int readThreads;                        // number of read threads<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.210"></a>
-<span class="sourceLineNo">211</span>                                                  // which a client may be<a name="line.211"></a>
-<span class="sourceLineNo">212</span>                                                  // disconnected<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.213"></a>
-<span class="sourceLineNo">214</span>                                                  // connections after which we<a name="line.214"></a>
-<span class="sourceLineNo">215</span>                                                  // will start cleaning up idle<a name="line.215"></a>
-<span class="sourceLineNo">216</span>                                                  // connections<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.217"></a>
-<span class="sourceLineNo">218</span>                                                  // connections to nuke<a name="line.218"></a>
-<span class="sourceLineNo">219</span>                                                  // during a cleanup<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  protected MetricsHBaseServer metrics;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  protected final Configuration conf;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private int maxQueueSize;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  protected int socketSendBufferSize;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  volatile boolean running = true;<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>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * for business by the call to {@link #start()}.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  volatile boolean started = false;<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>   * This is a running count of the size of all outstanding calls by size.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  protected final Counter callQueueSize = new Counter();<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  //maintain a list<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  //of client connections<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private Listener listener = null;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  protected Responder responder = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  protected int numConnections = 0;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.261"></a>
+<span class="sourceLineNo">170</span>  private final boolean authorize;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private boolean isSecurityEnabled;<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public static final byte CURRENT_VERSION = 0;<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * How many calls/handler are allowed in the queue.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * The maximum size that we can hold in the RPC queue<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private final IPCUtil ipcUtil;<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    Server.class.getName());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  protected ServiceAuthorizationManager authManager;<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * after the call returns.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   */<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected final InetSocketAddress bindAddress;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected int port;                             // port we listen on<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  private int readThreads;                        // number of read threads<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.213"></a>
+<span class="sourceLineNo">214</span>                                                  // which a client may be<a name="line.214"></a>
+<span class="sourceLineNo">215</span>                                                  // disconnected<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.216"></a>
+<span class="sourceLineNo">217</span>                                                  // connections after which we<a name="line.217"></a>
+<span class="sourceLineNo">218</span>                                                  // will start cleaning up idle<a name="line.218"></a>
+<span class="sourceLineNo">219</span>                                                  // connections<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.220"></a>
+<span class="sourceLineNo">221</span>                                                  // connections to nuke<a name="line.221"></a>
+<span class="sourceLineNo">222</span>                                                  // during a cleanup<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected MetricsHBaseServer metrics;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  protected final Configuration conf;<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private int maxQueueSize;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  protected int socketSendBufferSize;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  volatile boolean running = true;<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * for business by the call to {@link #start()}.<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  volatile boolean started = false;<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  /**<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * This is a running count of the size of all outstanding calls by size.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  protected final Counter callQueueSize = new Counter();<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  //maintain a list<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  //of client connections<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private Listener listener = null;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  protected Responder responder = null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  protected int numConnections = 0;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  /** Default value for above params */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  private final int warnResponseTime;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private final int warnResponseSize;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  private final Server server;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  private final RpcScheduler scheduler;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>  private UserProvider userProvider;<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  private final BoundedByteBufferPool reservoir;<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * the result.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  class Call implements RpcCallContext {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    protected int id;                             // the client's call id<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    protected BlockingService service;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    protected MethodDescriptor md;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    protected RequestHeader header;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    protected Message param;                      // the parameter passed<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    // Optional cell data passed outside of protobufs.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    protected CellScanner cellScanner;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    protected Connection connection;              // connection to client<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    protected long timestamp;      // the time received when response is null<a name="line.295"></a>
-<span class="sourceLineNo">296</span>                                   // the time served when response is not null<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
-<span class="sourceLineNo">298</span>     * Chain of buffers to send as response.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>     */<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    protected BufferChain response;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    protected Responder responder;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    protected long size;                          // size of current call<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    protected boolean isError;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    protected TraceInfo tinfo;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    private ByteBuffer cellBlock = null;<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private User user;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private InetAddress remoteAddress;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RpcCallback callback;<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private long responseCellSize = 0;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private long responseBlockSize = 0;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private boolean retryImmediatelySupported;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.318"></a>
-<span class="sourceLineNo">319</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.id = id;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.service = service;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.md = md;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.header = header;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      this.param = param;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      this.cellScanner = cellScanner;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      this.connection = connection;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      this.timestamp = System.currentTimeMillis();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      this.response = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      this.responder = responder;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      this.isError = false;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.size = size;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.tinfo = tinfo;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.remoteAddress = remoteAddress;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.retryImmediatelySupported =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    /**<a name="line.340"></a>
-<span class="sourceLineNo">341</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.341"></a>
-<span class="sourceLineNo">342</span>     * cleanup.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>     */<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    void done() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        // Return buffer to reservoir now we are done with it.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        reservoir.putBuffer(this.cellBlock);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        this.cellBlock = null;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>    @Override<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    public String toString() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      return toShortString() + " param: " +<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        " connection: " + connection.toString();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>    protected RequestHeader getHeader() {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      return this.header;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    /*<a name="line.366"></a>
-<span class="sourceLineNo">367</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.367"></a>
-<span class="sourceLineNo">368</span>     * the payload of a command<a name="line.368"></a>
-<span class="sourceLineNo">369</span>     */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    String toShortString() {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      String serviceName = this.connection.service != null ?<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          " connection: " + connection.toString();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    String toTraceString() {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      String serviceName = this.connection.service != null ?<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return serviceName + "." + methodName;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      this.response = new BufferChain(response);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        Throwable t, String errorMsg) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      if (this.isError) return;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (t != null) this.isError = true;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      BufferChain bc = null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      try {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        // Presume it a pb Message.  Could be null.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        Message result = (Message)m;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        // Call id.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        headerBuilder.setCallId(this.id);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (t != null) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (t instanceof RegionMovedException) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.408"></a>
-<span class="sourceLineNo">409</span>            // any kind of payload.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          // Set the exception as the result of the method invocation.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        if (this.cellBlock != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        Message header = headerBuilder.build();<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>        // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        // one big byte array; save on allocations.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        ByteBuffer bbHeader = IPCUtil.getDelimitedMessageAsByteBuffer(header);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        ByteBuffer bbResult = IPCUtil.getDelimitedMessageAsByteBuffer(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        int totalSize = bbHeader.capacity() + (bbResult == null? 0: bbResult.limit()) +<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (this.cellBlock == null? 0: this.cellBlock.limit());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        ByteBuffer bbTotalSize = ByteBuffer.wrap(Bytes.toBytes(totalSize));<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        bc = new BufferChain(bbTotalSize, bbHeader, bbResult, this.cellBlock);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        if (connection.useWrap) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          bc = wrapWithSasl(bc);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      } catch (IOException e) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        LOG.warn("Exception while creating response " + e);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      this.response = bc;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (this.callback != null) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          this.callback.run();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        } catch (Exception e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          // Don't allow any exception here to kill this handler thread.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private BufferChain wrapWithSasl(BufferChain bc)<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        throws IOException {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      if (!this.connection.useSasl) return bc;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // Looks like no way around this; saslserver wants a byte array.  I have to make it one.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // THIS IS A BIG UGLY COPY.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      byte [] responseBytes = bc.getBytes();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      byte [] token;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // synchronization may be needed since there can be multiple Handler<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      // threads using saslServer to wrap responses.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      synchronized (connection.saslServer) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        token = connection.saslServer.wrap(responseBytes, 0, responseBytes.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      if (LOG.isTraceEnabled()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        LOG.trace("Adding saslServer wrapped token of size " + token.length<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            + " as call response.");<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>      ByteBuffer bbTokenLength = ByteBuffer.wrap(Bytes.toBytes(token.length));<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      ByteBuffer bbTokenBytes = ByteBuffer.wrap(token);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return new BufferChain(bbTokenLength, bbTokenBytes);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public boolean isClientCellBlockSupported() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      return this.connection != null &amp;&amp; this.connection.codec != null;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>    @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    public long disconnectSince() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (!connection.channel.isOpen()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        return System.currentTimeMillis() - timestamp;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      } else {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        return -1L;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>    public long getSize() {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      return this.size;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>    public long getResponseCellSize() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return responseCellSize;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    public void incrementResponseCellSize(long cellSize) {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      responseCellSize += cellSize;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    @Override<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    public long getResponseBlockSize() {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return responseBlockSize;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    @Override<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    public void incrementResponseBlockSize(long blockSize) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      responseBlockSize += blockSize;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    public synchronized void sendResponseIfReady() throws IOException {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.responder.doRespond(this);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    public UserGroupInformation getRemoteUser() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      return connection.ugi;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    @Override<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    public User getRequestUser() {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      return user;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    @Override<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    public String getRequestUserName() {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      User user = getRequestUser();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return user == null? null: user.getShortName();<a name="line.531"></a>
+<span class="sourceLineNo">263</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  /** Default value for above params */<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  private final int warnResponseTime;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  private final int warnResponseSize;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  private final Server server;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  private final RpcScheduler scheduler;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  private UserProvider userProvider;<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>  private final BoundedByteBufferPool reservoir;<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * the result.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  class Call implements RpcCallContext {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int id;                             // the client's call id<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    protected BlockingService service;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    protected MethodDescriptor md;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    protected RequestHeader header;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    protected Message param;                      // the parameter passed<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // Optional cell data passed outside of protobufs.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    protected CellScanner cellScanner;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    protected Connection connection;              // connection to client<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    protected long timestamp;      // the time received when response is null<a name="line.298"></a>
+<span class="sourceLineNo">299</span>                                   // the time served when response is not null<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    /**<a name="line.300"></a>
+<span class="sourceLineNo">301</span>     * Chain of buffers to send as response.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>     */<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    protected BufferChain response;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    protected Responder responder;<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    protected long size;                          // size of current call<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    protected boolean isError;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    protected TraceInfo tinfo;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    private ByteBuffer cellBlock = null;<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    private User user;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    private InetAddress remoteAddress;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    private RpcCallback callback;<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private long responseCellSize = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private long responseBlockSize = 0;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    private boolean retryImmediatelySupported;<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.321"></a>
+<span class="sourceLineNo">322</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.322"></a>
+<span class="sourceLineNo">323</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      this.id = id;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      this.service = service;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      this.md = md;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      this.header = header;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      this.param = param;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      this.cellScanner = cellScanner;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      this.connection = connection;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.timestamp = System.currentTimeMillis();<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.response = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      this.responder = responder;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      this.isError = false;<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      this.size = size;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.tinfo = tinfo;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.remoteAddress = remoteAddress;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.retryImmediatelySupported =<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    /**<a name="line.343"></a>
+<span class="sourceLineNo">344</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.344"></a>
+<span class="sourceLineNo">345</span>     * cleanup.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>     */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    void done() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        // Return buffer to reservoir now we are done with it.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        reservoir.putBuffer(this.cellBlock);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        this.cellBlock = null;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    @Override<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    public String toString() {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      return toShortString() + " param: " +<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        " connection: " + connection.toString();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    protected RequestHeader getHeader() {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      return this.header;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>    /*<a name="line.369"></a>
+<span class="sourceLineNo">370</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.370"></a>
+<span class="sourceLineNo">371</span>     * the payload of a command<a name="line.371"></a>
+<span class="sourceLineNo">372</span>     */<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    String toShortString() {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      String serviceName = this.connection.service != null ?<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          " connection: " + connection.toString();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    String toTraceString() {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      String serviceName = this.connection.service != null ?<a name="line.383"></a>
+<span class="sourceLineNo">384</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return serviceName + "." + methodName;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      this.response = new BufferChain(response);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        Throwable t, String errorMsg) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      if (this.isError) return;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      if (t != null) this.isError = true;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      BufferChain bc = null;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      try {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        // Presume it a pb Message.  Could be null.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        Message result = (Message)m;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        // Call id.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        headerBuilder.setCallId(this.id);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (t != null) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (t instanceof RegionMovedException) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            // any kind of payload.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          // Set the exception as the result of the method invocation.<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        if (this.cellBlock != null) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        Message header = headerBuilder.build();<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>        byte[] b = createHeaderAndMessageBytes(result, header);<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>        bc = new BufferChain(ByteBuffer.wrap(b), this.cellBlock);<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>        if (connection.useWrap) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          bc = wrapWithSasl(bc);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      } catch (IOException e) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        LOG.warn("Exception while creating response " + e);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      this.response = bc;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      if (this.callback != null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          this.callback.run();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        } catch (Exception e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          // Don't allow any exception here to kill this handler thread.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>    private byte[] createHeaderAndMessageBytes(Message result, Message header)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // one big byte array; save on allocations.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      int headerSerializedSize = 0, resultSerializedSize = 0, headerVintSize = 0,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          resultVintSize = 0;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (header != null) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        headerSerializedSize = header.getSerializedSize();<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        headerVintSize = CodedOutputStream.computeRawVarint32Size(headerSerializedSize);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (result != null) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        resultSerializedSize = result.getSerializedSize();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        resultVintSize = CodedOutputStream.computeRawVarint32Size(resultSerializedSize);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      // calculate the total size<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      int totalSize = headerSerializedSize + headerVintSize<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          + (resultSerializedSize + resultVintSize)<a name="line.472"></a>
+<span class="sourceLineNo">473</span>          + (this.cellBlock == null ? 0 : this.cellBlock.limit());<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // The byte[] should also hold the totalSize of the header, message and the cellblock<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      byte[] b = new byte[headerSerializedSize + headerVintSize + resultSerializedSize<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          + resultVintSize + Bytes.SIZEOF_INT];<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      // The RpcClient expects the int to be in a format that code be decoded by<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // the DataInputStream#readInt(). Hence going with the Bytes.toBytes(int)<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // form of writing int.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Bytes.putInt(b, 0, totalSize);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      CodedOutputStream cos = CodedOutputStream.newInstance(b, Bytes.SIZEOF_INT,<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          b.length - Bytes.SIZEOF_INT);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (header != null) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        cos.writeMessageNoTag(header);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      if (result != null) {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        cos.writeMessageNoTa

<TRUNCATED>

[17/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
index 8fc3dbd..efdc708 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
@@ -824,743 +824,747 @@
 <span class="sourceLineNo">816</span>          i++;<a name="line.816"></a>
 <span class="sourceLineNo">817</span>          lowestLocalityServerIndex = serverIndicesSortedByLocality[i];<a name="line.817"></a>
 <span class="sourceLineNo">818</span>        }<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        LOG.debug("Lowest locality region server with non zero regions is "<a name="line.819"></a>
-<span class="sourceLineNo">820</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        return lowestLocalityServerIndex;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      }<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span><a name="line.825"></a>
-<span class="sourceLineNo">826</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      if (regionFinder != null) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        float lowestLocality = 1.0f;<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        int lowestLocalityRegionIndex = 0;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          // No regions on that region server<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          return -1;<a name="line.832"></a>
-<span class="sourceLineNo">833</span>        }<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.836"></a>
-<span class="sourceLineNo">837</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          if (locality &lt; lowestLocality) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>            lowestLocality = locality;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>            lowestLocalityRegionIndex = j;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>          }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.844"></a>
-<span class="sourceLineNo">845</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            + " regions");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      } else {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        return -1;<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      }<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    float getLocalityOfRegion(int region, int server) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      if (regionFinder != null) {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      } else {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        return 0f;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      }<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      if (regionFinder != null) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        int leastLoadedServerIndex = -1;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        int load = Integer.MAX_VALUE;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        for (ServerName sn : topLocalServers) {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            continue;<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          }<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          if (regionsPerServer[index] == null) {<a name="line.872"></a>
+<span class="sourceLineNo">819</span>        if (LOG.isTraceEnabled()) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>          LOG.trace("Lowest locality region server with non zero regions is "<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.821"></a>
+<span class="sourceLineNo">822</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        return lowestLocalityServerIndex;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (regionFinder != null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        float lowestLocality = 1.0f;<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        int lowestLocalityRegionIndex = 0;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>          // No regions on that region server<a name="line.833"></a>
+<span class="sourceLineNo">834</span>          return -1;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>        }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.837"></a>
+<span class="sourceLineNo">838</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.838"></a>
+<span class="sourceLineNo">839</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.840"></a>
+<span class="sourceLineNo">841</span>          if (locality &lt; lowestLocality) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            lowestLocality = locality;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>            lowestLocalityRegionIndex = j;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>          }<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        if (LOG.isTraceEnabled()) {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.847"></a>
+<span class="sourceLineNo">848</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.848"></a>
+<span class="sourceLineNo">849</span>            + " regions");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        }<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      } else {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        return -1;<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      }<a name="line.854"></a>
+<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
+<span class="sourceLineNo">856</span><a name="line.856"></a>
+<span class="sourceLineNo">857</span>    float getLocalityOfRegion(int region, int server) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      if (regionFinder != null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      } else {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        return 0f;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      }<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>      if (regionFinder != null) {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        int leastLoadedServerIndex = -1;<a name="line.869"></a>
+<span class="sourceLineNo">870</span>        int load = Integer.MAX_VALUE;<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        for (ServerName sn : topLocalServers) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.872"></a>
 <span class="sourceLineNo">873</span>            continue;<a name="line.873"></a>
 <span class="sourceLineNo">874</span>          }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>          int tempLoad = regionsPerServer[index].length;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          if (tempLoad &lt;= load) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>            leastLoadedServerIndex = index;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>            load = tempLoad;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>        }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        return leastLoadedServerIndex;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        return -1;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      }<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>    void calculateRegionServerLocalities() {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      if (regionFinder == null) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        return;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            int regionIndex = regionsPerServer[i][j];<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          }<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        } else {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>    @VisibleForTesting<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    protected void setNumRegions(int numRegions) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      this.numRegions = numRegions;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    @VisibleForTesting<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      this.numMovedRegions = numMovedRegions;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        justification="Not important but should be fixed")<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      String desc = "Cluster{" +<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          "servers=[";<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          for(ServerName sn:servers) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>             desc += sn.getHostAndPort() + ", ";<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          }<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          desc +=<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          ", serverIndicesSortedByRegionCount="+<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.927"></a>
-<span class="sourceLineNo">928</span>          ", regionsPerServer=[";<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>          for (int[]r:regionsPerServer) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>            desc += Arrays.toString(r);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>          }<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          desc += "]" +<a name="line.933"></a>
-<span class="sourceLineNo">934</span>          ", numMaxRegionsPerTable=" +<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          ", numRegions=" +<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          numRegions +<a name="line.937"></a>
-<span class="sourceLineNo">938</span>          ", numServers=" +<a name="line.938"></a>
-<span class="sourceLineNo">939</span>          numServers +<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          ", numTables=" +<a name="line.940"></a>
-<span class="sourceLineNo">941</span>          numTables +<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          ", numMovedRegions=" +<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          numMovedRegions +<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          '}';<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      return desc;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span>  }<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>  // slop for regions<a name="line.949"></a>
-<span class="sourceLineNo">950</span>  protected float slop;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  protected Configuration config;<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  protected RackManager rackManager;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  // Regions of these tables are put on the master by default.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static final String TABLES_ON_MASTER =<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    "hbase.balancer.tablesOnMaster";<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  protected ClusterStatus clusterStatus = null;<a name="line.967"></a>
-<span class="sourceLineNo">968</span>  protected ServerName masterServerName;<a name="line.968"></a>
-<span class="sourceLineNo">969</span>  protected MasterServices services;<a name="line.969"></a>
-<span class="sourceLineNo">970</span><a name="line.970"></a>
-<span class="sourceLineNo">971</span>  /**<a name="line.971"></a>
-<span class="sourceLineNo">972</span>   * By default, regions of some small system tables such as meta,<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * want to assign any region to the active master, you need to<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   */<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    if (valueString == null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    valueString = valueString.trim();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return null;<a name="line.984"></a>
+<span class="sourceLineNo">875</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.875"></a>
+<span class="sourceLineNo">876</span>          if (regionsPerServer[index] == null) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>            continue;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          }<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          int tempLoad = regionsPerServer[index].length;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          if (tempLoad &lt;= load) {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>            leastLoadedServerIndex = index;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>            load = tempLoad;<a name="line.882"></a>
+<span class="sourceLineNo">883</span>          }<a name="line.883"></a>
+<span class="sourceLineNo">884</span>        }<a name="line.884"></a>
+<span class="sourceLineNo">885</span>        return leastLoadedServerIndex;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      } else {<a name="line.886"></a>
+<span class="sourceLineNo">887</span>        return -1;<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      }<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
+<span class="sourceLineNo">890</span><a name="line.890"></a>
+<span class="sourceLineNo">891</span>    void calculateRegionServerLocalities() {<a name="line.891"></a>
+<span class="sourceLineNo">892</span>      if (regionFinder == null) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        return;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.897"></a>
+<span class="sourceLineNo">898</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>            int regionIndex = regionsPerServer[i][j];<a name="line.900"></a>
+<span class="sourceLineNo">901</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.901"></a>
+<span class="sourceLineNo">902</span>          }<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        } else {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    @VisibleForTesting<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected void setNumRegions(int numRegions) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      this.numRegions = numRegions;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>    @VisibleForTesting<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      this.numMovedRegions = numMovedRegions;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.920"></a>
+<span class="sourceLineNo">921</span>        justification="Not important but should be fixed")<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    @Override<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public String toString() {<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      String desc = "Cluster{" +<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          "servers=[";<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          for(ServerName sn:servers) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>             desc += sn.getHostAndPort() + ", ";<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          }<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          desc +=<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          ", serverIndicesSortedByRegionCount="+<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.931"></a>
+<span class="sourceLineNo">932</span>          ", regionsPerServer=[";<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>          for (int[]r:regionsPerServer) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>            desc += Arrays.toString(r);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          desc += "]" +<a name="line.937"></a>
+<span class="sourceLineNo">938</span>          ", numMaxRegionsPerTable=" +<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          ", numRegions=" +<a name="line.940"></a>
+<span class="sourceLineNo">941</span>          numRegions +<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          ", numServers=" +<a name="line.942"></a>
+<span class="sourceLineNo">943</span>          numServers +<a name="line.943"></a>
+<span class="sourceLineNo">944</span>          ", numTables=" +<a name="line.944"></a>
+<span class="sourceLineNo">945</span>          numTables +<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          ", numMovedRegions=" +<a name="line.946"></a>
+<span class="sourceLineNo">947</span>          numMovedRegions +<a name="line.947"></a>
+<span class="sourceLineNo">948</span>          '}';<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      return desc;<a name="line.949"></a>
+<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
+<span class="sourceLineNo">952</span><a name="line.952"></a>
+<span class="sourceLineNo">953</span>  // slop for regions<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  protected float slop;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>  protected Configuration config;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  protected RackManager rackManager;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.957"></a>
+<span class="sourceLineNo">958</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.958"></a>
+<span class="sourceLineNo">959</span><a name="line.959"></a>
+<span class="sourceLineNo">960</span>  // Regions of these tables are put on the master by default.<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  public static final String TABLES_ON_MASTER =<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    "hbase.balancer.tablesOnMaster";<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.970"></a>
+<span class="sourceLineNo">971</span>  protected ClusterStatus clusterStatus = null;<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  protected ServerName masterServerName;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>  protected MasterServices services;<a name="line.973"></a>
+<span class="sourceLineNo">974</span><a name="line.974"></a>
+<span class="sourceLineNo">975</span>  /**<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * By default, regions of some small system tables such as meta,<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * want to assign any region to the active master, you need to<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.979"></a>
+<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
+<span class="sourceLineNo">981</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    if (valueString == null) {<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.984"></a>
 <span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    return StringUtils.getStrings(valueString);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
-<span class="sourceLineNo">990</span>   * Check if configured to put any tables on the active master<a name="line.990"></a>
-<span class="sourceLineNo">991</span>   */<a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    String[] tables = getTablesOnMaster(conf);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  public void setConf(Configuration conf) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    setSlop(conf);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    if (slop &lt; 0) slop = 0;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    else if (slop &gt; 1) slop = 1;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span><a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    this.config = conf;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    this.rackManager = new RackManager(getConf());<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    regionFinder.setConf(conf);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  }<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  protected void setSlop(Configuration conf) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1013"></a>
+<span class="sourceLineNo">986</span>    valueString = valueString.trim();<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      return null;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    return StringUtils.getStrings(valueString);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>  }<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>  /**<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * Check if configured to put any tables on the active master<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   */<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    String[] tables = getTablesOnMaster(conf);<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.998"></a>
+<span class="sourceLineNo">999</span>  }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span><a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>  @Override<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  public void setConf(Configuration conf) {<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    setSlop(conf);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    if (slop &lt; 0) slop = 0;<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    else if (slop &gt; 1) slop = 1;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    this.config = conf;<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.rackManager = new RackManager(getConf());<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    regionFinder.setConf(conf);<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  }<a name="line.1014"></a>
 <span class="sourceLineNo">1015</span><a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  /**<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * Check if a region belongs to some small system table.<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   */<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Balance the regions that should be on master regionserver.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    if (masterServerName == null<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (regions != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      for (HRegionInfo region: regions) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        // Find a non-master regionserver to host the region<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>        ServerName dest = keyIt.next();<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (masterServerName.equals(dest)) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          if (!keyIt.hasNext()) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>          dest = keyIt.next();<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        // Move this region away from the master regionserver<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (plans == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>        plans.add(plan);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        // Move this region to the master regionserver<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        if (plans == null) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        plans.add(plan);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    return plans;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>  }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span><a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>  /**<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>   * Assign the regions that should be on master regionserver.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>   */<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      return null;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      for (HRegionInfo region: regions) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        if (shouldBeOnMaster(region)) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          assignments.get(masterServerName).add(region);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    return assignments;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>  }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>  @Override<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public Configuration getConf() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    return this.config;<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  @Override<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    this.clusterStatus = st;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    regionFinder.setClusterStatus(st);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @Override<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    masterServerName = masterServices.getServerName();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    this.services = masterServices;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    this.regionFinder.setServices(masterServices);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  public void setRackManager(RackManager rackManager) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    this.rackManager = rackManager;<a name="line.1115"></a>
+<span class="sourceLineNo">1016</span>  protected void setSlop(Configuration conf) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>  }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span><a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>  /**<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * Check if a region belongs to some small system table.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   */<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  /**<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>   * Balance the regions that should be on master regionserver.<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>   */<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (masterServerName == null<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    if (regions != null) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      for (HRegionInfo region: regions) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        // Find a non-master regionserver to host the region<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>        ServerName dest = keyIt.next();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        if (masterServerName.equals(dest)) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          if (!keyIt.hasNext()) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          dest = keyIt.next();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span><a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>        // Move this region away from the master regionserver<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>        if (plans == null) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>        }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>        plans.add(plan);<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span><a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        // Move this region to the master regionserver<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (plans == null) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        plans.add(plan);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    return plans;<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>  }<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>  /**<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>   * Assign the regions that should be on master regionserver.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>   */<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      return null;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>    }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      for (HRegionInfo region: regions) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (shouldBeOnMaster(region)) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          assignments.get(masterServerName).add(region);<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    return assignments;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  @Override<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  public Configuration getConf() {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    return this.config;<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  @Override<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    this.clusterStatus = st;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    regionFinder.setClusterStatus(st);<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span><a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    masterServerName = masterServices.getServerName();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    this.services = masterServices;<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    this.regionFinder.setServices(masterServices);<a name="line.1115"></a>
 <span class="sourceLineNo">1116</span>  }<a name="line.1116"></a>
 <span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>  protected boolean needsBalance(Cluster c) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      if (LOG.isDebugEnabled()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            + " active regionserver(s)");<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      return false;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    // Check if we even need to do any load balancing<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    // HBASE-3681 check sloppiness first<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      if (LOG.isTraceEnabled()) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          "servers=" + cs.getNumServers() +<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      return false;<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    return true;<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  /**<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * rack hosts replicas of the same region<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   * @param c Cluster information<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   * @return whether region replicas are currently co-located<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return false;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  /**<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>   * simple round-robin assignment.<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * &lt;p&gt;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>   * &lt;p&gt;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   *<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   *<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * @param regions all regions<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * @param servers all servers<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   * @return map of server to the regions it should take, or null if no<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   */<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  @Override<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      List&lt;ServerName&gt; servers) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    metricsBalancer.incrMiscInvocations();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Guarantee not to put other regions on master<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      servers.remove(masterServerName);<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>      if (!masterRegions.isEmpty()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>        for (HRegionInfo region: masterRegions) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          regions.remove(region);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (regions == null || regions.isEmpty()) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return assignments;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (numServers == 0) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      return null;<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      ServerName server = servers.get(0);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      return assignments;<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      servers, assignments);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      boolean assigned = false;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>          if (serverRegions == null) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>            assignments.put(serverName, serverRegions);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          serverRegions.add(region);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cluster.doAssignRegion(region, serverName);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          assigned = true;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          break;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!assigned) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        lastFewRegions.add(region);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    for (HRegionInfo region : lastFewRegions) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      int i = RANDOM.nextInt(numServers);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      ServerName server = servers.get(i);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      List&lt;HRegionInfo&gt; serverRegions = assignments.get(server);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (serverRegions == null) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>        assignments.put(server, serverRegions);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      serverRegions.add(region);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      cluster.doAssignRegion(region, server);<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    return assignments;<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      Collection&lt;HRegionInfo&gt; regions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // replicas of the regions that are passed (for performance).<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    for (ServerName server : servers) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      if (!clusterState.containsKey(server)) {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      rackManager);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * regions in transition that do not have an already known destination.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   *<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * assigned to.<a name="line.1283"></a>
+<span class="sourceLineNo">1118</span>  public void setRackManager(RackManager rackManager) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    this.rackManager = rackManager;<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span><a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  protected boolean needsBalance(Cluster c) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      if (LOG.isDebugEnabled()) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            + " active regionserver(s)");<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    // Check if we even need to do any load balancing<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    // HBASE-3681 check sloppiness first<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (LOG.isTraceEnabled()) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>          "servers=" + cs.getNumServers() +<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      return false;<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    return true;<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>  /**<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   * rack hosts replicas of the same region<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * @param c Cluster information<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>   * @return whether region replicas are currently co-located<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>   */<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    return false;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  /**<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * simple round-robin assignment.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * &lt;p&gt;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   * &lt;p&gt;<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>   *<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>   *<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   * @param regions all regions<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * @param servers all servers<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @return map of server to the regions it should take, or null if no<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      List&lt;ServerName&gt; servers) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    metricsBalancer.incrMiscInvocations();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      // Guarantee not to put other regions on master<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      servers.remove(masterServerName);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      if (!masterRegions.isEmpty()) {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        for (HRegionInfo region: masterRegions) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          regions.remove(region);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regions == null || regions.isEmpty()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return assignments;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    if (numServers == 0) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return null;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      ServerName server = servers.get(0);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      return assignments;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>      servers, assignments);<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span><a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      boolean assigned = false;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          if (serverRegions == null) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>            assignments.put(serverName, serverRegions);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>          serverRegions.add(region);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          cluster.doAssignRegion(region, serverName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          assigned = true;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>          break;<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        }<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>      }

<TRUNCATED>

[20/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
index 8fc3dbd..efdc708 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
@@ -824,743 +824,747 @@
 <span class="sourceLineNo">816</span>          i++;<a name="line.816"></a>
 <span class="sourceLineNo">817</span>          lowestLocalityServerIndex = serverIndicesSortedByLocality[i];<a name="line.817"></a>
 <span class="sourceLineNo">818</span>        }<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        LOG.debug("Lowest locality region server with non zero regions is "<a name="line.819"></a>
-<span class="sourceLineNo">820</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        return lowestLocalityServerIndex;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      }<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span><a name="line.825"></a>
-<span class="sourceLineNo">826</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      if (regionFinder != null) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        float lowestLocality = 1.0f;<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        int lowestLocalityRegionIndex = 0;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          // No regions on that region server<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          return -1;<a name="line.832"></a>
-<span class="sourceLineNo">833</span>        }<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.836"></a>
-<span class="sourceLineNo">837</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          if (locality &lt; lowestLocality) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>            lowestLocality = locality;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>            lowestLocalityRegionIndex = j;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>          }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.844"></a>
-<span class="sourceLineNo">845</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            + " regions");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      } else {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        return -1;<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      }<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    float getLocalityOfRegion(int region, int server) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      if (regionFinder != null) {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      } else {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        return 0f;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      }<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      if (regionFinder != null) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        int leastLoadedServerIndex = -1;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        int load = Integer.MAX_VALUE;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        for (ServerName sn : topLocalServers) {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            continue;<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          }<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          if (regionsPerServer[index] == null) {<a name="line.872"></a>
+<span class="sourceLineNo">819</span>        if (LOG.isTraceEnabled()) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>          LOG.trace("Lowest locality region server with non zero regions is "<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.821"></a>
+<span class="sourceLineNo">822</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        return lowestLocalityServerIndex;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (regionFinder != null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        float lowestLocality = 1.0f;<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        int lowestLocalityRegionIndex = 0;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>          // No regions on that region server<a name="line.833"></a>
+<span class="sourceLineNo">834</span>          return -1;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>        }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.837"></a>
+<span class="sourceLineNo">838</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.838"></a>
+<span class="sourceLineNo">839</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.840"></a>
+<span class="sourceLineNo">841</span>          if (locality &lt; lowestLocality) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            lowestLocality = locality;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>            lowestLocalityRegionIndex = j;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>          }<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        if (LOG.isTraceEnabled()) {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.847"></a>
+<span class="sourceLineNo">848</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.848"></a>
+<span class="sourceLineNo">849</span>            + " regions");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        }<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      } else {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        return -1;<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      }<a name="line.854"></a>
+<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
+<span class="sourceLineNo">856</span><a name="line.856"></a>
+<span class="sourceLineNo">857</span>    float getLocalityOfRegion(int region, int server) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      if (regionFinder != null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      } else {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        return 0f;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      }<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>      if (regionFinder != null) {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        int leastLoadedServerIndex = -1;<a name="line.869"></a>
+<span class="sourceLineNo">870</span>        int load = Integer.MAX_VALUE;<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        for (ServerName sn : topLocalServers) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.872"></a>
 <span class="sourceLineNo">873</span>            continue;<a name="line.873"></a>
 <span class="sourceLineNo">874</span>          }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>          int tempLoad = regionsPerServer[index].length;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          if (tempLoad &lt;= load) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>            leastLoadedServerIndex = index;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>            load = tempLoad;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>        }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        return leastLoadedServerIndex;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        return -1;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      }<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>    void calculateRegionServerLocalities() {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      if (regionFinder == null) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        return;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            int regionIndex = regionsPerServer[i][j];<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          }<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        } else {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>    @VisibleForTesting<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    protected void setNumRegions(int numRegions) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      this.numRegions = numRegions;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    @VisibleForTesting<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      this.numMovedRegions = numMovedRegions;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        justification="Not important but should be fixed")<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      String desc = "Cluster{" +<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          "servers=[";<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          for(ServerName sn:servers) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>             desc += sn.getHostAndPort() + ", ";<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          }<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          desc +=<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          ", serverIndicesSortedByRegionCount="+<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.927"></a>
-<span class="sourceLineNo">928</span>          ", regionsPerServer=[";<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>          for (int[]r:regionsPerServer) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>            desc += Arrays.toString(r);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>          }<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          desc += "]" +<a name="line.933"></a>
-<span class="sourceLineNo">934</span>          ", numMaxRegionsPerTable=" +<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          ", numRegions=" +<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          numRegions +<a name="line.937"></a>
-<span class="sourceLineNo">938</span>          ", numServers=" +<a name="line.938"></a>
-<span class="sourceLineNo">939</span>          numServers +<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          ", numTables=" +<a name="line.940"></a>
-<span class="sourceLineNo">941</span>          numTables +<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          ", numMovedRegions=" +<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          numMovedRegions +<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          '}';<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      return desc;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span>  }<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>  // slop for regions<a name="line.949"></a>
-<span class="sourceLineNo">950</span>  protected float slop;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  protected Configuration config;<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  protected RackManager rackManager;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  // Regions of these tables are put on the master by default.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static final String TABLES_ON_MASTER =<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    "hbase.balancer.tablesOnMaster";<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  protected ClusterStatus clusterStatus = null;<a name="line.967"></a>
-<span class="sourceLineNo">968</span>  protected ServerName masterServerName;<a name="line.968"></a>
-<span class="sourceLineNo">969</span>  protected MasterServices services;<a name="line.969"></a>
-<span class="sourceLineNo">970</span><a name="line.970"></a>
-<span class="sourceLineNo">971</span>  /**<a name="line.971"></a>
-<span class="sourceLineNo">972</span>   * By default, regions of some small system tables such as meta,<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * want to assign any region to the active master, you need to<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   */<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    if (valueString == null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    valueString = valueString.trim();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return null;<a name="line.984"></a>
+<span class="sourceLineNo">875</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.875"></a>
+<span class="sourceLineNo">876</span>          if (regionsPerServer[index] == null) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>            continue;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          }<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          int tempLoad = regionsPerServer[index].length;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          if (tempLoad &lt;= load) {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>            leastLoadedServerIndex = index;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>            load = tempLoad;<a name="line.882"></a>
+<span class="sourceLineNo">883</span>          }<a name="line.883"></a>
+<span class="sourceLineNo">884</span>        }<a name="line.884"></a>
+<span class="sourceLineNo">885</span>        return leastLoadedServerIndex;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      } else {<a name="line.886"></a>
+<span class="sourceLineNo">887</span>        return -1;<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      }<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
+<span class="sourceLineNo">890</span><a name="line.890"></a>
+<span class="sourceLineNo">891</span>    void calculateRegionServerLocalities() {<a name="line.891"></a>
+<span class="sourceLineNo">892</span>      if (regionFinder == null) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        return;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.897"></a>
+<span class="sourceLineNo">898</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>            int regionIndex = regionsPerServer[i][j];<a name="line.900"></a>
+<span class="sourceLineNo">901</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.901"></a>
+<span class="sourceLineNo">902</span>          }<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        } else {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    @VisibleForTesting<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected void setNumRegions(int numRegions) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      this.numRegions = numRegions;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>    @VisibleForTesting<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      this.numMovedRegions = numMovedRegions;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.920"></a>
+<span class="sourceLineNo">921</span>        justification="Not important but should be fixed")<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    @Override<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public String toString() {<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      String desc = "Cluster{" +<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          "servers=[";<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          for(ServerName sn:servers) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>             desc += sn.getHostAndPort() + ", ";<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          }<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          desc +=<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          ", serverIndicesSortedByRegionCount="+<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.931"></a>
+<span class="sourceLineNo">932</span>          ", regionsPerServer=[";<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>          for (int[]r:regionsPerServer) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>            desc += Arrays.toString(r);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          desc += "]" +<a name="line.937"></a>
+<span class="sourceLineNo">938</span>          ", numMaxRegionsPerTable=" +<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          ", numRegions=" +<a name="line.940"></a>
+<span class="sourceLineNo">941</span>          numRegions +<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          ", numServers=" +<a name="line.942"></a>
+<span class="sourceLineNo">943</span>          numServers +<a name="line.943"></a>
+<span class="sourceLineNo">944</span>          ", numTables=" +<a name="line.944"></a>
+<span class="sourceLineNo">945</span>          numTables +<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          ", numMovedRegions=" +<a name="line.946"></a>
+<span class="sourceLineNo">947</span>          numMovedRegions +<a name="line.947"></a>
+<span class="sourceLineNo">948</span>          '}';<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      return desc;<a name="line.949"></a>
+<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
+<span class="sourceLineNo">952</span><a name="line.952"></a>
+<span class="sourceLineNo">953</span>  // slop for regions<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  protected float slop;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>  protected Configuration config;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  protected RackManager rackManager;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.957"></a>
+<span class="sourceLineNo">958</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.958"></a>
+<span class="sourceLineNo">959</span><a name="line.959"></a>
+<span class="sourceLineNo">960</span>  // Regions of these tables are put on the master by default.<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  public static final String TABLES_ON_MASTER =<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    "hbase.balancer.tablesOnMaster";<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.970"></a>
+<span class="sourceLineNo">971</span>  protected ClusterStatus clusterStatus = null;<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  protected ServerName masterServerName;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>  protected MasterServices services;<a name="line.973"></a>
+<span class="sourceLineNo">974</span><a name="line.974"></a>
+<span class="sourceLineNo">975</span>  /**<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * By default, regions of some small system tables such as meta,<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * want to assign any region to the active master, you need to<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.979"></a>
+<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
+<span class="sourceLineNo">981</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    if (valueString == null) {<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.984"></a>
 <span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    return StringUtils.getStrings(valueString);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
-<span class="sourceLineNo">990</span>   * Check if configured to put any tables on the active master<a name="line.990"></a>
-<span class="sourceLineNo">991</span>   */<a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    String[] tables = getTablesOnMaster(conf);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  public void setConf(Configuration conf) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    setSlop(conf);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    if (slop &lt; 0) slop = 0;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    else if (slop &gt; 1) slop = 1;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span><a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    this.config = conf;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    this.rackManager = new RackManager(getConf());<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    regionFinder.setConf(conf);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  }<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  protected void setSlop(Configuration conf) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1013"></a>
+<span class="sourceLineNo">986</span>    valueString = valueString.trim();<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      return null;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    return StringUtils.getStrings(valueString);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>  }<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>  /**<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * Check if configured to put any tables on the active master<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   */<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    String[] tables = getTablesOnMaster(conf);<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.998"></a>
+<span class="sourceLineNo">999</span>  }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span><a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>  @Override<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  public void setConf(Configuration conf) {<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    setSlop(conf);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    if (slop &lt; 0) slop = 0;<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    else if (slop &gt; 1) slop = 1;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    this.config = conf;<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.rackManager = new RackManager(getConf());<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    regionFinder.setConf(conf);<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  }<a name="line.1014"></a>
 <span class="sourceLineNo">1015</span><a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  /**<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * Check if a region belongs to some small system table.<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   */<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Balance the regions that should be on master regionserver.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    if (masterServerName == null<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (regions != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      for (HRegionInfo region: regions) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        // Find a non-master regionserver to host the region<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>        ServerName dest = keyIt.next();<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (masterServerName.equals(dest)) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          if (!keyIt.hasNext()) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>          dest = keyIt.next();<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        // Move this region away from the master regionserver<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (plans == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>        plans.add(plan);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        // Move this region to the master regionserver<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        if (plans == null) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        plans.add(plan);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    return plans;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>  }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span><a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>  /**<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>   * Assign the regions that should be on master regionserver.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>   */<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      return null;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      for (HRegionInfo region: regions) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        if (shouldBeOnMaster(region)) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          assignments.get(masterServerName).add(region);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    return assignments;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>  }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>  @Override<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public Configuration getConf() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    return this.config;<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  @Override<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    this.clusterStatus = st;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    regionFinder.setClusterStatus(st);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @Override<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    masterServerName = masterServices.getServerName();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    this.services = masterServices;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    this.regionFinder.setServices(masterServices);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  public void setRackManager(RackManager rackManager) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    this.rackManager = rackManager;<a name="line.1115"></a>
+<span class="sourceLineNo">1016</span>  protected void setSlop(Configuration conf) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>  }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span><a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>  /**<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * Check if a region belongs to some small system table.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   */<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  /**<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>   * Balance the regions that should be on master regionserver.<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>   */<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (masterServerName == null<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    if (regions != null) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      for (HRegionInfo region: regions) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        // Find a non-master regionserver to host the region<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>        ServerName dest = keyIt.next();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        if (masterServerName.equals(dest)) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          if (!keyIt.hasNext()) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          dest = keyIt.next();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span><a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>        // Move this region away from the master regionserver<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>        if (plans == null) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>        }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>        plans.add(plan);<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span><a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        // Move this region to the master regionserver<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (plans == null) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        plans.add(plan);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    return plans;<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>  }<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>  /**<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>   * Assign the regions that should be on master regionserver.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>   */<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      return null;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>    }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      for (HRegionInfo region: regions) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (shouldBeOnMaster(region)) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          assignments.get(masterServerName).add(region);<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    return assignments;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  @Override<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  public Configuration getConf() {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    return this.config;<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  @Override<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    this.clusterStatus = st;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    regionFinder.setClusterStatus(st);<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span><a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    masterServerName = masterServices.getServerName();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    this.services = masterServices;<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    this.regionFinder.setServices(masterServices);<a name="line.1115"></a>
 <span class="sourceLineNo">1116</span>  }<a name="line.1116"></a>
 <span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>  protected boolean needsBalance(Cluster c) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      if (LOG.isDebugEnabled()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            + " active regionserver(s)");<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      return false;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    // Check if we even need to do any load balancing<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    // HBASE-3681 check sloppiness first<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      if (LOG.isTraceEnabled()) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          "servers=" + cs.getNumServers() +<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      return false;<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    return true;<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  /**<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * rack hosts replicas of the same region<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   * @param c Cluster information<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   * @return whether region replicas are currently co-located<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return false;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  /**<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>   * simple round-robin assignment.<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * &lt;p&gt;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>   * &lt;p&gt;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   *<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   *<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * @param regions all regions<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * @param servers all servers<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   * @return map of server to the regions it should take, or null if no<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   */<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  @Override<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      List&lt;ServerName&gt; servers) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    metricsBalancer.incrMiscInvocations();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Guarantee not to put other regions on master<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      servers.remove(masterServerName);<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>      if (!masterRegions.isEmpty()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>        for (HRegionInfo region: masterRegions) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          regions.remove(region);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (regions == null || regions.isEmpty()) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return assignments;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (numServers == 0) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      return null;<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      ServerName server = servers.get(0);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      return assignments;<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      servers, assignments);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      boolean assigned = false;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>          if (serverRegions == null) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>            assignments.put(serverName, serverRegions);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          serverRegions.add(region);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cluster.doAssignRegion(region, serverName);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          assigned = true;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          break;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!assigned) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        lastFewRegions.add(region);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    for (HRegionInfo region : lastFewRegions) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      int i = RANDOM.nextInt(numServers);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      ServerName server = servers.get(i);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      List&lt;HRegionInfo&gt; serverRegions = assignments.get(server);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (serverRegions == null) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>        assignments.put(server, serverRegions);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      serverRegions.add(region);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      cluster.doAssignRegion(region, server);<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    return assignments;<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      Collection&lt;HRegionInfo&gt; regions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // replicas of the regions that are passed (for performance).<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    for (ServerName server : servers) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      if (!clusterState.containsKey(server)) {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      rackManager);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * regions in transition that do not have an already known destination.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   *<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * assigned to.<a name="line.1283"></a>
+<span class="sourceLineNo">1118</span>  public void setRackManager(RackManager rackManager) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    this.rackManager = rackManager;<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span><a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  protected boolean needsBalance(Cluster c) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      if (LOG.isDebugEnabled()) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            + " active regionserver(s)");<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    // Check if we even need to do any load balancing<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    // HBASE-3681 check sloppiness first<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (LOG.isTraceEnabled()) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>          "servers=" + cs.getNumServers() +<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      return false;<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    return true;<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>  /**<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   * rack hosts replicas of the same region<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * @param c Cluster information<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>   * @return whether region replicas are currently co-located<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>   */<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    return false;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  /**<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * simple round-robin assignment.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * &lt;p&gt;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   * &lt;p&gt;<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>   *<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>   *<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   * @param regions all regions<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * @param servers all servers<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @return map of server to the regions it should take, or null if no<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      List&lt;ServerName&gt; servers) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    metricsBalancer.incrMiscInvocations();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      // Guarantee not to put other regions on master<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      servers.remove(masterServerName);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      if (!masterRegions.isEmpty()) {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        for (HRegionInfo region: masterRegions) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          regions.remove(region);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regions == null || regions.isEmpty()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return assignments;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    if (numServers == 0) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return null;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      ServerName server = servers.get(0);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      return assignments;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>      servers, assignments);<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span><a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      boolean assigned = false;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          if (serverRegions == null) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>            assignments.put(serverName, serverRegions);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>          serverRegions.add(region);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          cluster.doAssignRegion(region, serverName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          assigned = true;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>          break;<a name="line.

<TRUNCATED>

[08/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
index e2c4389..d03724e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
@@ -5185,3056 +5185,3058 @@
 <span class="sourceLineNo">5177</span>   * @param readLock is the lock reader or writer. True indicates that a non-exlcusive<a name="line.5177"></a>
 <span class="sourceLineNo">5178</span>   *                 lock is requested<a name="line.5178"></a>
 <span class="sourceLineNo">5179</span>   */<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    // Make sure the row is inside of this region before getting the lock for it.<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    checkRow(row, "row lock");<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    // create an object to use a a key in the row lock map<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    HashedBytes rowKey = new HashedBytes(row);<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    RowLockContext rowLockContext = null;<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    RowLockImpl result = null;<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    TraceScope traceScope = null;<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span><a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    // If we're tracing start a span to show how long this took.<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>    if (Trace.isTracing()) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>      traceScope = Trace.startSpan("HRegion.getRowLock");<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>      traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock"));<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>    }<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span><a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    try {<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>      // Keep trying until we have a lock or error out.<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>      // TODO: do we need to add a time component here?<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>      while (result == null) {<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span><a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>        // Try adding a RowLockContext to the lockedRows.<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>        // If we can add it then there's no other transactions currently running.<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        rowLockContext = new RowLockContext(rowKey);<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span><a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>        // if there was a running transaction then there's already a context.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>        if (existingContext != null) {<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>          rowLockContext = existingContext;<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>        }<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span><a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>        // Now try an get the lock.<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>        //<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>        // This can fail as<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>        if (readLock) {<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>          result = rowLockContext.newReadLock();<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>        } else {<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>          result = rowLockContext.newWriteLock();<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>        }<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      }<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      if (!result.getLock().tryLock(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>        if (traceScope != null) {<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>          traceScope.getSpan().addTimelineAnnotation("Failed to get row lock");<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>        }<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>        result = null;<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>        // Clean up the counts just in case this was the thing keeping the context alive.<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        rowLockContext.cleanUp();<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        throw new IOException("Timed out waiting for lock for row: " + rowKey);<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>      }<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>      return result;<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>    } catch (InterruptedException ie) {<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>      LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>      iie.initCause(ie);<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>      if (traceScope != null) {<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>        traceScope.getSpan().addTimelineAnnotation("Interrupted exception getting row lock");<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>      }<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>      Thread.currentThread().interrupt();<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>      throw iie;<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    } finally {<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>      if (traceScope != null) {<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>        traceScope.close();<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>      }<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    }<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>  }<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span><a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>  @Override<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>  public void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>    if (rowLocks != null) {<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>      for (RowLock rowLock : rowLocks) {<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span>        rowLock.release();<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>      }<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>      rowLocks.clear();<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    }<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>  }<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span><a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>  @VisibleForTesting<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>  class RowLockContext {<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span>    private final HashedBytes row;<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    final AtomicBoolean usable = new AtomicBoolean(true);<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    final Object lock = new Object();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    RowLockContext(HashedBytes row) {<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>      this.row = row;<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    }<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span><a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    RowLockImpl newWriteLock() {<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>      Lock l = readWriteLock.writeLock();<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>      return getRowLock(l);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    }<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    RowLockImpl newReadLock() {<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>      Lock l = readWriteLock.readLock();<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>      return getRowLock(l);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    private RowLockImpl getRowLock(Lock l) {<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>      count.incrementAndGet();<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>      synchronized (lock) {<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        if (usable.get()) {<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>          return new RowLockImpl(this, l);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        } else {<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>          return null;<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        }<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>      }<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    }<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span><a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    void cleanUp() {<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>      long c = count.decrementAndGet();<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>      if (c &lt;= 0) {<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        synchronized (lock) {<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>          if (count.get() &lt;= 0 ){<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>            usable.set(false);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>            RowLockContext removed = lockedRows.remove(row);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>            assert removed == this: "we should never remove a different context";<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>          }<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        }<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>      }<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    }<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span><a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    @Override<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    public String toString() {<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>      return "RowLockContext{" +<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>          "row=" + row +<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>          ", readWriteLock=" + readWriteLock +<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>          ", count=" + count +<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>          '}';<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    }<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>  }<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span><a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>  /**<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>   * Class used to represent a lock on a row.<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>   */<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>  public static class RowLockImpl implements RowLock {<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    private final RowLockContext context;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    private final Lock lock;<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span><a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    public RowLockImpl(RowLockContext context, Lock lock) {<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>      this.context = context;<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>      this.lock = lock;<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    }<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span><a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    public Lock getLock() {<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>      return lock;<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    }<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span><a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    @VisibleForTesting<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>    public RowLockContext getContext() {<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      return context;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    }<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span><a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    @Override<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    public void release() {<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>      lock.unlock();<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>      context.cleanUp();<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>    }<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span><a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    @Override<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    public String toString() {<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>      return "RowLockImpl{" +<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>          "context=" + context +<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>          ", lock=" + lock +<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>          '}';<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>    }<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  }<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span><a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>  /**<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>   * Determines whether multiple column families are present<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>   * Precondition: familyPaths is not null<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>   *<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>   * @param familyPaths List of (column family, hfilePath)<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>   */<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    boolean multipleFamilies = false;<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    byte[] family = null;<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    for (Pair&lt;byte[], String&gt; pair : familyPaths) {<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>      byte[] fam = pair.getFirst();<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>      if (family == null) {<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>        family = fam;<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>      } else if (!Bytes.equals(family, fam)) {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>        multipleFamilies = true;<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>        break;<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>      }<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    }<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    return multipleFamilies;<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>  }<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span><a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  @Override<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>  public boolean bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, boolean assignSeqId,<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      BulkLoadListener bulkLoadListener) throws IOException {<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>    long seqId = -1;<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;byte[], List&lt;Path&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    Preconditions.checkNotNull(familyPaths);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    // we need writeLock for multi-family bulk load<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    try {<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      this.writeRequestsCount.increment();<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      // There possibly was a split that happened between when the split keys<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // were gathered and before the HRegion's write lock was taken.  We need<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      // to validate the HFile region before attempting to bulk load all of them<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>      List&lt;IOException&gt; ioes = new ArrayList&lt;IOException&gt;();<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;Pair&lt;byte[], String&gt;&gt;();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>        byte[] familyName = p.getFirst();<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>        String path = p.getSecond();<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span><a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>        Store store = getStore(familyName);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>        if (store == null) {<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>          IOException ioe = new org.apache.hadoop.hbase.DoNotRetryIOException(<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>              "No such column family " + Bytes.toStringBinary(familyName));<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>          ioes.add(ioe);<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>        } else {<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>          try {<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>            store.assertBulkLoadHFileOk(new Path(path));<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>          } catch (WrongRegionException wre) {<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>            // recoverable (file doesn't fit in region)<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>            failures.add(p);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>          } catch (IOException ioe) {<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>            // unrecoverable (hdfs problem)<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>            ioes.add(ioe);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>          }<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>        }<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>      }<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span><a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>      // validation failed because of some sort of IO problem.<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>      if (ioes.size() != 0) {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>        IOException e = MultipleIOException.createIOException(ioes);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>        LOG.error("There were one or more IO errors when checking if the bulk load is ok.", e);<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>        throw e;<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>      }<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span><a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>      // validation failed, bail out before doing anything permanent.<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>      if (failures.size() != 0) {<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>        StringBuilder list = new StringBuilder();<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>        for (Pair&lt;byte[], String&gt; p : failures) {<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>              .append(p.getSecond());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>        }<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        // problem when validating<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>        LOG.warn("There was a recoverable bulk load failure likely due to a" +<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>            " split.  These (family, HFile) pairs were not loaded: " + list);<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>        return false;<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>      }<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span><a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>      // We need to assign a sequential ID that's in between two memstores in order to preserve<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>      // the guarantee that all the edits lower than the highest sequential ID from all the<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>      // HFiles are flushed on disk. See HBASE-10958.  The sequence id returned when we flush is<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>      // a sequence id that we can be sure is beyond the last hfile written).<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>      if (assignSeqId) {<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        FlushResult fs = flushcache(true, false);<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>        if (fs.isFlushSucceeded()) {<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>        } else {<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>          throw new IOException("Could not bulk load with an assigned sequential ID because the "+<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>            "flush didn't run. Reason for not flushing: " + ((FlushResultImpl)fs).failureReason);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>        }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span>      }<a name="line.5441"></a>
-<span class="sourceLineNo">5442</span><a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        byte[] familyName = p.getFirst();<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>        String path = p.getSecond();<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>        Store store = getStore(familyName);<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>        try {<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>          String finalPath = path;<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>          if (bulkLoadListener != null) {<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path);<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>          }<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>          Path commitedStoreFile = store.bulkLoadHFile(finalPath, seqId);<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span><a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>          if(storeFiles.containsKey(familyName)) {<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>            storeFiles.get(familyName).add(commitedStoreFile);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>          } else {<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>            List&lt;Path&gt; storeFileNames = new ArrayList&lt;Path&gt;();<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>            storeFileNames.add(commitedStoreFile);<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>            storeFiles.put(familyName, storeFileNames);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>          }<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>          if (bulkLoadListener != null) {<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>            bulkLoadListener.doneBulkLoad(familyName, path);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>          }<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>        } catch (IOException ioe) {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>          // A failure here can cause an atomicity violation that we currently<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>          // cannot recover from since it is likely a failed HDFS operation.<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span><a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>          // TODO Need a better story for reverting partial failures due to HDFS.<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>          LOG.error("There was a partial failure due to IO when attempting to" +<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>              " load " + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>          if (bulkLoadListener != null) {<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>            try {<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>              bulkLoadListener.failedBulkLoad(familyName, path);<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>            } catch (Exception ex) {<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>              LOG.error("Error while calling failedBulkLoad for family " +<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>                  Bytes.toString(familyName) + " with path " + path, ex);<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>            }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>          }<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>          throw ioe;<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>        }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>      }<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span><a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>      return true;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    } finally {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        // write a bulk load event when not all hfiles are loaded<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        try {<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>          WALProtos.BulkLoadDescriptor loadDescriptor = ProtobufUtil.toBulkLoadDescriptor(<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>              this.getRegionInfo().getTable(),<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>              ByteStringer.wrap(this.getRegionInfo().getEncodedNameAsBytes()), storeFiles, seqId);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>          WALUtil.writeBulkLoadMarkerAndSync(wal, this.htableDescriptor, getRegionInfo(),<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>              loadDescriptor, mvcc);<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span>        } catch (IOException ioe) {<a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>          if (this.rsServices != null) {<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>            // Have to abort region server because some hfiles has been loaded but we can't write<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>            // the event into WAL<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>          }<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>        }<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>      }<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span><a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>      closeBulkRegionOperation();<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    }<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>  }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span><a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  @Override<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>  public boolean equals(Object o) {<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>                                                ((HRegion) o).getRegionInfo().getRegionName());<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>  }<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span><a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>  @Override<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>  public int hashCode() {<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    return Bytes.hashCode(getRegionInfo().getRegionName());<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>  }<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span><a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>  @Override<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>  public String toString() {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>    return getRegionInfo().getRegionNameAsString();<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>  }<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span><a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>  /**<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>   * RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>   */<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>  class RegionScannerImpl implements RegionScanner, org.apache.hadoop.hbase.ipc.RpcCallback {<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    // Package local for testability<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>    KeyValueHeap storeHeap = null;<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>    /** Heap of key-values that are not essential for the provided filters and are thus read<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>     * on demand, if on-demand column family loading is enabled.*/<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>    KeyValueHeap joinedHeap = null;<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>    /**<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>     * If the joined heap data gathering is interrupted due to scan limits, this will<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>     * contain the row for which we are populating the values.*/<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>    protected Cell joinedContinuationRow = null;<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    private boolean filterClosed = false;<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span><a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>    protected final int isScan;<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    protected final byte[] stopRow;<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    protected final HRegion region;<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    protected final CellComparator comparator;<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>    protected boolean copyCellsFromSharedMem = false;<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span><a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>    private final long readPt;<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>    private final long maxResultSize;<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>    private final ScannerContext defaultScannerContext;<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>    private final FilterWrapper filter;<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span><a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    @Override<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    public HRegionInfo getRegionInfo() {<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>      return region.getRegionInfo();<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>    }<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span><a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    public void setCopyCellsFromSharedMem(boolean copyCells) {<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>      this.copyCellsFromSharedMem = copyCells;<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    }<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span><a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    RegionScannerImpl(Scan scan, List&lt;KeyValueScanner&gt; additionalScanners, HRegion region,<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        boolean copyCellsFromSharedMem)<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>        throws IOException {<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>      this.region = region;<a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      this.maxResultSize = scan.getMaxResultSize();<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>      if (scan.hasFilter()) {<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        this.filter = new FilterWrapper(scan.getFilter());<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>      } else {<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>        this.filter = null;<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>      }<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      this.comparator = region.getCellCompartor();<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>      /**<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>       * By default, calls to next/nextRaw must enforce the batch limit. Thus, construct a default<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>       * scanner context that can be used to enforce the batch limit in the event that a<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>       * ScannerContext is not specified during an invocation of next/nextRaw<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>       */<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>      defaultScannerContext = ScannerContext.newBuilder()<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>          .setBatchLimit(scan.getBatch()).build();<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span><a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) &amp;&amp; !scan.isGetScan()) {<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>        this.stopRow = null;<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span>      } else {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        this.stopRow = scan.getStopRow();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>      }<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      // If we are doing a get, we want to be [startRow,endRow]. Normally<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>      // it is [startRow,endRow) and if startRow=endRow we get nothing.<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      this.isScan = scan.isGetScan() ? 1 : 0;<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span><a name="line.5584"></a>
-<span class="sourceLineNo">5585</span>      // synchronize on scannerReadPoints so that nobody calculates<a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>      // getSmallestReadPoint, before scannerReadPoints is updated.<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      IsolationLevel isolationLevel = scan.getIsolationLevel();<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      synchronized(scannerReadPoints) {<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>        this.readPt = getReadpoint(isolationLevel);<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        scannerReadPoints.put(this, this.readPt);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>      }<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span><a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>      // Here we separate all scanners into two lists - scanner that provide data required<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      // by the filter to operate (scanners list) and all others (joinedScanners list).<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>      List&lt;KeyValueScanner&gt; scanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>      List&lt;KeyValueScanner&gt; joinedScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>      if (additionalScanners != null) {<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>        scanners.addAll(additionalScanners);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>      }<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span><a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>      for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; entry : scan.getFamilyMap().entrySet()) {<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>        Store store = stores.get(entry.getKey());<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>        KeyValueScanner scanner;<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span>        try {<a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>          scanner = store.getScanner(scan, entry.getValue(), this.readPt);<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>        } catch (FileNotFoundException e) {<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>          throw handleFileNotFound(e);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>        }<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>        if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand()<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>          || this.filter.isFamilyEssential(entry.getKey())) {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>          scanners.add(scanner);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>        } else {<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>          joinedScanners.add(scanner);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>        }<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      }<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>      this.copyCellsFromSharedMem = copyCellsFromSharedMem;<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      initializeKVHeap(scanners, joinedScanners, region);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    }<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span><a name="line.5619"></a>
-<span class="sourceLineNo">5620</span>    protected void initializeKVHeap(List&lt;KeyValueScanner&gt; scanners,<a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>        List&lt;KeyValueScanner&gt; joinedScanners, HRegion region)<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>        throws IOException {<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      this.storeHeap = new KeyValueHeap(scanners, comparator);<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      if (!joinedScanners.isEmpty()) {<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>        this.joinedHeap = new KeyValueHeap(joinedScanners, comparator);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span>      }<a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    }<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span><a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    @Override<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    public long getMaxResultSize() {<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>      return maxResultSize;<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    @Override<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    public long getMvccReadPoint() {<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      return this.readPt;<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span>    }<a name="line.5637"></a>
-<span class="sourceLineNo">5638</span><a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>    @Override<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>    public int getBatch() {<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      return this.defaultScannerContext.getBatchLimit();<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>    }<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    /**<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>     * Reset both the filter and the old filter.<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>     *<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>     * @throws IOException in case a filter raises an I/O exception.<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>     */<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    protected void resetFilters() throws IOException {<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>      if (filter != null) {<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>        filter.reset();<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span>      }<a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    }<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span><a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    @Override<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>    public boolean next(List&lt;Cell&gt; outResults)<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>        throws IOException {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>      // apply the batching limit by default<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>      return next(outResults, defaultScannerContext);<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>    }<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span><a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    @Override<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    public synchronized boolean next(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    throws IOException {<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>      if (this.filterClosed) {<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>        throw new UnknownScannerException("Scanner was closed (timed out?) " +<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>            "after we renewed it. Could be caused by a very slow scanner " +<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>            "or a lengthy garbage collection");<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>      }<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>      startRegionOperation(Operation.SCAN);<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>      readRequestsCount.increment();<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>      try {<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>        return nextRaw(outResults, scannerContext);<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>      } finally {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>        closeRegionOperation(Operation.SCAN);<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>      }<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>    }<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span><a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    @Override<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    public boolean nextRaw(List&lt;Cell&gt; outResults) throws IOException {<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      // Use the RegionScanner's context by default<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return nextRaw(outResults, defaultScannerContext);<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span><a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>    @Override<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>    public boolean nextRaw(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        throws IOException {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>      if (storeHeap == null) {<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        // scanner is closed<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>        throw new UnknownScannerException("Scanner was closed");<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      }<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      boolean moreValues = false;<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      try {<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>        if (outResults.isEmpty()) {<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>          // Usually outResults is empty. This is true when next is called<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>          // to handle scan or get operation.<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>          moreValues = nextInternal(outResults, scannerContext);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        } else {<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>          List&lt;Cell&gt; tmpList = new ArrayList&lt;Cell&gt;();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>          moreValues = nextInternal(tmpList, scannerContext);<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>          outResults.addAll(tmpList);<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        }<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span><a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        // If the size limit was reached it means a partial Result is being<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>        // returned. Returning a<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        // partial Result means that we should not reset the filters; filters<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>        // should only be reset in<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>        // between rows<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>        if (!scannerContext.partialResultFormed()) resetFilters();<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span><a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>        if (isFilterDoneInternal()) {<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>          moreValues = false;<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>        }<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span><a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        // If copyCellsFromSharedMem = true, then we need to copy the cells. Otherwise<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>        // it is a call coming from the RsRpcServices.scan().<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        if (copyCellsFromSharedMem &amp;&amp; !outResults.isEmpty()) {<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>          // Do the copy of the results here.<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          ListIterator&lt;Cell&gt; listItr = outResults.listIterator();<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          Cell cell = null;<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          while (listItr.hasNext()) {<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>            cell = listItr.next();<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>            if (cell instanceof ShareableMemory) {<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>              listItr.set(((ShareableMemory) cell).cloneToCell());<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>            }<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>          }<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>        }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>      } finally {<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        if (copyCellsFromSharedMem) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          // In case of copyCellsFromSharedMem==true (where the CPs wrap a scanner) we return<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          // the blocks then and there (for wrapped CPs)<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>          this.shipped();<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>      return moreValues;<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    }<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    /**<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>     * @return true if more cells exist after this batch, false if scanner is done<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>     */<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>    private boolean populateFromJoinedHeap(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>            throws IOException {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      assert joinedContinuationRow != null;<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>      boolean moreValues = populateResult(results, this.joinedHeap, scannerContext,<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>          joinedContinuationRow);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      if (!scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>        // We are done with this row, reset the continuation.<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>        joinedContinuationRow = null;<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span>      }<a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>      // As the data is obtained from two independent heaps, we need to<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>      // ensure that result list is sorted, because Result relies on that.<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>      Collections.sort(results, comparator);<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>      return moreValues;<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>    }<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    /**<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>     * Fetches records with currentRow into results list, until next row, batchLimit (if not -1) is<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>     * reached, or remainingResultSize (if not -1) is reaced<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>     * @param heap KeyValueHeap to fetch data from.It must be positioned on correct row before call.<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>     * @param scannerContext<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>     * @param currentRowCell<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>     * @return state of last call to {@link KeyValueHeap#next()}<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>     */<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    private boolean populateResult(List&lt;Cell&gt; results, KeyValueHeap heap,<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>        ScannerContext scannerContext, Cell currentRowCell) throws IOException {<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      Cell nextKv;<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      boolean moreCellsInRow = false;<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      boolean tmpKeepProgress = scannerContext.getKeepProgress();<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      // Scanning between column families and thus the scope is between cells<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      LimitScope limitScope = LimitScope.BETWEEN_CELLS;<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      try {<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>        do {<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>          // We want to maintain any progress that is made towards the limits while scanning across<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>          // different column families. To do this, we toggle the keep progress flag on during calls<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>          // to the StoreScanner to ensure that any progress made thus far is not wiped away.<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>          scannerContext.setKeepProgress(true);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>          heap.next(results, scannerContext);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>          scannerContext.setKeepProgress(tmpKeepProgress);<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>          nextKv = heap.peek();<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>          moreCellsInRow = moreCellsInRow(nextKv, currentRowCell);<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>          if (!moreCellsInRow) incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>          if (scannerContext.checkBatchLimit(limitScope)) {<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>            return scannerContext.setScannerState(NextState.BATCH_LIMIT_REACHED).hasMoreValues();<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>          } else if (scannerContext.checkSizeLimit(limitScope)) {<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>            ScannerContext.NextState state =<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>              moreCellsInRow? NextState.SIZE_LIMIT_REACHED_MID_ROW: NextState.SIZE_LIMIT_REACHED;<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>          } else if (scannerContext.checkTimeLimit(limitScope)) {<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>            ScannerContext.NextState state =<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>              moreCellsInRow? NextState.TIME_LIMIT_REACHED_MID_ROW: NextState.TIME_LIMIT_REACHED;<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>          }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>        } while (moreCellsInRow);<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>      } catch (FileNotFoundException e) {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>        throw handleFileNotFound(e);<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>      }<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      return nextKv != null;<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    }<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span><a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    /**<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>     * Based on the nextKv in the heap, and the current row, decide whether or not there are more<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>     * cells to be read in the heap. If the row of the nextKv in the heap matches the current row<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>     * then there are more cells to be read in the row.<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>     * @param nextKv<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>     * @param currentRowCell<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>     * @return true When there are more cells in the row to be read<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>     */<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>    private boolean moreCellsInRow(final Cell nextKv, Cell currentRowCell) {<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      return nextKv != null &amp;&amp; CellUtil.matchingRow(nextKv, currentRowCell);<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>    }<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span><a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>    /*<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>     * @return True if a filter rules the scanner is over, done.<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>     */<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    @Override<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    public synchronized boolean isFilterDone() throws IOException {<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      return isFilterDoneInternal();<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    }<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span><a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>    private boolean isFilterDoneInternal() throws IOException {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      return this.filter != null &amp;&amp; this.filter.filterAllRemaining();<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>    }<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span><a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    private boolean nextInternal(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>        throws IOException {<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>      if (!results.isEmpty()) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>        throw new IllegalArgumentException("First parameter should be an empty list");<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>      }<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      if (scannerContext == null) {<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>        throw new IllegalArgumentException("Scanner context cannot be null");<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      RpcCallContext rpcCall = RpcServer.getCurrentCall();<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span><a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>      // Save the initial progress from the Scanner context in these local variables. The progress<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      // may need to be reset a few times if rows are being filtered out so we save the initial<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      // progress.<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      int initialBatchProgress = scannerContext.getBatchProgress();<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>      long initialSizeProgress = scannerContext.getSizeProgress();<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>      long initialTimeProgress = scannerContext.getTimeProgress();<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      // The loop here is used only when at some point during the next we determine<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      // that due to effects of filters or otherwise, we have an empty row in the result.<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>      // Then we loop and try again. Otherwise, we must get out on the first iteration via return,<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>      // "true" if there's more data to read, "false" if there isn't (storeHeap is at a stop row,<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>      // and joinedHeap has no more data to read for the last row (if set, joinedContinuationRow).<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>      while (true) {<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>        // Starting to scan a new row. Reset the scanner progress according to whether or not<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>        // progress should be kept.<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>        if (scannerContext.getKeepProgress()) {<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>          // Progress should be kept. Reset to initial values seen at start of method invocation.<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>          scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>            initialTimeProgress);<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        } else {<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>          scannerContext.clearProgress();<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        }<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>        if (rpcCall != null) {<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>          // If a user specifies a too-restrictive or too-slow scanner, the<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>          // client might time out and disconnect while the server side<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>          // is still processing the request. We should abort aggressively<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>          // in that case.<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>          long afterTime = rpcCall.disconnectSince();<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>          if (afterTime &gt;= 0) {<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>            throw new CallerDisconnectedException(<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>                "Aborting on region " + getRegionInfo().getRegionNameAsString() + ", call " +<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>                    this + " after " + afterTime + " ms, since " +<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>                    "caller disconnected");<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          }<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span><a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>        // Let's see what we have in the storeHeap.<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>        Cell current = this.storeHeap.peek();<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span><a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>        boolean stopRow = isStopRow(current);<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // When has filter row is true it means that the all the cells for a particular row must be<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        // read before a filtering decision can be made. This means that filters where hasFilterRow<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>        // run the risk of encountering out of memory errors in the case that they are applied to a<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>        // table that has very large rows.<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>        boolean hasFilterRow = this.filter != null &amp;&amp; this.filter.hasFilterRow();<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span><a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>        // If filter#hasFilterRow is true, partial results are not allowed since allowing them<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>        // would prevent the filters from being evaluated. Thus, if it is true, change the<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>        // scope of any limits that could potentially create partial results to<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>        // LimitScope.BETWEEN_ROWS so that those limits are not reached mid-row<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>        if (hasFilterRow) {<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>          if (LOG.isTraceEnabled()) {<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>            LOG.trace("filter#hasFilterRow is true which prevents partial results from being "<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>                + " formed. Changing scope of limits that may create partials");<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span>          }<a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>          scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>          scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>        }<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span><a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>        // Check if we were getting data from the joinedHeap and hit the limit.<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>        // If not, then it's main path - getting results from storeHeap.<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>        if (joinedContinuationRow == null) {<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>          // First, check if we are at a stop row. If so, there are no more results.<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>          if (stopRow) {<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>            if (hasFilterRow) {<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>              filter.filterRowCells(results);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>            }<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>          }<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span><a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>          // Check if rowkey filter wants to exclude this row. If so, loop to next.<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>          // Technically, if we hit limits before on this row, we don't need this call.<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>          if (filterRowKey(current)) {<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>            // Typically the count of rows scanned is incremented inside #populateResult. However,<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>            // here we are filtering a row based purely on its row key, preventing us from calling<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>            // #populateResult. Thus, perform the necessary increment here to rows scanned metric<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>            incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>            if (!moreRows) {<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>            }<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>            results.clear();<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>            continue;<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>          }<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span><a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>          // Ok, we are good, let's try to get some results from the main heap.<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>          populateResult(results, this.storeHeap, scannerContext, current);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>            if (hasFilterRow) {<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>              throw new IncompatibleFilterException(<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>                  "Filter whose hasFilterRow() returns true is incompatible with scans that must "<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>                      + " stop mid-row because of a limit. ScannerContext:" + scannerContext);<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>            }<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>            return true;<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>          }<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span><a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>          Cell nextKv = this.storeHeap.peek();<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>          stopRow = nextKv == null || isStopRow(nextKv);<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>          // save that the row was empty before filters applied to it.<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>          final boolean isEmptyRow = results.isEmpty();<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span><a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>          // We have the part of the row necessary for filtering (all of it, usually).<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>          // First filter with the filterRow(List).<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>          FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>          if (hasFilterRow) {<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>            ret = filter.filterRowCellsWithRet(results);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span><a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>            // We don't know how the results have changed after being filtered. Must set progress<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>            // according to contents of results now. However, a change in the results should not<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>            // affect the time progress. Thus preserve whatever time progress has been made<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>            long timeProgress = scannerContext.getTimeProgress();<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>            if (scannerContext.getKeepProgress()) {<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>              scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>                initialTimeProgress);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>            } else {<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>              scannerContext.clearProgress();<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>            }<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>            scannerContext.setTimeProgress(timeProgress);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>            scannerContext.incrementBatchProgress(results.size());<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>            for (Cell cell : results) {<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>              scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOf(cell));<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>            }<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>          }<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span><a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>          if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>            results.clear();<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>            if (!moreRows) {<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>            }<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>            // This row was totally filtered out, if this is NOT the last row,<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>            // we should continue on. Otherwise, nothing else to do.<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>            if (!stopRow) continue;<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>          }<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>          // Ok, we are done with storeHeap for this row.<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>          // Now we may need to fetch additional, non-essential data into row.<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>          // These values are not needed for filter to work, so we postpone their<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>          // fetch to (possibly) reduce amount of data loads from disk.<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>          if (this.joinedHeap != null) {<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>            boolean mayHaveData = joinedHeapMayHaveData(current);<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>            if (mayHaveData) {<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>              joinedContinuationRow = current;<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>              populateFromJoinedHeap(results, scannerContext);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span><a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>              if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>                return true;<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>              }<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>            }<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>          }<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>        } else {<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>          // Populating from the joined heap was stopped by limits, populate some more.<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>          populateFromJoinedHeap(results, scannerContext);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>            return true;<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>          }<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>        }<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>        // We may have just called populateFromJoinedMap and hit the limits. If that is<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>        // the case, we need to call it again on the next next() invocation.<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span>        if (joinedContinuationRow != null) {<a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>        }<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span><a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>        // Finally, we are done with both joinedHeap and storeHeap.<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>        // Double check to prevent empty rows from appearing in result. It could be<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>        // the case when SingleColumnValueExcludeFilter is used.<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>        if (results.isEmpty()) {<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>          incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>          boolean moreRows = nextRow(scannerContext, current);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>          if (!moreRows) {<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>          }<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>          if (!stopRow) continue;<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>        }<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>        if (stopRow) {<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>        } else {<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>        }<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      }<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    }<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span><a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    protected void incrementCountOfRowsFilteredMetric(ScannerContext scannerContext) {<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span><a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      scannerContext.getMetrics().countOfRowsFiltered.incrementAndGet();<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    }<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span><a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    protected void incrementCountOfRowsScannedMetric(ScannerContext scannerContext) {<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span><a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      scannerContext.getMetrics().countOfRowsScanned.incrementAndGet();<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    }<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span><a name="line.6036"></a>
-<span 

<TRUNCATED>

[27/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.html
index 704e192..e5d9af6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.html
@@ -92,2526 +92,2571 @@
 <span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.conf.ConfigurationObserver;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.exceptions.RegionMovedException;<a name="line.85"></a>
 <span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.User;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.io.BytesWritable;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.io.IntWritable;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.io.Writable;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.io.WritableUtils;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.util.StringUtils;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.htrace.TraceInfo;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import com.google.protobuf.BlockingService;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import com.google.protobuf.CodedInputStream;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import com.google.protobuf.Message;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import com.google.protobuf.ServiceException;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.140"></a>
-<span class="sourceLineNo">141</span> *<a name="line.141"></a>
-<span class="sourceLineNo">142</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.142"></a>
-<span class="sourceLineNo">143</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.143"></a>
-<span class="sourceLineNo">144</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.144"></a>
-<span class="sourceLineNo">145</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.145"></a>
-<span class="sourceLineNo">146</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.146"></a>
-<span class="sourceLineNo">147</span> * and loops till done.<a name="line.147"></a>
-<span class="sourceLineNo">148</span> *<a name="line.148"></a>
-<span class="sourceLineNo">149</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.149"></a>
-<span class="sourceLineNo">150</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.150"></a>
-<span class="sourceLineNo">151</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.151"></a>
-<span class="sourceLineNo">152</span> * and keep taking while the server is up.<a name="line.152"></a>
-<span class="sourceLineNo">153</span> *<a name="line.153"></a>
-<span class="sourceLineNo">154</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.154"></a>
-<span class="sourceLineNo">155</span> * queue for Responder to pull from and return result to client.<a name="line.155"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferInputStream;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.User;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.io.BytesWritable;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.io.IntWritable;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.io.Writable;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.io.WritableUtils;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.util.StringUtils;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.htrace.TraceInfo;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import com.google.protobuf.BlockingService;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import com.google.protobuf.CodedInputStream;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import com.google.protobuf.CodedOutputStream;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import com.google.protobuf.Message;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import com.google.protobuf.ServiceException;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.143"></a>
+<span class="sourceLineNo">144</span> *<a name="line.144"></a>
+<span class="sourceLineNo">145</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.145"></a>
+<span class="sourceLineNo">146</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.146"></a>
+<span class="sourceLineNo">147</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.147"></a>
+<span class="sourceLineNo">148</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.148"></a>
+<span class="sourceLineNo">149</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.149"></a>
+<span class="sourceLineNo">150</span> * and loops till done.<a name="line.150"></a>
+<span class="sourceLineNo">151</span> *<a name="line.151"></a>
+<span class="sourceLineNo">152</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.152"></a>
+<span class="sourceLineNo">153</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.153"></a>
+<span class="sourceLineNo">154</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.154"></a>
+<span class="sourceLineNo">155</span> * and keep taking while the server is up.<a name="line.155"></a>
 <span class="sourceLineNo">156</span> *<a name="line.156"></a>
-<span class="sourceLineNo">157</span> * @see RpcClientImpl<a name="line.157"></a>
-<span class="sourceLineNo">158</span> */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.159"></a>
-<span class="sourceLineNo">160</span>@InterfaceStability.Evolving<a name="line.160"></a>
-<span class="sourceLineNo">161</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      = new CallQueueTooBigException();<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final boolean authorize;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private boolean isSecurityEnabled;<a name="line.168"></a>
+<span class="sourceLineNo">157</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.157"></a>
+<span class="sourceLineNo">158</span> * queue for Responder to pull from and return result to client.<a name="line.158"></a>
+<span class="sourceLineNo">159</span> *<a name="line.159"></a>
+<span class="sourceLineNo">160</span> * @see RpcClientImpl<a name="line.160"></a>
+<span class="sourceLineNo">161</span> */<a name="line.161"></a>
+<span class="sourceLineNo">162</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.162"></a>
+<span class="sourceLineNo">163</span>@InterfaceStability.Evolving<a name="line.163"></a>
+<span class="sourceLineNo">164</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      = new CallQueueTooBigException();<a name="line.168"></a>
 <span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public static final byte CURRENT_VERSION = 0;<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<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>   * How many calls/handler are allowed in the queue.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * The maximum size that we can hold in the RPC queue<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private final IPCUtil ipcUtil;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    Server.class.getName());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  protected ServiceAuthorizationManager authManager;<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * after the call returns.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   */<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  protected final InetSocketAddress bindAddress;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  protected int port;                             // port we listen on<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private int readThreads;                        // number of read threads<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.210"></a>
-<span class="sourceLineNo">211</span>                                                  // which a client may be<a name="line.211"></a>
-<span class="sourceLineNo">212</span>                                                  // disconnected<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.213"></a>
-<span class="sourceLineNo">214</span>                                                  // connections after which we<a name="line.214"></a>
-<span class="sourceLineNo">215</span>                                                  // will start cleaning up idle<a name="line.215"></a>
-<span class="sourceLineNo">216</span>                                                  // connections<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.217"></a>
-<span class="sourceLineNo">218</span>                                                  // connections to nuke<a name="line.218"></a>
-<span class="sourceLineNo">219</span>                                                  // during a cleanup<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  protected MetricsHBaseServer metrics;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  protected final Configuration conf;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private int maxQueueSize;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  protected int socketSendBufferSize;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  volatile boolean running = true;<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>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * for business by the call to {@link #start()}.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  volatile boolean started = false;<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>   * This is a running count of the size of all outstanding calls by size.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  protected final Counter callQueueSize = new Counter();<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  //maintain a list<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  //of client connections<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private Listener listener = null;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  protected Responder responder = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  protected int numConnections = 0;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.261"></a>
+<span class="sourceLineNo">170</span>  private final boolean authorize;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private boolean isSecurityEnabled;<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public static final byte CURRENT_VERSION = 0;<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * How many calls/handler are allowed in the queue.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * The maximum size that we can hold in the RPC queue<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private final IPCUtil ipcUtil;<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    Server.class.getName());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  protected ServiceAuthorizationManager authManager;<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * after the call returns.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   */<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected final InetSocketAddress bindAddress;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected int port;                             // port we listen on<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  private int readThreads;                        // number of read threads<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.213"></a>
+<span class="sourceLineNo">214</span>                                                  // which a client may be<a name="line.214"></a>
+<span class="sourceLineNo">215</span>                                                  // disconnected<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.216"></a>
+<span class="sourceLineNo">217</span>                                                  // connections after which we<a name="line.217"></a>
+<span class="sourceLineNo">218</span>                                                  // will start cleaning up idle<a name="line.218"></a>
+<span class="sourceLineNo">219</span>                                                  // connections<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.220"></a>
+<span class="sourceLineNo">221</span>                                                  // connections to nuke<a name="line.221"></a>
+<span class="sourceLineNo">222</span>                                                  // during a cleanup<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected MetricsHBaseServer metrics;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  protected final Configuration conf;<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private int maxQueueSize;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  protected int socketSendBufferSize;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  volatile boolean running = true;<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * for business by the call to {@link #start()}.<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  volatile boolean started = false;<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  /**<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * This is a running count of the size of all outstanding calls by size.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  protected final Counter callQueueSize = new Counter();<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  //maintain a list<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  //of client connections<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private Listener listener = null;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  protected Responder responder = null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  protected int numConnections = 0;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  /** Default value for above params */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  private final int warnResponseTime;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private final int warnResponseSize;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  private final Server server;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  private final RpcScheduler scheduler;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>  private UserProvider userProvider;<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  private final BoundedByteBufferPool reservoir;<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * the result.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  class Call implements RpcCallContext {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    protected int id;                             // the client's call id<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    protected BlockingService service;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    protected MethodDescriptor md;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    protected RequestHeader header;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    protected Message param;                      // the parameter passed<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    // Optional cell data passed outside of protobufs.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    protected CellScanner cellScanner;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    protected Connection connection;              // connection to client<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    protected long timestamp;      // the time received when response is null<a name="line.295"></a>
-<span class="sourceLineNo">296</span>                                   // the time served when response is not null<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
-<span class="sourceLineNo">298</span>     * Chain of buffers to send as response.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>     */<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    protected BufferChain response;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    protected Responder responder;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    protected long size;                          // size of current call<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    protected boolean isError;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    protected TraceInfo tinfo;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    private ByteBuffer cellBlock = null;<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private User user;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private InetAddress remoteAddress;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RpcCallback callback;<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private long responseCellSize = 0;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private long responseBlockSize = 0;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private boolean retryImmediatelySupported;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.318"></a>
-<span class="sourceLineNo">319</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.id = id;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.service = service;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.md = md;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.header = header;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      this.param = param;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      this.cellScanner = cellScanner;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      this.connection = connection;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      this.timestamp = System.currentTimeMillis();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      this.response = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      this.responder = responder;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      this.isError = false;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.size = size;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.tinfo = tinfo;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.remoteAddress = remoteAddress;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.retryImmediatelySupported =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    /**<a name="line.340"></a>
-<span class="sourceLineNo">341</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.341"></a>
-<span class="sourceLineNo">342</span>     * cleanup.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>     */<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    void done() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        // Return buffer to reservoir now we are done with it.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        reservoir.putBuffer(this.cellBlock);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        this.cellBlock = null;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>    @Override<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    public String toString() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      return toShortString() + " param: " +<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        " connection: " + connection.toString();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>    protected RequestHeader getHeader() {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      return this.header;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    /*<a name="line.366"></a>
-<span class="sourceLineNo">367</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.367"></a>
-<span class="sourceLineNo">368</span>     * the payload of a command<a name="line.368"></a>
-<span class="sourceLineNo">369</span>     */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    String toShortString() {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      String serviceName = this.connection.service != null ?<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          " connection: " + connection.toString();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    String toTraceString() {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      String serviceName = this.connection.service != null ?<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return serviceName + "." + methodName;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      this.response = new BufferChain(response);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        Throwable t, String errorMsg) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      if (this.isError) return;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (t != null) this.isError = true;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      BufferChain bc = null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      try {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        // Presume it a pb Message.  Could be null.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        Message result = (Message)m;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        // Call id.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        headerBuilder.setCallId(this.id);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (t != null) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (t instanceof RegionMovedException) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.408"></a>
-<span class="sourceLineNo">409</span>            // any kind of payload.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          // Set the exception as the result of the method invocation.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        if (this.cellBlock != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        Message header = headerBuilder.build();<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>        // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        // one big byte array; save on allocations.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        ByteBuffer bbHeader = IPCUtil.getDelimitedMessageAsByteBuffer(header);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        ByteBuffer bbResult = IPCUtil.getDelimitedMessageAsByteBuffer(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        int totalSize = bbHeader.capacity() + (bbResult == null? 0: bbResult.limit()) +<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (this.cellBlock == null? 0: this.cellBlock.limit());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        ByteBuffer bbTotalSize = ByteBuffer.wrap(Bytes.toBytes(totalSize));<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        bc = new BufferChain(bbTotalSize, bbHeader, bbResult, this.cellBlock);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        if (connection.useWrap) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          bc = wrapWithSasl(bc);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      } catch (IOException e) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        LOG.warn("Exception while creating response " + e);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      this.response = bc;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (this.callback != null) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          this.callback.run();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        } catch (Exception e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          // Don't allow any exception here to kill this handler thread.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private BufferChain wrapWithSasl(BufferChain bc)<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        throws IOException {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      if (!this.connection.useSasl) return bc;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // Looks like no way around this; saslserver wants a byte array.  I have to make it one.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // THIS IS A BIG UGLY COPY.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      byte [] responseBytes = bc.getBytes();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      byte [] token;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // synchronization may be needed since there can be multiple Handler<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      // threads using saslServer to wrap responses.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      synchronized (connection.saslServer) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        token = connection.saslServer.wrap(responseBytes, 0, responseBytes.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      if (LOG.isTraceEnabled()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        LOG.trace("Adding saslServer wrapped token of size " + token.length<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            + " as call response.");<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>      ByteBuffer bbTokenLength = ByteBuffer.wrap(Bytes.toBytes(token.length));<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      ByteBuffer bbTokenBytes = ByteBuffer.wrap(token);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return new BufferChain(bbTokenLength, bbTokenBytes);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public boolean isClientCellBlockSupported() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      return this.connection != null &amp;&amp; this.connection.codec != null;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>    @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    public long disconnectSince() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (!connection.channel.isOpen()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        return System.currentTimeMillis() - timestamp;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      } else {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        return -1L;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>    public long getSize() {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      return this.size;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>    public long getResponseCellSize() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return responseCellSize;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    public void incrementResponseCellSize(long cellSize) {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      responseCellSize += cellSize;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    @Override<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    public long getResponseBlockSize() {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return responseBlockSize;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    @Override<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    public void incrementResponseBlockSize(long blockSize) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      responseBlockSize += blockSize;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    public synchronized void sendResponseIfReady() throws IOException {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.responder.doRespond(this);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    public UserGroupInformation getRemoteUser() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      return connection.ugi;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    @Override<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    public User getRequestUser() {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      return user;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    @Override<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    public String getRequestUserName() {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      User user = getRequestUser();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return user == null? null: user.getShortName();<a name="line.531"></a>
+<span class="sourceLineNo">263</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  /** Default value for above params */<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  private final int warnResponseTime;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  private final int warnResponseSize;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  private final Server server;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  private final RpcScheduler scheduler;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  private UserProvider userProvider;<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>  private final BoundedByteBufferPool reservoir;<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * the result.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  class Call implements RpcCallContext {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int id;                             // the client's call id<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    protected BlockingService service;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    protected MethodDescriptor md;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    protected RequestHeader header;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    protected Message param;                      // the parameter passed<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // Optional cell data passed outside of protobufs.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    protected CellScanner cellScanner;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    protected Connection connection;              // connection to client<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    protected long timestamp;      // the time received when response is null<a name="line.298"></a>
+<span class="sourceLineNo">299</span>                                   // the time served when response is not null<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    /**<a name="line.300"></a>
+<span class="sourceLineNo">301</span>     * Chain of buffers to send as response.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>     */<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    protected BufferChain response;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    protected Responder responder;<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    protected long size;                          // size of current call<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    protected boolean isError;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    protected TraceInfo tinfo;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    private ByteBuffer cellBlock = null;<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    private User user;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    private InetAddress remoteAddress;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    private RpcCallback callback;<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private long responseCellSize = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private long responseBlockSize = 0;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    private boolean retryImmediatelySupported;<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.321"></a>
+<span class="sourceLineNo">322</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.322"></a>
+<span class="sourceLineNo">323</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      this.id = id;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      this.service = service;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      this.md = md;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      this.header = header;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      this.param = param;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      this.cellScanner = cellScanner;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      this.connection = connection;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.timestamp = System.currentTimeMillis();<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.response = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      this.responder = responder;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      this.isError = false;<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      this.size = size;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.tinfo = tinfo;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.remoteAddress = remoteAddress;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.retryImmediatelySupported =<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    /**<a name="line.343"></a>
+<span class="sourceLineNo">344</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.344"></a>
+<span class="sourceLineNo">345</span>     * cleanup.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>     */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    void done() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        // Return buffer to reservoir now we are done with it.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        reservoir.putBuffer(this.cellBlock);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        this.cellBlock = null;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    @Override<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    public String toString() {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      return toShortString() + " param: " +<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        " connection: " + connection.toString();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    protected RequestHeader getHeader() {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      return this.header;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>    /*<a name="line.369"></a>
+<span class="sourceLineNo">370</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.370"></a>
+<span class="sourceLineNo">371</span>     * the payload of a command<a name="line.371"></a>
+<span class="sourceLineNo">372</span>     */<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    String toShortString() {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      String serviceName = this.connection.service != null ?<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          " connection: " + connection.toString();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    String toTraceString() {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      String serviceName = this.connection.service != null ?<a name="line.383"></a>
+<span class="sourceLineNo">384</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return serviceName + "." + methodName;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      this.response = new BufferChain(response);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        Throwable t, String errorMsg) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      if (this.isError) return;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      if (t != null) this.isError = true;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      BufferChain bc = null;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      try {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        // Presume it a pb Message.  Could be null.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        Message result = (Message)m;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        // Call id.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        headerBuilder.setCallId(this.id);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (t != null) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (t instanceof RegionMovedException) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            // any kind of payload.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          // Set the exception as the result of the method invocation.<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        if (this.cellBlock != null) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        Message header = headerBuilder.build();<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>        byte[] b = createHeaderAndMessageBytes(result, header);<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>        bc = new BufferChain(ByteBuffer.wrap(b), this.cellBlock);<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>        if (connection.useWrap) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          bc = wrapWithSasl(bc);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      } catch (IOException e) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        LOG.warn("Exception while creating response " + e);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      this.response = bc;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      if (this.callback != null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          this.callback.run();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        } catch (Exception e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          // Don't allow any exception here to kill this handler thread.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>    private byte[] createHeaderAndMessageBytes(Message result, Message header)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // one big byte array; save on allocations.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      int headerSerializedSize = 0, resultSerializedSize = 0, headerVintSize = 0,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          resultVintSize = 0;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (header != null) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        headerSerializedSize = header.getSerializedSize();<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        headerVintSize = CodedOutputStream.computeRawVarint32Size(headerSerializedSize);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (result != null) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        resultSerializedSize = result.getSerializedSize();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        resultVintSize = CodedOutputStream.computeRawVarint32Size(resultSerializedSize);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      // calculate the total size<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      int totalSize = headerSerializedSize + headerVintSize<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          + (resultSerializedSize + resultVintSize)<a name="line.472"></a>
+<span class="sourceLineNo">473</span>          + (this.cellBlock == null ? 0 : this.cellBlock.limit());<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // The byte[] should also hold the totalSize of the header, message and the cellblock<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      byte[] b = new byte[headerSerializedSize + headerVintSize + resultSerializedSize<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          + resultVintSize + Bytes.SIZEOF_INT];<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      // The RpcClient expects the int to be in a format that code be decoded by<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // the DataInputStream#readInt(). Hence going with the Bytes.toBytes(int)<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // form of writing int.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Bytes.putInt(b, 0, totalSize);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      CodedOutputStream cos = CodedOutputStream.newInstance(b, Bytes.SIZEOF_INT,<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          b.length - Bytes.SIZEOF_INT);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (header != null) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        cos.writeMessageNoTag(header);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      if (result != null) {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        cos.writeMessageNoTag(result);<a name="line.487"></a>
+<span clas

<TRUNCATED>

[45/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.html
index f3f982d..203f531 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.html
@@ -101,7 +101,7 @@
 <br>
 <pre><a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.LimitedPrivate.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.LimitedPrivate</a>(<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.LimitedPrivate.html#value()">value</a>={"Coprocesssor","Phoenix"})
 <a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Evolving.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceStability.Evolving</a>
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.161">RpcServer</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.164">RpcServer</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html" title="interface in org.apache.hadoop.hbase.ipc">RpcServerInterface</a>, <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html" title="interface in org.apache.hadoop.hbase.conf">ConfigurationObserver</a></pre>
 <div class="block">An RPC server that hosts protobuf described Services.
@@ -720,7 +720,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>public static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.163">LOG</a></pre>
+<pre>public static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.166">LOG</a></pre>
 </li>
 </ul>
 <a name="CALL_QUEUE_TOO_BIG_EXCEPTION">
@@ -729,7 +729,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>CALL_QUEUE_TOO_BIG_EXCEPTION</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CallQueueTooBigException.html" title="class in org.apache.hadoop.hbase">CallQueueTooBigException</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.164">CALL_QUEUE_TOO_BIG_EXCEPTION</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CallQueueTooBigException.html" title="class in org.apache.hadoop.hbase">CallQueueTooBigException</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.167">CALL_QUEUE_TOO_BIG_EXCEPTION</a></pre>
 </li>
 </ul>
 <a name="authorize">
@@ -738,7 +738,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>authorize</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.167">authorize</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.170">authorize</a></pre>
 </li>
 </ul>
 <a name="isSecurityEnabled">
@@ -747,7 +747,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>isSecurityEnabled</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.168">isSecurityEnabled</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.171">isSecurityEnabled</a></pre>
 </li>
 </ul>
 <a name="CURRENT_VERSION">
@@ -756,7 +756,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>CURRENT_VERSION</h4>
-<pre>public static final&nbsp;byte <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.170">CURRENT_VERSION</a></pre>
+<pre>public static final&nbsp;byte <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.173">CURRENT_VERSION</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.CURRENT_VERSION">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -766,7 +766,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>FALLBACK_TO_INSECURE_CLIENT_AUTH</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.175">FALLBACK_TO_INSECURE_CLIENT_AUTH</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.178">FALLBACK_TO_INSECURE_CLIENT_AUTH</a></pre>
 <div class="block">Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.FALLBACK_TO_INSECURE_CLIENT_AUTH">Constant Field Values</a></dd></dl>
 </li>
@@ -777,7 +777,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER</h4>
-<pre>static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.181">DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER</a></pre>
+<pre>static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.184">DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER</a></pre>
 <div class="block">How many calls/handler are allowed in the queue.</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER">Constant Field Values</a></dd></dl>
 </li>
@@ -788,7 +788,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MAX_CALLQUEUE_SIZE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.186">DEFAULT_MAX_CALLQUEUE_SIZE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.189">DEFAULT_MAX_CALLQUEUE_SIZE</a></pre>
 <div class="block">The maximum size that we can hold in the RPC queue</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.DEFAULT_MAX_CALLQUEUE_SIZE">Constant Field Values</a></dd></dl>
 </li>
@@ -799,7 +799,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>ipcUtil</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/IPCUtil.html" title="class in org.apache.hadoop.hbase.ipc">IPCUtil</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.188">ipcUtil</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/IPCUtil.html" title="class in org.apache.hadoop.hbase.ipc">IPCUtil</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.191">ipcUtil</a></pre>
 </li>
 </ul>
 <a name="AUTH_FAILED_FOR">
@@ -808,7 +808,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>AUTH_FAILED_FOR</h4>
-<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.190">AUTH_FAILED_FOR</a></pre>
+<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.193">AUTH_FAILED_FOR</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.AUTH_FAILED_FOR">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -818,7 +818,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>AUTH_SUCCESSFUL_FOR</h4>
-<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.191">AUTH_SUCCESSFUL_FOR</a></pre>
+<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.194">AUTH_SUCCESSFUL_FOR</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.AUTH_SUCCESSFUL_FOR">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -828,7 +828,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>AUDITLOG</h4>
-<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.192">AUDITLOG</a></pre>
+<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.195">AUDITLOG</a></pre>
 </li>
 </ul>
 <a name="secretManager">
@@ -837,7 +837,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>secretManager</h4>
-<pre>protected&nbsp;org.apache.hadoop.security.token.SecretManager&lt;org.apache.hadoop.security.token.TokenIdentifier&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.194">secretManager</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.security.token.SecretManager&lt;org.apache.hadoop.security.token.TokenIdentifier&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.197">secretManager</a></pre>
 </li>
 </ul>
 <a name="authManager">
@@ -846,7 +846,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>authManager</h4>
-<pre>protected&nbsp;org.apache.hadoop.security.authorize.ServiceAuthorizationManager <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.195">authManager</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.security.authorize.ServiceAuthorizationManager <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.198">authManager</a></pre>
 </li>
 </ul>
 <a name="CurCall">
@@ -855,7 +855,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>CurCall</h4>
-<pre>protected static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html?is-external=true" title="class or interface in java.lang">ThreadLocal</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.200">CurCall</a></pre>
+<pre>protected static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html?is-external=true" title="class or interface in java.lang">ThreadLocal</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.203">CurCall</a></pre>
 <div class="block">This is set to Call object before Handler invokes an RPC and ybdie
  after the call returns.</div>
 </li>
@@ -866,7 +866,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>MONITORED_RPC</h4>
-<pre>static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html?is-external=true" title="class or interface in java.lang">ThreadLocal</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredRPCHandler</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.203">MONITORED_RPC</a></pre>
+<pre>static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html?is-external=true" title="class or interface in java.lang">ThreadLocal</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredRPCHandler</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.206">MONITORED_RPC</a></pre>
 <div class="block">Keeps MonitoredRPCHandler per handler thread.</div>
 </li>
 </ul>
@@ -876,7 +876,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>bindAddress</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.206">bindAddress</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.209">bindAddress</a></pre>
 </li>
 </ul>
 <a name="port">
@@ -885,7 +885,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>port</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.207">port</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.210">port</a></pre>
 </li>
 </ul>
 <a name="address">
@@ -894,7 +894,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>address</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.208">address</a></pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.211">address</a></pre>
 </li>
 </ul>
 <a name="readThreads">
@@ -903,7 +903,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>readThreads</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.209">readThreads</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.212">readThreads</a></pre>
 </li>
 </ul>
 <a name="maxIdleTime">
@@ -912,7 +912,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>maxIdleTime</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.210">maxIdleTime</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.213">maxIdleTime</a></pre>
 </li>
 </ul>
 <a name="thresholdIdleConnections">
@@ -921,7 +921,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>thresholdIdleConnections</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.213">thresholdIdleConnections</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.216">thresholdIdleConnections</a></pre>
 </li>
 </ul>
 <a name="maxConnectionsToNuke">
@@ -930,7 +930,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>maxConnectionsToNuke</h4>
-<pre>int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.217">maxConnectionsToNuke</a></pre>
+<pre>int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.220">maxConnectionsToNuke</a></pre>
 </li>
 </ul>
 <a name="metrics">
@@ -939,7 +939,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>metrics</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServer.html" title="class in org.apache.hadoop.hbase.ipc">MetricsHBaseServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.221">metrics</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServer.html" title="class in org.apache.hadoop.hbase.ipc">MetricsHBaseServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.224">metrics</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -948,7 +948,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>protected final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.223">conf</a></pre>
+<pre>protected final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.226">conf</a></pre>
 </li>
 </ul>
 <a name="maxQueueSize">
@@ -957,7 +957,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>maxQueueSize</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.225">maxQueueSize</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.228">maxQueueSize</a></pre>
 </li>
 </ul>
 <a name="socketSendBufferSize">
@@ -966,7 +966,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>socketSendBufferSize</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.226">socketSendBufferSize</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.229">socketSendBufferSize</a></pre>
 </li>
 </ul>
 <a name="tcpNoDelay">
@@ -975,7 +975,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>tcpNoDelay</h4>
-<pre>protected final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.227">tcpNoDelay</a></pre>
+<pre>protected final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.230">tcpNoDelay</a></pre>
 </li>
 </ul>
 <a name="tcpKeepAlive">
@@ -984,7 +984,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>tcpKeepAlive</h4>
-<pre>protected final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.228">tcpKeepAlive</a></pre>
+<pre>protected final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.231">tcpKeepAlive</a></pre>
 </li>
 </ul>
 <a name="purgeTimeout">
@@ -993,7 +993,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>purgeTimeout</h4>
-<pre>protected final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.229">purgeTimeout</a></pre>
+<pre>protected final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.232">purgeTimeout</a></pre>
 </li>
 </ul>
 <a name="running">
@@ -1002,7 +1002,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>running</h4>
-<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.236">running</a></pre>
+<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.239">running</a></pre>
 <div class="block">This flag is used to indicate to sub threads when they should go down.  When we call
  <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.html#start()"><code>start()</code></a>, all threads started will consult this flag on whether they should
  keep going.  It is set to false when <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.html#stop()"><code>stop()</code></a> is called.</div>
@@ -1014,7 +1014,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>started</h4>
-<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.242">started</a></pre>
+<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.245">started</a></pre>
 <div class="block">This flag is set to true after all threads are up and 'running' and the server is then opened
  for business by the call to <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.html#start()"><code>start()</code></a>.</div>
 </li>
@@ -1025,7 +1025,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>callQueueSize</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Counter.html" title="class in org.apache.hadoop.hbase.util">Counter</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.247">callQueueSize</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Counter.html" title="class in org.apache.hadoop.hbase.util">Counter</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.250">callQueueSize</a></pre>
 <div class="block">This is a running count of the size of all outstanding calls by size.</div>
 </li>
 </ul>
@@ -1035,7 +1035,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>connectionList</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.249">connectionList</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.252">connectionList</a></pre>
 </li>
 </ul>
 <a name="listener">
@@ -1044,7 +1044,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>listener</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Listener.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Listener</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.253">listener</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Listener.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Listener</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.256">listener</a></pre>
 </li>
 </ul>
 <a name="responder">
@@ -1053,7 +1053,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>responder</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Responder.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Responder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.254">responder</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Responder.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Responder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.257">responder</a></pre>
 </li>
 </ul>
 <a name="authTokenSecretMgr">
@@ -1062,7 +1062,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>authTokenSecretMgr</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/token/AuthenticationTokenSecretManager.html" title="class in org.apache.hadoop.hbase.security.token">AuthenticationTokenSecretManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.255">authTokenSecretMgr</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/token/AuthenticationTokenSecretManager.html" title="class in org.apache.hadoop.hbase.security.token">AuthenticationTokenSecretManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.258">authTokenSecretMgr</a></pre>
 </li>
 </ul>
 <a name="numConnections">
@@ -1071,7 +1071,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>numConnections</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.256">numConnections</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.259">numConnections</a></pre>
 </li>
 </ul>
 <a name="errorHandler">
@@ -1080,7 +1080,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>errorHandler</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHandler.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRPCErrorHandler</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.258">errorHandler</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHandler.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRPCErrorHandler</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.261">errorHandler</a></pre>
 </li>
 </ul>
 <a name="WARN_RESPONSE_TIME">
@@ -1089,7 +1089,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>WARN_RESPONSE_TIME</h4>
-<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.260">WARN_RESPONSE_TIME</a></pre>
+<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.263">WARN_RESPONSE_TIME</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.WARN_RESPONSE_TIME">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -1099,7 +1099,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>WARN_RESPONSE_SIZE</h4>
-<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.261">WARN_RESPONSE_SIZE</a></pre>
+<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.264">WARN_RESPONSE_SIZE</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.WARN_RESPONSE_SIZE">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -1109,7 +1109,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WARN_RESPONSE_TIME</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.264">DEFAULT_WARN_RESPONSE_TIME</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.267">DEFAULT_WARN_RESPONSE_TIME</a></pre>
 <div class="block">Default value for above params</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.DEFAULT_WARN_RESPONSE_TIME">Constant Field Values</a></dd></dl>
 </li>
@@ -1120,7 +1120,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WARN_RESPONSE_SIZE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.265">DEFAULT_WARN_RESPONSE_SIZE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.268">DEFAULT_WARN_RESPONSE_SIZE</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.DEFAULT_WARN_RESPONSE_SIZE">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -1130,7 +1130,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>MAPPER</h4>
-<pre>private static final&nbsp;org.codehaus.jackson.map.ObjectMapper <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.267">MAPPER</a></pre>
+<pre>private static final&nbsp;org.codehaus.jackson.map.ObjectMapper <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.270">MAPPER</a></pre>
 </li>
 </ul>
 <a name="warnResponseTime">
@@ -1139,7 +1139,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>warnResponseTime</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.269">warnResponseTime</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.272">warnResponseTime</a></pre>
 </li>
 </ul>
 <a name="warnResponseSize">
@@ -1148,7 +1148,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>warnResponseSize</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.270">warnResponseSize</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.273">warnResponseSize</a></pre>
 </li>
 </ul>
 <a name="server">
@@ -1157,7 +1157,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>server</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Server.html" title="interface in org.apache.hadoop.hbase">Server</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.271">server</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Server.html" title="interface in org.apache.hadoop.hbase">Server</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.274">server</a></pre>
 </li>
 </ul>
 <a name="services">
@@ -1166,7 +1166,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>services</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.272">services</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.275">services</a></pre>
 </li>
 </ul>
 <a name="scheduler">
@@ -1175,7 +1175,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>scheduler</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcScheduler.html" title="class in org.apache.hadoop.hbase.ipc">RpcScheduler</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.274">scheduler</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcScheduler.html" title="class in org.apache.hadoop.hbase.ipc">RpcScheduler</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.277">scheduler</a></pre>
 </li>
 </ul>
 <a name="userProvider">
@@ -1184,7 +1184,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>userProvider</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/UserProvider.html" title="class in org.apache.hadoop.hbase.security">UserProvider</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.276">userProvider</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/UserProvider.html" title="class in org.apache.hadoop.hbase.security">UserProvider</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.279">userProvider</a></pre>
 </li>
 </ul>
 <a name="reservoir">
@@ -1193,7 +1193,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>reservoir</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/BoundedByteBufferPool.html" title="class in org.apache.hadoop.hbase.io">BoundedByteBufferPool</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.278">reservoir</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/BoundedByteBufferPool.html" title="class in org.apache.hadoop.hbase.io">BoundedByteBufferPool</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.281">reservoir</a></pre>
 </li>
 </ul>
 <a name="allowFallbackToSimpleAuth">
@@ -1202,7 +1202,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>allowFallbackToSimpleAuth</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.280">allowFallbackToSimpleAuth</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.283">allowFallbackToSimpleAuth</a></pre>
 </li>
 </ul>
 <a name="NIO_BUFFER_LIMIT">
@@ -1211,7 +1211,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockListLast">
 <li class="blockList">
 <h4>NIO_BUFFER_LIMIT</h4>
-<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2377">NIO_BUFFER_LIMIT</a></pre>
+<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2422">NIO_BUFFER_LIMIT</a></pre>
 <div class="block">When the read or write buffer size is larger than this limit, i/o will be
  done in chunks of this size. Most RPC requests and responses would be
  be smaller.</div>
@@ -1231,7 +1231,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RpcServer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.1997">RpcServer</a>(<a href="../../../../../org/apache/hadoop/hbase/Server.html" title="interface in org.apache.hadoop.hbase">Server</a>&nbsp;server,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2042">RpcServer</a>(<a href="../../../../../org/apache/hadoop/hbase/Server.html" title="interface in org.apache.hadoop.hbase">Server</a>&nbsp;server,
          <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
          <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt;&nbsp;services,
          <a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;bindAddress,
@@ -1259,7 +1259,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2055">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;newConf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2100">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;newConf)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html#onConfigurationChange(org.apache.hadoop.conf.Configuration)">ConfigurationObserver</a></code></strong></div>
 <div class="block">This method would be called by the <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
@@ -1275,7 +1275,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>initReconfigurable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2059">initReconfigurable</a>(org.apache.hadoop.conf.Configuration&nbsp;confToLoad)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2104">initReconfigurable</a>(org.apache.hadoop.conf.Configuration&nbsp;confToLoad)</pre>
 </li>
 </ul>
 <a name="getConnection(java.nio.channels.SocketChannel, long)">
@@ -1284,7 +1284,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getConnection</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2077">getConnection</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html?is-external=true" title="class or interface in java.nio.channels">SocketChannel</a>&nbsp;channel,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2122">getConnection</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html?is-external=true" title="class or interface in java.nio.channels">SocketChannel</a>&nbsp;channel,
                                  long&nbsp;time)</pre>
 <div class="block">Subclasses of HBaseServer can override this to provide their own
  Connection implementations.</div>
@@ -1296,7 +1296,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>setupResponse</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2089">setupResponse</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html?is-external=true" title="class or interface in java.io">ByteArrayOutputStream</a>&nbsp;response,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2134">setupResponse</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html?is-external=true" title="class or interface in java.io">ByteArrayOutputStream</a>&nbsp;response,
                  <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a>&nbsp;call,
                  <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;t,
                  <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;error)
@@ -1313,7 +1313,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>closeConnection</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2095">closeConnection</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&nbsp;connection)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2140">closeConnection</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&nbsp;connection)</pre>
 </li>
 </ul>
 <a name="getConf()">
@@ -1322,7 +1322,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getConf</h4>
-<pre>org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2104">getConf</a>()</pre>
+<pre>org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2149">getConf</a>()</pre>
 </li>
 </ul>
 <a name="setSocketSendBufSize(int)">
@@ -1331,7 +1331,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>setSocketSendBufSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2112">setSocketSendBufSize</a>(int&nbsp;size)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2157">setSocketSendBufSize</a>(int&nbsp;size)</pre>
 <div class="block">Sets the socket buffer size used for responding to RPCs.</div>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1345,7 +1345,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>isStarted</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2115">isStarted</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2160">isStarted</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html#isStarted()">isStarted</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html" title="interface in org.apache.hadoop.hbase.ipc">RpcServerInterface</a></code></dd>
@@ -1358,7 +1358,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2121">start</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2166">start</a>()</pre>
 <div class="block">Starts the service.  Must be called before any calls will be handled.</div>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1372,7 +1372,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshAuthManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2137">refreshAuthManager</a>(org.apache.hadoop.security.authorize.PolicyProvider&nbsp;pp)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2182">refreshAuthManager</a>(org.apache.hadoop.security.authorize.PolicyProvider&nbsp;pp)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html#refreshAuthManager(org.apache.hadoop.security.authorize.PolicyProvider)">RpcServerInterface</a></code></strong></div>
 <div class="block">Refresh authentication manager policy.</div>
 <dl>
@@ -1387,7 +1387,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>createSecretManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/token/AuthenticationTokenSecretManager.html" title="class in org.apache.hadoop.hbase.security.token">AuthenticationTokenSecretManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2143">createSecretManager</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/token/AuthenticationTokenSecretManager.html" title="class in org.apache.hadoop.hbase.security.token">AuthenticationTokenSecretManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2188">createSecretManager</a>()</pre>
 </li>
 </ul>
 <a name="getSecretManager()">
@@ -1396,7 +1396,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getSecretManager</h4>
-<pre>public&nbsp;org.apache.hadoop.security.token.SecretManager&lt;? extends org.apache.hadoop.security.token.TokenIdentifier&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2155">getSecretManager</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.security.token.SecretManager&lt;? extends org.apache.hadoop.security.token.TokenIdentifier&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2200">getSecretManager</a>()</pre>
 </li>
 </ul>
 <a name="setSecretManager(org.apache.hadoop.security.token.SecretManager)">
@@ -1405,7 +1405,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>setSecretManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2160">setSecretManager</a>(org.apache.hadoop.security.token.SecretManager&lt;? extends org.apache.hadoop.security.token.TokenIdentifier&gt;&nbsp;secretManager)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2205">setSecretManager</a>(org.apache.hadoop.security.token.SecretManager&lt;? extends org.apache.hadoop.security.token.TokenIdentifier&gt;&nbsp;secretManager)</pre>
 </li>
 </ul>
 <a name="call(com.google.protobuf.BlockingService, com.google.protobuf.Descriptors.MethodDescriptor, com.google.protobuf.Message, org.apache.hadoop.hbase.CellScanner, long, org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler)">
@@ -1414,7 +1414,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;com.google.protobuf.Message,<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2170">call</a>(com.google.protobuf.BlockingService&nbsp;service,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;com.google.protobuf.Message,<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2215">call</a>(com.google.protobuf.BlockingService&nbsp;service,
                                                  com.google.protobuf.Descriptors.MethodDescriptor&nbsp;md,
                                                  com.google.protobuf.Message&nbsp;param,
                                                  <a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;cellScanner,
@@ -1437,7 +1437,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>logResponse</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2244">logResponse</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&nbsp;params,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2289">logResponse</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&nbsp;params,
                <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;methodName,
                <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;call,
                <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tag,
@@ -1461,7 +1461,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2287">stop</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2332">stop</a>()</pre>
 <div class="block">Stops the service.  No new calls will be handled after this is called.</div>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1475,7 +1475,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>join</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2307">join</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2352">join</a>()
           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Wait for the server to be stopped.
  Does not wait for all subthreads to finish.
@@ -1493,7 +1493,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getListenerAddress</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2320">getListenerAddress</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2365">getListenerAddress</a>()</pre>
 <div class="block">Return the socket (ip+port) on which the RPC server is listening to. May return null if
  the listener channel is closed.</div>
 <dl>
@@ -1509,7 +1509,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>setErrorHandler</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2332">setErrorHandler</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHandler.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRPCErrorHandler</a>&nbsp;handler)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2377">setErrorHandler</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHandler.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRPCErrorHandler</a>&nbsp;handler)</pre>
 <div class="block">Set the handler for calling out of RPC for error conditions.</div>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1523,7 +1523,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getErrorHandler</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHandler.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRPCErrorHandler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2337">getErrorHandler</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHandler.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRPCErrorHandler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2382">getErrorHandler</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html#getErrorHandler()">getErrorHandler</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html" title="interface in org.apache.hadoop.hbase.ipc">RpcServerInterface</a></code></dd>
@@ -1536,7 +1536,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetrics</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServer.html" title="class in org.apache.hadoop.hbase.ipc">MetricsHBaseServer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2345">getMetrics</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServer.html" title="class in org.apache.hadoop.hbase.ipc">MetricsHBaseServer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2390">getMetrics</a>()</pre>
 <div class="block">Returns the metrics instance for reporting RPC call statistics</div>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -1550,7 +1550,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>addCallSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2350">addCallSize</a>(long&nbsp;diff)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2395">addCallSize</a>(long&nbsp;diff)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html#addCallSize(long)">RpcServerInterface</a></code></strong></div>
 <div class="block">Add/subtract from the current size of all outstanding calls.  Called on setup of a call to add
  call total size and then again at end of a call to remove the call size.</div>
@@ -1566,7 +1566,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>authorize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2363">authorize</a>(org.apache.hadoop.security.UserGroupInformation&nbsp;user,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2408">authorize</a>(org.apache.hadoop.security.UserGroupInformation&nbsp;user,
              org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader&nbsp;connection,
              <a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;addr)
                throws org.apache.hadoop.security.authorize.AuthorizationException</pre>
@@ -1582,7 +1582,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>channelWrite</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2393">channelWrite</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/GatheringByteChannel.html?is-external=true" title="class or interface in java.nio.channels">GatheringByteChannel</a>&nbsp;channel,
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2438">channelWrite</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/GatheringByteChannel.html?is-external=true" title="class or interface in java.nio.channels">GatheringByteChannel</a>&nbsp;channel,
                 <a href="../../../../../org/apache/hadoop/hbase/ipc/BufferChain.html" title="class in org.apache.hadoop.hbase.ipc">BufferChain</a>&nbsp;bufferChain)
                      throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This is a wrapper around <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/WritableByteChannel.html?is-external=true#write(java.nio.ByteBuffer)" title="class or interface in java.nio.channels"><code>WritableByteChannel.write(java.nio.ByteBuffer)</code></a>.
@@ -1603,7 +1603,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>channelRead</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2412">channelRead</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/ReadableByteChannel.html?is-external=true" title="class or interface in java.nio.channels">ReadableByteChannel</a>&nbsp;channel,
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2457">channelRead</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/ReadableByteChannel.html?is-external=true" title="class or interface in java.nio.channels">ReadableByteChannel</a>&nbsp;channel,
               <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buffer)
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This is a wrapper around <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/ReadableByteChannel.html?is-external=true#read(java.nio.ByteBuffer)" title="class or interface in java.nio.channels"><code>ReadableByteChannel.read(java.nio.ByteBuffer)</code></a>.
@@ -1622,7 +1622,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>channelIO</h4>
-<pre>private static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2436">channelIO</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/ReadableByteChannel.html?is-external=true" title="class or interface in java.nio.channels">ReadableByteChannel</a>&nbsp;readCh,
+<pre>private static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2481">channelIO</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/ReadableByteChannel.html?is-external=true" title="class or interface in java.nio.channels">ReadableByteChannel</a>&nbsp;readCh,
             <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/WritableByteChannel.html?is-external=true" title="class or interface in java.nio.channels">WritableByteChannel</a>&nbsp;writeCh,
             <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf)
                       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -1642,7 +1642,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentCall</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2470">getCurrentCall</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2515">getCurrentCall</a>()</pre>
 <div class="block">Needed for features such as delayed calls.  We need to be able to store the current call
  so that we can complete it later or ask questions of what is supported by the current ongoing
  call.</div>
@@ -1655,7 +1655,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>isInRpcCallContext</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2474">isInRpcCallContext</a>()</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2519">isInRpcCallContext</a>()</pre>
 </li>
 </ul>
 <a name="getRequestUser()">
@@ -1664,7 +1664,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getRequestUser</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2483">getRequestUser</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2528">getRequestUser</a>()</pre>
 <div class="block">Returns the user credentials associated with the current RPC request or
  <code>null</code> if no credentials were provided.</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>A User</dd></dl>
@@ -1676,7 +1676,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getRequestUserName</h4>
-<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2492">getRequestUserName</a>()</pre>
+<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2537">getRequestUserName</a>()</pre>
 <div class="block">Returns the username for any user associated with the current RPC
  request or <code>null</code> if no user is set.</div>
 </li>
@@ -1687,7 +1687,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getRemoteAddress</h4>
-<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2500">getRemoteAddress</a>()</pre>
+<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2545">getRemoteAddress</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>Address of remote client if a request is ongoing, else null</dd></dl>
 </li>
 </ul>
@@ -1697,7 +1697,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getServiceAndInterface</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2510">getServiceAndInterface</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt;&nbsp;services,
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2555">getServiceAndInterface</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt;&nbsp;services,
                                                            <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serviceName)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>serviceName</code> - Some arbitrary string that represents a 'service'.</dd><dd><code>services</code> - Available service instances</dd>
 <dt><span class="strong">Returns:</span></dt><dd>Matching BlockingServiceAndInterface pair</dd></dl>
@@ -1709,7 +1709,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getServiceInterface</h4>
-<pre>static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2525">getServiceInterface</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt;&nbsp;services,
+<pre>static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2570">getServiceInterface</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt;&nbsp;services,
                            <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serviceName)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>serviceName</code> - Some arbitrary string that represents a 'service'.</dd><dd><code>services</code> - Available services and their service interfaces.</dd>
 <dt><span class="strong">Returns:</span></dt><dd>Service interface class for <code>serviceName</code></dd></dl>
@@ -1721,7 +1721,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getService</h4>
-<pre>static&nbsp;com.google.protobuf.BlockingService&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2538">getService</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt;&nbsp;services,
+<pre>static&nbsp;com.google.protobuf.BlockingService&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2583">getService</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt;&nbsp;services,
                                              <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serviceName)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>serviceName</code> - Some arbitrary string that represents a 'service'.</dd><dd><code>services</code> - Available services and their service interfaces.</dd>
 <dt><span class="strong">Returns:</span></dt><dd>BlockingService that goes with the passed <code>serviceName</code></dd></dl>
@@ -1733,7 +1733,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getStatus</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredRPCHandler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2546">getStatus</a>()</pre>
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredRPCHandler.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredRPCHandler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2591">getStatus</a>()</pre>
 </li>
 </ul>
 <a name="getRemoteIp()">
@@ -1742,7 +1742,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>getRemoteIp</h4>
-<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2562">getRemoteIp</a>()</pre>
+<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2607">getRemoteIp</a>()</pre>
 <div class="block">Returns the remote side ip address when invoked inside an RPC
   Returns null incase of an error.</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>InetAddress</dd></dl>
@@ -1754,7 +1754,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockList">
 <li class="blockList">
 <h4>bind</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2581">bind</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html?is-external=true" title="class or interface in java.net">ServerSocket</a>&nbsp;socket,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2626">bind</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html?is-external=true" title="class or interface in java.net">ServerSocket</a>&nbsp;socket,
         <a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;address,
         int&nbsp;backlog)
                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -1773,7 +1773,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterfac
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getScheduler</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcScheduler.html" title="class in org.apache.hadoop.hbase.ipc">RpcScheduler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2603">getScheduler</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcScheduler.html" title="class in org.apache.hadoop.hbase.ipc">RpcScheduler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.2648">getScheduler</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html#getScheduler()">getScheduler</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServerInterface.html" title="interface in org.apache.hadoop.hbase.ipc">RpcServerInterface</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 29ae491..f9ba087 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -267,8 +267,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">CellCounter.CellCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">SyncTable.SyncMapper.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">CellCounter.CellCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">TableSplit.Version</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">RowCounter.RowCounterMapper.Counters</span></a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html b/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
index b85b665..92c96b7 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.285">CatalogJanitor.SplitParentFirstComparator</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.html#line.289">CatalogJanitor.SplitParentFirstComparator</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;</pre>
 <div class="block">Compare HRegionInfos in a way that has split parents sort BEFORE their
@@ -202,7 +202,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Comparato
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rowEndKeyComparator</h4>
-<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;byte[]&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.286">rowEndKeyComparator</a></pre>
+<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;byte[]&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.290">rowEndKeyComparator</a></pre>
 </li>
 </ul>
 </li>
@@ -219,7 +219,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Comparato
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CatalogJanitor.SplitParentFirstComparator</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.285">CatalogJanitor.SplitParentFirstComparator</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.289">CatalogJanitor.SplitParentFirstComparator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -236,7 +236,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Comparato
 <ul class="blockListLast">
 <li class="blockList">
 <h4>compare</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.288">compare</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;left,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/CatalogJanitor.SplitParentFirstComparator.html#line.292">compare</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;left,
           <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;right)</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>


[46/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html
index 061be46..42d21d8 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.1182">RpcServer.Connection</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.1223">RpcServer.Connection</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Reads calls from a connection and queues them for handling.</div>
 </li>
@@ -376,15 +376,15 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processConnectionHeader(byte[])">processConnectionHeader</a></strong>(byte[]&nbsp;buf)</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processConnectionHeader(java.nio.ByteBuffer)">processConnectionHeader</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processOneRpc(byte[])">processOneRpc</a></strong>(byte[]&nbsp;buf)</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processOneRpc(java.nio.ByteBuffer)">processOneRpc</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processRequest(byte[])">processRequest</a></strong>(byte[]&nbsp;buf)</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processRequest(java.nio.ByteBuffer)">processRequest</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
@@ -406,7 +406,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#saslReadAndProcess(byte[])">saslReadAndProcess</a></strong>(byte[]&nbsp;saslToken)</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#saslReadAndProcess(java.nio.ByteBuffer)">saslReadAndProcess</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;saslToken)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
@@ -454,7 +454,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>connectionPreambleRead</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1184">connectionPreambleRead</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1225">connectionPreambleRead</a></pre>
 </li>
 </ul>
 <a name="connectionHeaderRead">
@@ -463,7 +463,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>connectionHeaderRead</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1186">connectionHeaderRead</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1227">connectionHeaderRead</a></pre>
 </li>
 </ul>
 <a name="channel">
@@ -472,7 +472,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>channel</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html?is-external=true" title="class or interface in java.nio.channels">SocketChannel</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1187">channel</a></pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html?is-external=true" title="class or interface in java.nio.channels">SocketChannel</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1228">channel</a></pre>
 </li>
 </ul>
 <a name="data">
@@ -481,7 +481,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>data</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1188">data</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1229">data</a></pre>
 </li>
 </ul>
 <a name="dataLengthBuffer">
@@ -490,7 +490,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>dataLengthBuffer</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1189">dataLengthBuffer</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1230">dataLengthBuffer</a></pre>
 </li>
 </ul>
 <a name="responseQueue">
@@ -499,7 +499,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>responseQueue</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedDeque.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentLinkedDeque</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1190">responseQueue</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedDeque.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentLinkedDeque</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1231">responseQueue</a></pre>
 </li>
 </ul>
 <a name="responseWriteLock">
@@ -508,7 +508,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>responseWriteLock</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1191">responseWriteLock</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1232">responseWriteLock</a></pre>
 </li>
 </ul>
 <a name="rpcCount">
@@ -517,7 +517,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcCount</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Counter.html" title="class in org.apache.hadoop.hbase.util">Counter</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1192">rpcCount</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Counter.html" title="class in org.apache.hadoop.hbase.util">Counter</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1233">rpcCount</a></pre>
 </li>
 </ul>
 <a name="lastContact">
@@ -526,7 +526,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>lastContact</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1193">lastContact</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1234">lastContact</a></pre>
 </li>
 </ul>
 <a name="addr">
@@ -535,7 +535,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>addr</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1194">addr</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1235">addr</a></pre>
 </li>
 </ul>
 <a name="socket">
@@ -544,7 +544,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>socket</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html?is-external=true" title="class or interface in java.net">Socket</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1195">socket</a></pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html?is-external=true" title="class or interface in java.net">Socket</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1236">socket</a></pre>
 </li>
 </ul>
 <a name="hostAddress">
@@ -553,7 +553,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>hostAddress</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1198">hostAddress</a></pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1239">hostAddress</a></pre>
 </li>
 </ul>
 <a name="remotePort">
@@ -562,7 +562,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>remotePort</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1199">remotePort</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1240">remotePort</a></pre>
 </li>
 </ul>
 <a name="connectionHeader">
@@ -571,7 +571,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>connectionHeader</h4>
-<pre>org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1200">connectionHeader</a></pre>
+<pre>org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1241">connectionHeader</a></pre>
 </li>
 </ul>
 <a name="codec">
@@ -580,7 +580,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>codec</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec">Codec</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1204">codec</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec">Codec</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1245">codec</a></pre>
 <div class="block">Codec the client asked use.</div>
 </li>
 </ul>
@@ -590,7 +590,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>compressionCodec</h4>
-<pre>private&nbsp;org.apache.hadoop.io.compress.CompressionCodec <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1208">compressionCodec</a></pre>
+<pre>private&nbsp;org.apache.hadoop.io.compress.CompressionCodec <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1249">compressionCodec</a></pre>
 <div class="block">Compression codec the client asked us use.</div>
 </li>
 </ul>
@@ -600,7 +600,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>service</h4>
-<pre>com.google.protobuf.BlockingService <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1209">service</a></pre>
+<pre>com.google.protobuf.BlockingService <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1250">service</a></pre>
 </li>
 </ul>
 <a name="authMethod">
@@ -609,7 +609,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>authMethod</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security">AuthMethod</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1211">authMethod</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security">AuthMethod</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1252">authMethod</a></pre>
 </li>
 </ul>
 <a name="saslContextEstablished">
@@ -618,7 +618,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>saslContextEstablished</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1212">saslContextEstablished</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1253">saslContextEstablished</a></pre>
 </li>
 </ul>
 <a name="skipInitialSaslHandshake">
@@ -627,7 +627,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>skipInitialSaslHandshake</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1213">skipInitialSaslHandshake</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1254">skipInitialSaslHandshake</a></pre>
 </li>
 </ul>
 <a name="unwrappedData">
@@ -636,7 +636,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>unwrappedData</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1214">unwrappedData</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1255">unwrappedData</a></pre>
 </li>
 </ul>
 <a name="unwrappedDataLengthBuffer">
@@ -645,7 +645,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>unwrappedDataLengthBuffer</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1216">unwrappedDataLengthBuffer</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1257">unwrappedDataLengthBuffer</a></pre>
 </li>
 </ul>
 <a name="useSasl">
@@ -654,7 +654,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>useSasl</h4>
-<pre>boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1217">useSasl</a></pre>
+<pre>boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1258">useSasl</a></pre>
 </li>
 </ul>
 <a name="saslServer">
@@ -663,7 +663,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>saslServer</h4>
-<pre><a href="http://docs.oracle.com/javase/7/docs/api/javax/security/sasl/SaslServer.html?is-external=true" title="class or interface in javax.security.sasl">SaslServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1218">saslServer</a></pre>
+<pre><a href="http://docs.oracle.com/javase/7/docs/api/javax/security/sasl/SaslServer.html?is-external=true" title="class or interface in javax.security.sasl">SaslServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1259">saslServer</a></pre>
 </li>
 </ul>
 <a name="useWrap">
@@ -672,7 +672,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>useWrap</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1219">useWrap</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1260">useWrap</a></pre>
 </li>
 </ul>
 <a name="AUTHORIZATION_FAILED_CALLID">
@@ -681,7 +681,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>AUTHORIZATION_FAILED_CALLID</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1221">AUTHORIZATION_FAILED_CALLID</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1262">AUTHORIZATION_FAILED_CALLID</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.Connection.AUTHORIZATION_FAILED_CALLID">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -691,7 +691,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>authFailedCall</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1222">authFailedCall</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1263">authFailedCall</a></pre>
 </li>
 </ul>
 <a name="authFailedResponse">
@@ -700,7 +700,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>authFailedResponse</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html?is-external=true" title="class or interface in java.io">ByteArrayOutputStream</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1224">authFailedResponse</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html?is-external=true" title="class or interface in java.io">ByteArrayOutputStream</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1265">authFailedResponse</a></pre>
 </li>
 </ul>
 <a name="SASL_CALLID">
@@ -709,7 +709,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>SASL_CALLID</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1227">SASL_CALLID</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1268">SASL_CALLID</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.RpcServer.Connection.SASL_CALLID">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -719,7 +719,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>saslCall</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1228">saslCall</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1269">saslCall</a></pre>
 </li>
 </ul>
 <a name="authenticatedWithFallback">
@@ -728,7 +728,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>authenticatedWithFallback</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1232">authenticatedWithFallback</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1273">authenticatedWithFallback</a></pre>
 </li>
 </ul>
 <a name="retryImmediatelySupported">
@@ -737,7 +737,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>retryImmediatelySupported</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1234">retryImmediatelySupported</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1275">retryImmediatelySupported</a></pre>
 </li>
 </ul>
 <a name="attemptingUser">
@@ -746,7 +746,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>attemptingUser</h4>
-<pre>public&nbsp;org.apache.hadoop.security.UserGroupInformation <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1236">attemptingUser</a></pre>
+<pre>public&nbsp;org.apache.hadoop.security.UserGroupInformation <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1277">attemptingUser</a></pre>
 </li>
 </ul>
 <a name="user">
@@ -755,7 +755,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>user</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1237">user</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1278">user</a></pre>
 </li>
 </ul>
 <a name="ugi">
@@ -764,7 +764,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ugi</h4>
-<pre>protected&nbsp;org.apache.hadoop.security.UserGroupInformation <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1238">ugi</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.security.UserGroupInformation <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1279">ugi</a></pre>
 </li>
 </ul>
 </li>
@@ -781,7 +781,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RpcServer.Connection</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1240">RpcServer.Connection</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html?is-external=true" title="class or interface in java.nio.channels">SocketChannel</a>&nbsp;channel,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1281">RpcServer.Connection</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html?is-external=true" title="class or interface in java.nio.channels">SocketChannel</a>&nbsp;channel,
                     long&nbsp;lastContact)</pre>
 </li>
 </ul>
@@ -799,7 +799,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1264">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1305">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -812,7 +812,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getHostAddress</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1268">getHostAddress</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1309">getHostAddress</a>()</pre>
 </li>
 </ul>
 <a name="getHostInetAddress()">
@@ -821,7 +821,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getHostInetAddress</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1272">getHostInetAddress</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1313">getHostInetAddress</a>()</pre>
 </li>
 </ul>
 <a name="getRemotePort()">
@@ -830,7 +830,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRemotePort</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1276">getRemotePort</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1317">getRemotePort</a>()</pre>
 </li>
 </ul>
 <a name="setLastContact(long)">
@@ -839,7 +839,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setLastContact</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1280">setLastContact</a>(long&nbsp;lastContact)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1321">setLastContact</a>(long&nbsp;lastContact)</pre>
 </li>
 </ul>
 <a name="getVersionInfo()">
@@ -848,7 +848,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getVersionInfo</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1284">getVersionInfo</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1325">getVersionInfo</a>()</pre>
 </li>
 </ul>
 <a name="isIdle()">
@@ -857,7 +857,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>isIdle</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1292">isIdle</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1333">isIdle</a>()</pre>
 </li>
 </ul>
 <a name="decRpcCount()">
@@ -866,7 +866,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>decRpcCount</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1297">decRpcCount</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1338">decRpcCount</a>()</pre>
 </li>
 </ul>
 <a name="incRpcCount()">
@@ -875,7 +875,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>incRpcCount</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1302">incRpcCount</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1343">incRpcCount</a>()</pre>
 </li>
 </ul>
 <a name="timedOut(long)">
@@ -884,7 +884,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>timedOut</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1306">timedOut</a>(long&nbsp;currentTime)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1347">timedOut</a>(long&nbsp;currentTime)</pre>
 </li>
 </ul>
 <a name="getAuthorizedUgi(java.lang.String)">
@@ -893,19 +893,19 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getAuthorizedUgi</h4>
-<pre>private&nbsp;org.apache.hadoop.security.UserGroupInformation&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1310">getAuthorizedUgi</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;authorizedId)
+<pre>private&nbsp;org.apache.hadoop.security.UserGroupInformation&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1351">getAuthorizedUgi</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;authorizedId)
                                                                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
 </li>
 </ul>
-<a name="saslReadAndProcess(byte[])">
+<a name="saslReadAndProcess(java.nio.ByteBuffer)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>saslReadAndProcess</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1329">saslReadAndProcess</a>(byte[]&nbsp;saslToken)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1370">saslReadAndProcess</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;saslToken)
                          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                 <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -919,7 +919,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>doRawSaslReply</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1437">doRawSaslReply</a>(<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security">SaslStatus</a>&nbsp;status,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1479">doRawSaslReply</a>(<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security">SaslStatus</a>&nbsp;status,
                   org.apache.hadoop.io.Writable&nbsp;rv,
                   <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;errorClass,
                   <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;error)
@@ -935,7 +935,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>disposeSasl</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1466">disposeSasl</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1508">disposeSasl</a>()</pre>
 </li>
 </ul>
 <a name="readPreamble()">
@@ -944,7 +944,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>readPreamble</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1477">readPreamble</a>()
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1519">readPreamble</a>()
                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -956,7 +956,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>read4Bytes</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1533">read4Bytes</a>()
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1575">read4Bytes</a>()
                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -968,7 +968,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>readAndProcess</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1549">readAndProcess</a>()
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1591">readAndProcess</a>()
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                           <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Read off the wire. If there is not enough data to read, update the connection state with
@@ -985,7 +985,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>process</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1607">process</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1651">process</a>()
               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                      <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Process the data buffer and clean the connection state for the next call.</div>
@@ -1000,7 +1000,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getFatalConnectionString</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1627">getFatalConnectionString</a>(int&nbsp;version,
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1671">getFatalConnectionString</a>(int&nbsp;version,
                               byte&nbsp;authByte)</pre>
 </li>
 </ul>
@@ -1010,7 +1010,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>doBadPreambleHandling</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1633">doBadPreambleHandling</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1677">doBadPreambleHandling</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)
                            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -1022,20 +1022,20 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>doBadPreambleHandling</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1637">doBadPreambleHandling</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg,
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1681">doBadPreambleHandling</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg,
                         <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)
                            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
 </li>
 </ul>
-<a name="processConnectionHeader(byte[])">
+<a name="processConnectionHeader(java.nio.ByteBuffer)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>processConnectionHeader</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1647">processConnectionHeader</a>(byte[]&nbsp;buf)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1691">processConnectionHeader</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf)
                               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -1047,7 +1047,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setupCellBlockCodecs</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1710">setupCellBlockCodecs</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader&nbsp;header)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1755">setupCellBlockCodecs</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader&nbsp;header)
                            throws <a href="../../../../../org/apache/hadoop/hbase/ipc/FatalConnectionException.html" title="class in org.apache.hadoop.hbase.ipc">FatalConnectionException</a></pre>
 <div class="block">Set up cell block codecs</div>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -1060,7 +1060,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>processUnwrappedData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1730">processUnwrappedData</a>(byte[]&nbsp;inBuf)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1775">processUnwrappedData</a>(byte[]&nbsp;inBuf)
                            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                   <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -1068,13 +1068,13 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd></dl>
 </li>
 </ul>
-<a name="processOneRpc(byte[])">
+<a name="processOneRpc(java.nio.ByteBuffer)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>processOneRpc</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1768">processOneRpc</a>(byte[]&nbsp;buf)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1814">processOneRpc</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf)
                     throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                            <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -1082,13 +1082,13 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd></dl>
 </li>
 </ul>
-<a name="processRequest(byte[])">
+<a name="processRequest(java.nio.ByteBuffer)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>processRequest</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1790">processRequest</a>(byte[]&nbsp;buf)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1836">processRequest</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;buf)
                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                               <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>buf</code> - Has the request header and the request param and optionally encoded data buffer
@@ -1104,7 +1104,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>authorizeConnection</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1890">authorizeConnection</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1935">authorizeConnection</a>()
                              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -1116,7 +1116,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1915">close</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1960">close</a>()</pre>
 </li>
 </ul>
 <a name="createUser(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader)">
@@ -1125,7 +1125,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createUser</h4>
-<pre>private&nbsp;org.apache.hadoop.security.UserGroupInformation&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1937">createUser</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader&nbsp;head)</pre>
+<pre>private&nbsp;org.apache.hadoop.security.UserGroupInformation&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#line.1982">createUser</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader&nbsp;head)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html
index 557bcf7..0beff13 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.604">RpcServer.Listener.Reader</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.644">RpcServer.Listener.Reader</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></pre>
 </li>
@@ -215,7 +215,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>adding</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.605">adding</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.645">adding</a></pre>
 </li>
 </ul>
 <a name="readSelector">
@@ -224,7 +224,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>readSelector</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/Selector.html?is-external=true" title="class or interface in java.nio.channels">Selector</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.606">readSelector</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/Selector.html?is-external=true" title="class or interface in java.nio.channels">Selector</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.646">readSelector</a></pre>
 </li>
 </ul>
 </li>
@@ -241,7 +241,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RpcServer.Listener.Reader</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.608">RpcServer.Listener.Reader</a>()
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.648">RpcServer.Listener.Reader</a>()
                     throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -261,7 +261,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.612">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.652">run</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true#run()" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -274,7 +274,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>doRunLoop</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.624">doRunLoop</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.664">doRunLoop</a>()</pre>
 </li>
 </ul>
 <a name="startAdd()">
@@ -283,7 +283,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>startAdd</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.658">startAdd</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.698">startAdd</a>()</pre>
 <div class="block">This gets reader into the state that waits for the new channel
  to be registered with readSelector. If it was waiting in select()
  the thread will be woken up, otherwise whenever select() is called
@@ -297,7 +297,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>registerChannel</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectionKey.html?is-external=true" title="class or interface in java.nio.channels">SelectionKey</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.663">registerChannel</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html?is-external=true" title="class or interface in java.nio.channels">SocketChannel</a>&nbsp;channel)
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectionKey.html?is-external=true" title="class or interface in java.nio.channels">SelectionKey</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.703">registerChannel</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html?is-external=true" title="class or interface in java.nio.channels">SocketChannel</a>&nbsp;channel)
                              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -309,7 +309,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>finishAdd</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.668">finishAdd</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html#line.708">finishAdd</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html
index 7fef12a..28345c8 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.556">RpcServer.Listener</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.595">RpcServer.Listener</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 <div class="block">Listens on the socket. Creates jobs for the handler threads</div>
 </li>
@@ -300,7 +300,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>acceptChannel</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/ServerSocketChannel.html?is-external=true" title="class or interface in java.nio.channels">ServerSocketChannel</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.558">acceptChannel</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/ServerSocketChannel.html?is-external=true" title="class or interface in java.nio.channels">ServerSocketChannel</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.597">acceptChannel</a></pre>
 </li>
 </ul>
 <a name="selector">
@@ -309,7 +309,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>selector</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/Selector.html?is-external=true" title="class or interface in java.nio.channels">Selector</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.559">selector</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/Selector.html?is-external=true" title="class or interface in java.nio.channels">Selector</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.598">selector</a></pre>
 </li>
 </ul>
 <a name="readers">
@@ -318,7 +318,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>readers</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Listener.Reader</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.560">readers</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Listener.Reader</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.599">readers</a></pre>
 </li>
 </ul>
 <a name="currentReader">
@@ -327,7 +327,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>currentReader</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.561">currentReader</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.600">currentReader</a></pre>
 </li>
 </ul>
 <a name="rand">
@@ -336,7 +336,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>rand</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.562">rand</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.601">rand</a></pre>
 </li>
 </ul>
 <a name="lastCleanupRunTime">
@@ -345,7 +345,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>lastCleanupRunTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.563">lastCleanupRunTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.602">lastCleanupRunTime</a></pre>
 </li>
 </ul>
 <a name="cleanupInterval">
@@ -354,7 +354,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupInterval</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.565">cleanupInterval</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.604">cleanupInterval</a></pre>
 </li>
 </ul>
 <a name="backlogLength">
@@ -363,7 +363,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>backlogLength</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.567">backlogLength</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.606">backlogLength</a></pre>
 </li>
 </ul>
 <a name="readPool">
@@ -372,7 +372,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>readPool</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.569">readPool</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.608">readPool</a></pre>
 </li>
 </ul>
 </li>
@@ -389,7 +389,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RpcServer.Listener</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.571">RpcServer.Listener</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.610">RpcServer.Listener</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -409,7 +409,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupConnections</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.681">cleanupConnections</a>(boolean&nbsp;force)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.721">cleanupConnections</a>(boolean&nbsp;force)</pre>
 <div class="block">cleanup connections from connectionList. Choose a random range
  to scan and also have a limit on the number of the connections
  that will be cleanedup per run. The criteria for cleanup is the time
@@ -424,7 +424,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.728">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.768">run</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true#run()" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -439,7 +439,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>closeCurrentConnection</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.796">closeCurrentConnection</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectionKey.html?is-external=true" title="class or interface in java.nio.channels">SelectionKey</a>&nbsp;key,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.836">closeCurrentConnection</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectionKey.html?is-external=true" title="class or interface in java.nio.channels">SelectionKey</a>&nbsp;key,
                           <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
 </li>
 </ul>
@@ -449,7 +449,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getAddress</h4>
-<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.810">getAddress</a>()</pre>
+<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.850">getAddress</a>()</pre>
 </li>
 </ul>
 <a name="doAccept(java.nio.channels.SelectionKey)">
@@ -458,7 +458,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>doAccept</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.814">doAccept</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectionKey.html?is-external=true" title="class or interface in java.nio.channels">SelectionKey</a>&nbsp;key)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.854">doAccept</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectionKey.html?is-external=true" title="class or interface in java.nio.channels">SelectionKey</a>&nbsp;key)
         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/OutOfMemoryError.html?is-external=true" title="class or interface in java.lang">OutOfMemoryError</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -472,7 +472,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>doRead</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.848">doRead</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectionKey.html?is-external=true" title="class or interface in java.nio.channels">SelectionKey</a>&nbsp;key)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.888">doRead</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectionKey.html?is-external=true" title="class or interface in java.nio.channels">SelectionKey</a>&nbsp;key)
       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd></dl>
@@ -484,7 +484,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>doStop</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.880">doStop</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.920">doStop</a>()</pre>
 </li>
 </ul>
 <a name="getReader()">
@@ -493,7 +493,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getReader</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Listener.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.897">getReader</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Listener.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.html#line.937">getReader</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html
index de847e1..1f24a77 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.904">RpcServer.Responder</a>
+<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.944">RpcServer.Responder</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 </li>
 </ul>
@@ -273,7 +273,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>writeSelector</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/Selector.html?is-external=true" title="class or interface in java.nio.channels">Selector</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.905">writeSelector</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/Selector.html?is-external=true" title="class or interface in java.nio.channels">Selector</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.945">writeSelector</a></pre>
 </li>
 </ul>
 <a name="writingCons">
@@ -282,7 +282,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>writingCons</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.906">writingCons</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.946">writingCons</a></pre>
 </li>
 </ul>
 </li>
@@ -299,7 +299,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RpcServer.Responder</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.909">RpcServer.Responder</a>()
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.949">RpcServer.Responder</a>()
               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -319,7 +319,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.916">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.957">run</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true#run()" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -334,7 +334,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>registerWrites</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.934">registerWrites</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.975">registerWrites</a>()</pre>
 <div class="block">Take the list of the connections that want to write, and register them
  in the selector.</div>
 </li>
@@ -345,7 +345,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>registerForWrite</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.961">registerForWrite</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&nbsp;c)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1002">registerForWrite</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&nbsp;c)</pre>
 <div class="block">Add a connection to the list that want to write,</div>
 </li>
 </ul>
@@ -355,7 +355,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>doRunLoop</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.967">doRunLoop</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1008">doRunLoop</a>()</pre>
 </li>
 </ul>
 <a name="purge(long)">
@@ -364,7 +364,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>purge</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1026">purge</a>(long&nbsp;lastPurgeTime)</pre>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1067">purge</a>(long&nbsp;lastPurgeTime)</pre>
 <div class="block">If there were some calls that have not been sent out for a
  long time, we close the connection.</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the time of the purge.</dd></dl>
@@ -376,7 +376,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>doAsyncWrite</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1055">doAsyncWrite</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectionKey.html?is-external=true" title="class or interface in java.nio.channels">SelectionKey</a>&nbsp;key)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1096">doAsyncWrite</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SelectionKey.html?is-external=true" title="class or interface in java.nio.channels">SelectionKey</a>&nbsp;key)
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -388,7 +388,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>processResponse</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1088">processResponse</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a>&nbsp;call)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1129">processResponse</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a>&nbsp;call)
                          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Process the response for this call. You need to have the lock on
  <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#responseWriteLock"><code>RpcServer.Connection.responseWriteLock</code></a></div>
@@ -404,7 +404,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>processAllResponses</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1121">processAllResponses</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&nbsp;connection)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1162">processAllResponses</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a>&nbsp;connection)
                              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Process all the responses for this connection</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>true if all the calls were processed or that someone else is doing it.
@@ -420,7 +420,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doRespond</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1146">doRespond</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a>&nbsp;call)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#line.1187">doRespond</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a>&nbsp;call)
          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>


[07/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
index e2c4389..d03724e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
@@ -5185,3056 +5185,3058 @@
 <span class="sourceLineNo">5177</span>   * @param readLock is the lock reader or writer. True indicates that a non-exlcusive<a name="line.5177"></a>
 <span class="sourceLineNo">5178</span>   *                 lock is requested<a name="line.5178"></a>
 <span class="sourceLineNo">5179</span>   */<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    // Make sure the row is inside of this region before getting the lock for it.<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    checkRow(row, "row lock");<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    // create an object to use a a key in the row lock map<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    HashedBytes rowKey = new HashedBytes(row);<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    RowLockContext rowLockContext = null;<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    RowLockImpl result = null;<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    TraceScope traceScope = null;<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span><a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    // If we're tracing start a span to show how long this took.<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>    if (Trace.isTracing()) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>      traceScope = Trace.startSpan("HRegion.getRowLock");<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>      traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock"));<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>    }<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span><a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    try {<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>      // Keep trying until we have a lock or error out.<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>      // TODO: do we need to add a time component here?<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>      while (result == null) {<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span><a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>        // Try adding a RowLockContext to the lockedRows.<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>        // If we can add it then there's no other transactions currently running.<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        rowLockContext = new RowLockContext(rowKey);<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span><a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>        // if there was a running transaction then there's already a context.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>        if (existingContext != null) {<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>          rowLockContext = existingContext;<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>        }<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span><a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>        // Now try an get the lock.<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>        //<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>        // This can fail as<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>        if (readLock) {<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>          result = rowLockContext.newReadLock();<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>        } else {<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>          result = rowLockContext.newWriteLock();<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>        }<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      }<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      if (!result.getLock().tryLock(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>        if (traceScope != null) {<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>          traceScope.getSpan().addTimelineAnnotation("Failed to get row lock");<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>        }<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>        result = null;<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>        // Clean up the counts just in case this was the thing keeping the context alive.<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        rowLockContext.cleanUp();<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        throw new IOException("Timed out waiting for lock for row: " + rowKey);<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>      }<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>      return result;<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>    } catch (InterruptedException ie) {<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>      LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>      iie.initCause(ie);<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>      if (traceScope != null) {<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>        traceScope.getSpan().addTimelineAnnotation("Interrupted exception getting row lock");<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>      }<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>      Thread.currentThread().interrupt();<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>      throw iie;<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    } finally {<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>      if (traceScope != null) {<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>        traceScope.close();<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>      }<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    }<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>  }<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span><a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>  @Override<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>  public void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>    if (rowLocks != null) {<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>      for (RowLock rowLock : rowLocks) {<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span>        rowLock.release();<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>      }<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>      rowLocks.clear();<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    }<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>  }<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span><a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>  @VisibleForTesting<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>  class RowLockContext {<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span>    private final HashedBytes row;<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    final AtomicBoolean usable = new AtomicBoolean(true);<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    final Object lock = new Object();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    RowLockContext(HashedBytes row) {<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>      this.row = row;<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    }<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span><a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    RowLockImpl newWriteLock() {<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>      Lock l = readWriteLock.writeLock();<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>      return getRowLock(l);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    }<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    RowLockImpl newReadLock() {<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>      Lock l = readWriteLock.readLock();<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>      return getRowLock(l);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    private RowLockImpl getRowLock(Lock l) {<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>      count.incrementAndGet();<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>      synchronized (lock) {<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        if (usable.get()) {<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>          return new RowLockImpl(this, l);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        } else {<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>          return null;<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        }<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>      }<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    }<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span><a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    void cleanUp() {<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>      long c = count.decrementAndGet();<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>      if (c &lt;= 0) {<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        synchronized (lock) {<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>          if (count.get() &lt;= 0 ){<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>            usable.set(false);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>            RowLockContext removed = lockedRows.remove(row);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>            assert removed == this: "we should never remove a different context";<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>          }<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        }<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>      }<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    }<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span><a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    @Override<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    public String toString() {<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>      return "RowLockContext{" +<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>          "row=" + row +<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>          ", readWriteLock=" + readWriteLock +<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>          ", count=" + count +<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>          '}';<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    }<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>  }<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span><a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>  /**<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>   * Class used to represent a lock on a row.<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>   */<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>  public static class RowLockImpl implements RowLock {<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    private final RowLockContext context;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    private final Lock lock;<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span><a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    public RowLockImpl(RowLockContext context, Lock lock) {<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>      this.context = context;<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>      this.lock = lock;<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    }<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span><a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    public Lock getLock() {<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>      return lock;<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    }<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span><a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    @VisibleForTesting<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>    public RowLockContext getContext() {<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      return context;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    }<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span><a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    @Override<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    public void release() {<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>      lock.unlock();<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>      context.cleanUp();<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>    }<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span><a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    @Override<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    public String toString() {<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>      return "RowLockImpl{" +<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>          "context=" + context +<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>          ", lock=" + lock +<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>          '}';<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>    }<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  }<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span><a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>  /**<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>   * Determines whether multiple column families are present<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>   * Precondition: familyPaths is not null<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>   *<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>   * @param familyPaths List of (column family, hfilePath)<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>   */<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    boolean multipleFamilies = false;<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    byte[] family = null;<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    for (Pair&lt;byte[], String&gt; pair : familyPaths) {<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>      byte[] fam = pair.getFirst();<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>      if (family == null) {<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>        family = fam;<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>      } else if (!Bytes.equals(family, fam)) {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>        multipleFamilies = true;<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>        break;<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>      }<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    }<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    return multipleFamilies;<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>  }<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span><a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  @Override<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>  public boolean bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, boolean assignSeqId,<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      BulkLoadListener bulkLoadListener) throws IOException {<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>    long seqId = -1;<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;byte[], List&lt;Path&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    Preconditions.checkNotNull(familyPaths);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    // we need writeLock for multi-family bulk load<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    try {<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      this.writeRequestsCount.increment();<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      // There possibly was a split that happened between when the split keys<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // were gathered and before the HRegion's write lock was taken.  We need<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      // to validate the HFile region before attempting to bulk load all of them<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>      List&lt;IOException&gt; ioes = new ArrayList&lt;IOException&gt;();<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;Pair&lt;byte[], String&gt;&gt;();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>        byte[] familyName = p.getFirst();<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>        String path = p.getSecond();<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span><a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>        Store store = getStore(familyName);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>        if (store == null) {<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>          IOException ioe = new org.apache.hadoop.hbase.DoNotRetryIOException(<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>              "No such column family " + Bytes.toStringBinary(familyName));<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>          ioes.add(ioe);<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>        } else {<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>          try {<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>            store.assertBulkLoadHFileOk(new Path(path));<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>          } catch (WrongRegionException wre) {<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>            // recoverable (file doesn't fit in region)<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>            failures.add(p);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>          } catch (IOException ioe) {<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>            // unrecoverable (hdfs problem)<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>            ioes.add(ioe);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>          }<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>        }<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>      }<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span><a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>      // validation failed because of some sort of IO problem.<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>      if (ioes.size() != 0) {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>        IOException e = MultipleIOException.createIOException(ioes);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>        LOG.error("There were one or more IO errors when checking if the bulk load is ok.", e);<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>        throw e;<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>      }<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span><a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>      // validation failed, bail out before doing anything permanent.<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>      if (failures.size() != 0) {<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>        StringBuilder list = new StringBuilder();<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>        for (Pair&lt;byte[], String&gt; p : failures) {<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>              .append(p.getSecond());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>        }<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        // problem when validating<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>        LOG.warn("There was a recoverable bulk load failure likely due to a" +<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>            " split.  These (family, HFile) pairs were not loaded: " + list);<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>        return false;<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>      }<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span><a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>      // We need to assign a sequential ID that's in between two memstores in order to preserve<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>      // the guarantee that all the edits lower than the highest sequential ID from all the<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>      // HFiles are flushed on disk. See HBASE-10958.  The sequence id returned when we flush is<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>      // a sequence id that we can be sure is beyond the last hfile written).<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>      if (assignSeqId) {<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        FlushResult fs = flushcache(true, false);<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>        if (fs.isFlushSucceeded()) {<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>        } else {<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>          throw new IOException("Could not bulk load with an assigned sequential ID because the "+<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>            "flush didn't run. Reason for not flushing: " + ((FlushResultImpl)fs).failureReason);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>        }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span>      }<a name="line.5441"></a>
-<span class="sourceLineNo">5442</span><a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        byte[] familyName = p.getFirst();<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>        String path = p.getSecond();<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>        Store store = getStore(familyName);<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>        try {<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>          String finalPath = path;<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>          if (bulkLoadListener != null) {<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path);<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>          }<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>          Path commitedStoreFile = store.bulkLoadHFile(finalPath, seqId);<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span><a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>          if(storeFiles.containsKey(familyName)) {<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>            storeFiles.get(familyName).add(commitedStoreFile);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>          } else {<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>            List&lt;Path&gt; storeFileNames = new ArrayList&lt;Path&gt;();<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>            storeFileNames.add(commitedStoreFile);<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>            storeFiles.put(familyName, storeFileNames);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>          }<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>          if (bulkLoadListener != null) {<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>            bulkLoadListener.doneBulkLoad(familyName, path);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>          }<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>        } catch (IOException ioe) {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>          // A failure here can cause an atomicity violation that we currently<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>          // cannot recover from since it is likely a failed HDFS operation.<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span><a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>          // TODO Need a better story for reverting partial failures due to HDFS.<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>          LOG.error("There was a partial failure due to IO when attempting to" +<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>              " load " + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>          if (bulkLoadListener != null) {<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>            try {<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>              bulkLoadListener.failedBulkLoad(familyName, path);<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>            } catch (Exception ex) {<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>              LOG.error("Error while calling failedBulkLoad for family " +<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>                  Bytes.toString(familyName) + " with path " + path, ex);<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>            }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>          }<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>          throw ioe;<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>        }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>      }<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span><a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>      return true;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    } finally {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        // write a bulk load event when not all hfiles are loaded<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        try {<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>          WALProtos.BulkLoadDescriptor loadDescriptor = ProtobufUtil.toBulkLoadDescriptor(<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>              this.getRegionInfo().getTable(),<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>              ByteStringer.wrap(this.getRegionInfo().getEncodedNameAsBytes()), storeFiles, seqId);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>          WALUtil.writeBulkLoadMarkerAndSync(wal, this.htableDescriptor, getRegionInfo(),<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>              loadDescriptor, mvcc);<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span>        } catch (IOException ioe) {<a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>          if (this.rsServices != null) {<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>            // Have to abort region server because some hfiles has been loaded but we can't write<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>            // the event into WAL<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>          }<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>        }<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>      }<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span><a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>      closeBulkRegionOperation();<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    }<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>  }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span><a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  @Override<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>  public boolean equals(Object o) {<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>                                                ((HRegion) o).getRegionInfo().getRegionName());<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>  }<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span><a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>  @Override<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>  public int hashCode() {<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    return Bytes.hashCode(getRegionInfo().getRegionName());<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>  }<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span><a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>  @Override<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>  public String toString() {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>    return getRegionInfo().getRegionNameAsString();<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>  }<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span><a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>  /**<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>   * RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>   */<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>  class RegionScannerImpl implements RegionScanner, org.apache.hadoop.hbase.ipc.RpcCallback {<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    // Package local for testability<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>    KeyValueHeap storeHeap = null;<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>    /** Heap of key-values that are not essential for the provided filters and are thus read<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>     * on demand, if on-demand column family loading is enabled.*/<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>    KeyValueHeap joinedHeap = null;<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>    /**<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>     * If the joined heap data gathering is interrupted due to scan limits, this will<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>     * contain the row for which we are populating the values.*/<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>    protected Cell joinedContinuationRow = null;<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    private boolean filterClosed = false;<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span><a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>    protected final int isScan;<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    protected final byte[] stopRow;<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    protected final HRegion region;<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    protected final CellComparator comparator;<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>    protected boolean copyCellsFromSharedMem = false;<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span><a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>    private final long readPt;<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>    private final long maxResultSize;<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>    private final ScannerContext defaultScannerContext;<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>    private final FilterWrapper filter;<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span><a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    @Override<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    public HRegionInfo getRegionInfo() {<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>      return region.getRegionInfo();<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>    }<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span><a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    public void setCopyCellsFromSharedMem(boolean copyCells) {<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>      this.copyCellsFromSharedMem = copyCells;<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    }<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span><a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    RegionScannerImpl(Scan scan, List&lt;KeyValueScanner&gt; additionalScanners, HRegion region,<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        boolean copyCellsFromSharedMem)<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>        throws IOException {<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>      this.region = region;<a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      this.maxResultSize = scan.getMaxResultSize();<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>      if (scan.hasFilter()) {<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        this.filter = new FilterWrapper(scan.getFilter());<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>      } else {<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>        this.filter = null;<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>      }<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      this.comparator = region.getCellCompartor();<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>      /**<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>       * By default, calls to next/nextRaw must enforce the batch limit. Thus, construct a default<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>       * scanner context that can be used to enforce the batch limit in the event that a<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>       * ScannerContext is not specified during an invocation of next/nextRaw<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>       */<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>      defaultScannerContext = ScannerContext.newBuilder()<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>          .setBatchLimit(scan.getBatch()).build();<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span><a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) &amp;&amp; !scan.isGetScan()) {<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>        this.stopRow = null;<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span>      } else {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        this.stopRow = scan.getStopRow();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>      }<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      // If we are doing a get, we want to be [startRow,endRow]. Normally<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>      // it is [startRow,endRow) and if startRow=endRow we get nothing.<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      this.isScan = scan.isGetScan() ? 1 : 0;<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span><a name="line.5584"></a>
-<span class="sourceLineNo">5585</span>      // synchronize on scannerReadPoints so that nobody calculates<a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>      // getSmallestReadPoint, before scannerReadPoints is updated.<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      IsolationLevel isolationLevel = scan.getIsolationLevel();<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      synchronized(scannerReadPoints) {<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>        this.readPt = getReadpoint(isolationLevel);<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        scannerReadPoints.put(this, this.readPt);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>      }<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span><a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>      // Here we separate all scanners into two lists - scanner that provide data required<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      // by the filter to operate (scanners list) and all others (joinedScanners list).<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>      List&lt;KeyValueScanner&gt; scanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>      List&lt;KeyValueScanner&gt; joinedScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>      if (additionalScanners != null) {<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>        scanners.addAll(additionalScanners);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>      }<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span><a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>      for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; entry : scan.getFamilyMap().entrySet()) {<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>        Store store = stores.get(entry.getKey());<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>        KeyValueScanner scanner;<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span>        try {<a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>          scanner = store.getScanner(scan, entry.getValue(), this.readPt);<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>        } catch (FileNotFoundException e) {<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>          throw handleFileNotFound(e);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>        }<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>        if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand()<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>          || this.filter.isFamilyEssential(entry.getKey())) {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>          scanners.add(scanner);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>        } else {<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>          joinedScanners.add(scanner);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>        }<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      }<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>      this.copyCellsFromSharedMem = copyCellsFromSharedMem;<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      initializeKVHeap(scanners, joinedScanners, region);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    }<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span><a name="line.5619"></a>
-<span class="sourceLineNo">5620</span>    protected void initializeKVHeap(List&lt;KeyValueScanner&gt; scanners,<a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>        List&lt;KeyValueScanner&gt; joinedScanners, HRegion region)<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>        throws IOException {<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      this.storeHeap = new KeyValueHeap(scanners, comparator);<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      if (!joinedScanners.isEmpty()) {<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>        this.joinedHeap = new KeyValueHeap(joinedScanners, comparator);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span>      }<a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    }<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span><a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    @Override<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    public long getMaxResultSize() {<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>      return maxResultSize;<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    @Override<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    public long getMvccReadPoint() {<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      return this.readPt;<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span>    }<a name="line.5637"></a>
-<span class="sourceLineNo">5638</span><a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>    @Override<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>    public int getBatch() {<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      return this.defaultScannerContext.getBatchLimit();<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>    }<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    /**<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>     * Reset both the filter and the old filter.<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>     *<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>     * @throws IOException in case a filter raises an I/O exception.<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>     */<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    protected void resetFilters() throws IOException {<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>      if (filter != null) {<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>        filter.reset();<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span>      }<a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    }<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span><a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    @Override<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>    public boolean next(List&lt;Cell&gt; outResults)<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>        throws IOException {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>      // apply the batching limit by default<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>      return next(outResults, defaultScannerContext);<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>    }<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span><a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    @Override<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    public synchronized boolean next(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    throws IOException {<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>      if (this.filterClosed) {<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>        throw new UnknownScannerException("Scanner was closed (timed out?) " +<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>            "after we renewed it. Could be caused by a very slow scanner " +<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>            "or a lengthy garbage collection");<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>      }<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>      startRegionOperation(Operation.SCAN);<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>      readRequestsCount.increment();<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>      try {<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>        return nextRaw(outResults, scannerContext);<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>      } finally {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>        closeRegionOperation(Operation.SCAN);<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>      }<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>    }<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span><a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    @Override<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    public boolean nextRaw(List&lt;Cell&gt; outResults) throws IOException {<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      // Use the RegionScanner's context by default<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return nextRaw(outResults, defaultScannerContext);<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span><a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>    @Override<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>    public boolean nextRaw(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        throws IOException {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>      if (storeHeap == null) {<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        // scanner is closed<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>        throw new UnknownScannerException("Scanner was closed");<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      }<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      boolean moreValues = false;<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      try {<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>        if (outResults.isEmpty()) {<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>          // Usually outResults is empty. This is true when next is called<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>          // to handle scan or get operation.<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>          moreValues = nextInternal(outResults, scannerContext);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        } else {<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>          List&lt;Cell&gt; tmpList = new ArrayList&lt;Cell&gt;();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>          moreValues = nextInternal(tmpList, scannerContext);<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>          outResults.addAll(tmpList);<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        }<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span><a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        // If the size limit was reached it means a partial Result is being<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>        // returned. Returning a<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        // partial Result means that we should not reset the filters; filters<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>        // should only be reset in<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>        // between rows<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>        if (!scannerContext.partialResultFormed()) resetFilters();<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span><a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>        if (isFilterDoneInternal()) {<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>          moreValues = false;<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>        }<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span><a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        // If copyCellsFromSharedMem = true, then we need to copy the cells. Otherwise<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>        // it is a call coming from the RsRpcServices.scan().<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        if (copyCellsFromSharedMem &amp;&amp; !outResults.isEmpty()) {<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>          // Do the copy of the results here.<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          ListIterator&lt;Cell&gt; listItr = outResults.listIterator();<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          Cell cell = null;<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          while (listItr.hasNext()) {<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>            cell = listItr.next();<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>            if (cell instanceof ShareableMemory) {<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>              listItr.set(((ShareableMemory) cell).cloneToCell());<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>            }<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>          }<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>        }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>      } finally {<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        if (copyCellsFromSharedMem) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          // In case of copyCellsFromSharedMem==true (where the CPs wrap a scanner) we return<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          // the blocks then and there (for wrapped CPs)<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>          this.shipped();<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>      return moreValues;<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    }<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    /**<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>     * @return true if more cells exist after this batch, false if scanner is done<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>     */<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>    private boolean populateFromJoinedHeap(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>            throws IOException {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      assert joinedContinuationRow != null;<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>      boolean moreValues = populateResult(results, this.joinedHeap, scannerContext,<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>          joinedContinuationRow);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      if (!scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>        // We are done with this row, reset the continuation.<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>        joinedContinuationRow = null;<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span>      }<a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>      // As the data is obtained from two independent heaps, we need to<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>      // ensure that result list is sorted, because Result relies on that.<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>      Collections.sort(results, comparator);<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>      return moreValues;<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>    }<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    /**<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>     * Fetches records with currentRow into results list, until next row, batchLimit (if not -1) is<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>     * reached, or remainingResultSize (if not -1) is reaced<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>     * @param heap KeyValueHeap to fetch data from.It must be positioned on correct row before call.<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>     * @param scannerContext<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>     * @param currentRowCell<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>     * @return state of last call to {@link KeyValueHeap#next()}<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>     */<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    private boolean populateResult(List&lt;Cell&gt; results, KeyValueHeap heap,<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>        ScannerContext scannerContext, Cell currentRowCell) throws IOException {<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      Cell nextKv;<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      boolean moreCellsInRow = false;<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      boolean tmpKeepProgress = scannerContext.getKeepProgress();<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      // Scanning between column families and thus the scope is between cells<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      LimitScope limitScope = LimitScope.BETWEEN_CELLS;<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      try {<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>        do {<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>          // We want to maintain any progress that is made towards the limits while scanning across<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>          // different column families. To do this, we toggle the keep progress flag on during calls<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>          // to the StoreScanner to ensure that any progress made thus far is not wiped away.<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>          scannerContext.setKeepProgress(true);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>          heap.next(results, scannerContext);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>          scannerContext.setKeepProgress(tmpKeepProgress);<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>          nextKv = heap.peek();<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>          moreCellsInRow = moreCellsInRow(nextKv, currentRowCell);<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>          if (!moreCellsInRow) incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>          if (scannerContext.checkBatchLimit(limitScope)) {<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>            return scannerContext.setScannerState(NextState.BATCH_LIMIT_REACHED).hasMoreValues();<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>          } else if (scannerContext.checkSizeLimit(limitScope)) {<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>            ScannerContext.NextState state =<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>              moreCellsInRow? NextState.SIZE_LIMIT_REACHED_MID_ROW: NextState.SIZE_LIMIT_REACHED;<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>          } else if (scannerContext.checkTimeLimit(limitScope)) {<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>            ScannerContext.NextState state =<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>              moreCellsInRow? NextState.TIME_LIMIT_REACHED_MID_ROW: NextState.TIME_LIMIT_REACHED;<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>          }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>        } while (moreCellsInRow);<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>      } catch (FileNotFoundException e) {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>        throw handleFileNotFound(e);<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>      }<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      return nextKv != null;<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    }<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span><a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    /**<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>     * Based on the nextKv in the heap, and the current row, decide whether or not there are more<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>     * cells to be read in the heap. If the row of the nextKv in the heap matches the current row<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>     * then there are more cells to be read in the row.<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>     * @param nextKv<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>     * @param currentRowCell<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>     * @return true When there are more cells in the row to be read<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>     */<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>    private boolean moreCellsInRow(final Cell nextKv, Cell currentRowCell) {<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      return nextKv != null &amp;&amp; CellUtil.matchingRow(nextKv, currentRowCell);<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>    }<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span><a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>    /*<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>     * @return True if a filter rules the scanner is over, done.<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>     */<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    @Override<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    public synchronized boolean isFilterDone() throws IOException {<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      return isFilterDoneInternal();<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    }<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span><a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>    private boolean isFilterDoneInternal() throws IOException {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      return this.filter != null &amp;&amp; this.filter.filterAllRemaining();<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>    }<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span><a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    private boolean nextInternal(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>        throws IOException {<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>      if (!results.isEmpty()) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>        throw new IllegalArgumentException("First parameter should be an empty list");<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>      }<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      if (scannerContext == null) {<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>        throw new IllegalArgumentException("Scanner context cannot be null");<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      RpcCallContext rpcCall = RpcServer.getCurrentCall();<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span><a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>      // Save the initial progress from the Scanner context in these local variables. The progress<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      // may need to be reset a few times if rows are being filtered out so we save the initial<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      // progress.<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      int initialBatchProgress = scannerContext.getBatchProgress();<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>      long initialSizeProgress = scannerContext.getSizeProgress();<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>      long initialTimeProgress = scannerContext.getTimeProgress();<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      // The loop here is used only when at some point during the next we determine<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      // that due to effects of filters or otherwise, we have an empty row in the result.<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>      // Then we loop and try again. Otherwise, we must get out on the first iteration via return,<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>      // "true" if there's more data to read, "false" if there isn't (storeHeap is at a stop row,<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>      // and joinedHeap has no more data to read for the last row (if set, joinedContinuationRow).<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>      while (true) {<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>        // Starting to scan a new row. Reset the scanner progress according to whether or not<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>        // progress should be kept.<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>        if (scannerContext.getKeepProgress()) {<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>          // Progress should be kept. Reset to initial values seen at start of method invocation.<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>          scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>            initialTimeProgress);<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        } else {<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>          scannerContext.clearProgress();<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        }<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>        if (rpcCall != null) {<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>          // If a user specifies a too-restrictive or too-slow scanner, the<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>          // client might time out and disconnect while the server side<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>          // is still processing the request. We should abort aggressively<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>          // in that case.<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>          long afterTime = rpcCall.disconnectSince();<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>          if (afterTime &gt;= 0) {<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>            throw new CallerDisconnectedException(<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>                "Aborting on region " + getRegionInfo().getRegionNameAsString() + ", call " +<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>                    this + " after " + afterTime + " ms, since " +<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>                    "caller disconnected");<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          }<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span><a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>        // Let's see what we have in the storeHeap.<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>        Cell current = this.storeHeap.peek();<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span><a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>        boolean stopRow = isStopRow(current);<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // When has filter row is true it means that the all the cells for a particular row must be<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        // read before a filtering decision can be made. This means that filters where hasFilterRow<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>        // run the risk of encountering out of memory errors in the case that they are applied to a<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>        // table that has very large rows.<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>        boolean hasFilterRow = this.filter != null &amp;&amp; this.filter.hasFilterRow();<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span><a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>        // If filter#hasFilterRow is true, partial results are not allowed since allowing them<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>        // would prevent the filters from being evaluated. Thus, if it is true, change the<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>        // scope of any limits that could potentially create partial results to<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>        // LimitScope.BETWEEN_ROWS so that those limits are not reached mid-row<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>        if (hasFilterRow) {<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>          if (LOG.isTraceEnabled()) {<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>            LOG.trace("filter#hasFilterRow is true which prevents partial results from being "<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>                + " formed. Changing scope of limits that may create partials");<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span>          }<a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>          scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>          scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>        }<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span><a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>        // Check if we were getting data from the joinedHeap and hit the limit.<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>        // If not, then it's main path - getting results from storeHeap.<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>        if (joinedContinuationRow == null) {<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>          // First, check if we are at a stop row. If so, there are no more results.<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>          if (stopRow) {<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>            if (hasFilterRow) {<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>              filter.filterRowCells(results);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>            }<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>          }<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span><a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>          // Check if rowkey filter wants to exclude this row. If so, loop to next.<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>          // Technically, if we hit limits before on this row, we don't need this call.<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>          if (filterRowKey(current)) {<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>            // Typically the count of rows scanned is incremented inside #populateResult. However,<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>            // here we are filtering a row based purely on its row key, preventing us from calling<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>            // #populateResult. Thus, perform the necessary increment here to rows scanned metric<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>            incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>            if (!moreRows) {<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>            }<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>            results.clear();<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>            continue;<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>          }<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span><a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>          // Ok, we are good, let's try to get some results from the main heap.<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>          populateResult(results, this.storeHeap, scannerContext, current);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>            if (hasFilterRow) {<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>              throw new IncompatibleFilterException(<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>                  "Filter whose hasFilterRow() returns true is incompatible with scans that must "<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>                      + " stop mid-row because of a limit. ScannerContext:" + scannerContext);<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>            }<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>            return true;<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>          }<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span><a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>          Cell nextKv = this.storeHeap.peek();<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>          stopRow = nextKv == null || isStopRow(nextKv);<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>          // save that the row was empty before filters applied to it.<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>          final boolean isEmptyRow = results.isEmpty();<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span><a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>          // We have the part of the row necessary for filtering (all of it, usually).<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>          // First filter with the filterRow(List).<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>          FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>          if (hasFilterRow) {<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>            ret = filter.filterRowCellsWithRet(results);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span><a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>            // We don't know how the results have changed after being filtered. Must set progress<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>            // according to contents of results now. However, a change in the results should not<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>            // affect the time progress. Thus preserve whatever time progress has been made<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>            long timeProgress = scannerContext.getTimeProgress();<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>            if (scannerContext.getKeepProgress()) {<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>              scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>                initialTimeProgress);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>            } else {<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>              scannerContext.clearProgress();<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>            }<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>            scannerContext.setTimeProgress(timeProgress);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>            scannerContext.incrementBatchProgress(results.size());<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>            for (Cell cell : results) {<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>              scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOf(cell));<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>            }<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>          }<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span><a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>          if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>            results.clear();<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>            if (!moreRows) {<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>            }<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>            // This row was totally filtered out, if this is NOT the last row,<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>            // we should continue on. Otherwise, nothing else to do.<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>            if (!stopRow) continue;<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>          }<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>          // Ok, we are done with storeHeap for this row.<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>          // Now we may need to fetch additional, non-essential data into row.<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>          // These values are not needed for filter to work, so we postpone their<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>          // fetch to (possibly) reduce amount of data loads from disk.<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>          if (this.joinedHeap != null) {<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>            boolean mayHaveData = joinedHeapMayHaveData(current);<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>            if (mayHaveData) {<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>              joinedContinuationRow = current;<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>              populateFromJoinedHeap(results, scannerContext);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span><a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>              if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>                return true;<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>              }<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>            }<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>          }<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>        } else {<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>          // Populating from the joined heap was stopped by limits, populate some more.<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>          populateFromJoinedHeap(results, scannerContext);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>            return true;<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>          }<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>        }<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>        // We may have just called populateFromJoinedMap and hit the limits. If that is<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>        // the case, we need to call it again on the next next() invocation.<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span>        if (joinedContinuationRow != null) {<a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>        }<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span><a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>        // Finally, we are done with both joinedHeap and storeHeap.<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>        // Double check to prevent empty rows from appearing in result. It could be<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>        // the case when SingleColumnValueExcludeFilter is used.<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>        if (results.isEmpty()) {<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>          incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>          boolean moreRows = nextRow(scannerContext, current);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>          if (!moreRows) {<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>          }<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>          if (!stopRow) continue;<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>        }<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>        if (stopRow) {<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>        } else {<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>        }<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      }<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    }<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span><a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    protected void incrementCountOfRowsFilteredMetric(ScannerContext scannerContext) {<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span><a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      scannerContext.getMetrics().countOfRowsFiltered.incrementAndGet();<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    }<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span><a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    protected void incrementCountOfRowsScannedMetric(ScannerContext scannerContext) {<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span><a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      scannerContext.getMetrics().countOfRowsScanned.incrementAndGet();<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    }<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span><a name="line.6036"></a>
-<span class

<TRUNCATED>

[15/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperationInProgress.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperationInProgress.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperationInProgress.html
index e2c4389..d03724e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperationInProgress.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperationInProgress.html
@@ -5185,3056 +5185,3058 @@
 <span class="sourceLineNo">5177</span>   * @param readLock is the lock reader or writer. True indicates that a non-exlcusive<a name="line.5177"></a>
 <span class="sourceLineNo">5178</span>   *                 lock is requested<a name="line.5178"></a>
 <span class="sourceLineNo">5179</span>   */<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    // Make sure the row is inside of this region before getting the lock for it.<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    checkRow(row, "row lock");<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    // create an object to use a a key in the row lock map<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    HashedBytes rowKey = new HashedBytes(row);<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    RowLockContext rowLockContext = null;<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    RowLockImpl result = null;<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    TraceScope traceScope = null;<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span><a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    // If we're tracing start a span to show how long this took.<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>    if (Trace.isTracing()) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>      traceScope = Trace.startSpan("HRegion.getRowLock");<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>      traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock"));<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>    }<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span><a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    try {<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>      // Keep trying until we have a lock or error out.<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>      // TODO: do we need to add a time component here?<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>      while (result == null) {<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span><a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>        // Try adding a RowLockContext to the lockedRows.<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>        // If we can add it then there's no other transactions currently running.<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        rowLockContext = new RowLockContext(rowKey);<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span><a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>        // if there was a running transaction then there's already a context.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>        if (existingContext != null) {<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>          rowLockContext = existingContext;<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>        }<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span><a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>        // Now try an get the lock.<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>        //<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>        // This can fail as<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>        if (readLock) {<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>          result = rowLockContext.newReadLock();<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>        } else {<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>          result = rowLockContext.newWriteLock();<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>        }<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      }<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      if (!result.getLock().tryLock(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>        if (traceScope != null) {<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>          traceScope.getSpan().addTimelineAnnotation("Failed to get row lock");<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>        }<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>        result = null;<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>        // Clean up the counts just in case this was the thing keeping the context alive.<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        rowLockContext.cleanUp();<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        throw new IOException("Timed out waiting for lock for row: " + rowKey);<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>      }<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>      return result;<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>    } catch (InterruptedException ie) {<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>      LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>      iie.initCause(ie);<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>      if (traceScope != null) {<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>        traceScope.getSpan().addTimelineAnnotation("Interrupted exception getting row lock");<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>      }<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>      Thread.currentThread().interrupt();<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>      throw iie;<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    } finally {<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>      if (traceScope != null) {<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>        traceScope.close();<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>      }<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    }<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>  }<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span><a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>  @Override<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>  public void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>    if (rowLocks != null) {<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>      for (RowLock rowLock : rowLocks) {<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span>        rowLock.release();<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>      }<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>      rowLocks.clear();<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    }<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>  }<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span><a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>  @VisibleForTesting<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>  class RowLockContext {<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span>    private final HashedBytes row;<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    final AtomicBoolean usable = new AtomicBoolean(true);<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    final Object lock = new Object();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    RowLockContext(HashedBytes row) {<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>      this.row = row;<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    }<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span><a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    RowLockImpl newWriteLock() {<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>      Lock l = readWriteLock.writeLock();<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>      return getRowLock(l);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    }<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    RowLockImpl newReadLock() {<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>      Lock l = readWriteLock.readLock();<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>      return getRowLock(l);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    private RowLockImpl getRowLock(Lock l) {<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>      count.incrementAndGet();<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>      synchronized (lock) {<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        if (usable.get()) {<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>          return new RowLockImpl(this, l);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        } else {<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>          return null;<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        }<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>      }<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    }<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span><a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    void cleanUp() {<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>      long c = count.decrementAndGet();<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>      if (c &lt;= 0) {<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        synchronized (lock) {<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>          if (count.get() &lt;= 0 ){<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>            usable.set(false);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>            RowLockContext removed = lockedRows.remove(row);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>            assert removed == this: "we should never remove a different context";<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>          }<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        }<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>      }<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    }<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span><a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    @Override<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    public String toString() {<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>      return "RowLockContext{" +<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>          "row=" + row +<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>          ", readWriteLock=" + readWriteLock +<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>          ", count=" + count +<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>          '}';<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    }<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>  }<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span><a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>  /**<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>   * Class used to represent a lock on a row.<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>   */<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>  public static class RowLockImpl implements RowLock {<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    private final RowLockContext context;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    private final Lock lock;<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span><a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    public RowLockImpl(RowLockContext context, Lock lock) {<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>      this.context = context;<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>      this.lock = lock;<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    }<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span><a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    public Lock getLock() {<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>      return lock;<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    }<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span><a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    @VisibleForTesting<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>    public RowLockContext getContext() {<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      return context;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    }<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span><a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    @Override<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    public void release() {<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>      lock.unlock();<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>      context.cleanUp();<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>    }<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span><a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    @Override<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    public String toString() {<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>      return "RowLockImpl{" +<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>          "context=" + context +<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>          ", lock=" + lock +<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>          '}';<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>    }<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  }<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span><a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>  /**<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>   * Determines whether multiple column families are present<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>   * Precondition: familyPaths is not null<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>   *<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>   * @param familyPaths List of (column family, hfilePath)<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>   */<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    boolean multipleFamilies = false;<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    byte[] family = null;<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    for (Pair&lt;byte[], String&gt; pair : familyPaths) {<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>      byte[] fam = pair.getFirst();<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>      if (family == null) {<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>        family = fam;<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>      } else if (!Bytes.equals(family, fam)) {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>        multipleFamilies = true;<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>        break;<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>      }<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    }<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    return multipleFamilies;<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>  }<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span><a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  @Override<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>  public boolean bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, boolean assignSeqId,<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      BulkLoadListener bulkLoadListener) throws IOException {<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>    long seqId = -1;<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;byte[], List&lt;Path&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    Preconditions.checkNotNull(familyPaths);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    // we need writeLock for multi-family bulk load<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    try {<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      this.writeRequestsCount.increment();<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      // There possibly was a split that happened between when the split keys<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // were gathered and before the HRegion's write lock was taken.  We need<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      // to validate the HFile region before attempting to bulk load all of them<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>      List&lt;IOException&gt; ioes = new ArrayList&lt;IOException&gt;();<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;Pair&lt;byte[], String&gt;&gt;();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>        byte[] familyName = p.getFirst();<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>        String path = p.getSecond();<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span><a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>        Store store = getStore(familyName);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>        if (store == null) {<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>          IOException ioe = new org.apache.hadoop.hbase.DoNotRetryIOException(<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>              "No such column family " + Bytes.toStringBinary(familyName));<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>          ioes.add(ioe);<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>        } else {<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>          try {<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>            store.assertBulkLoadHFileOk(new Path(path));<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>          } catch (WrongRegionException wre) {<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>            // recoverable (file doesn't fit in region)<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>            failures.add(p);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>          } catch (IOException ioe) {<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>            // unrecoverable (hdfs problem)<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>            ioes.add(ioe);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>          }<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>        }<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>      }<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span><a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>      // validation failed because of some sort of IO problem.<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>      if (ioes.size() != 0) {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>        IOException e = MultipleIOException.createIOException(ioes);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>        LOG.error("There were one or more IO errors when checking if the bulk load is ok.", e);<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>        throw e;<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>      }<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span><a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>      // validation failed, bail out before doing anything permanent.<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>      if (failures.size() != 0) {<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>        StringBuilder list = new StringBuilder();<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>        for (Pair&lt;byte[], String&gt; p : failures) {<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>              .append(p.getSecond());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>        }<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        // problem when validating<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>        LOG.warn("There was a recoverable bulk load failure likely due to a" +<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>            " split.  These (family, HFile) pairs were not loaded: " + list);<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>        return false;<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>      }<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span><a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>      // We need to assign a sequential ID that's in between two memstores in order to preserve<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>      // the guarantee that all the edits lower than the highest sequential ID from all the<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>      // HFiles are flushed on disk. See HBASE-10958.  The sequence id returned when we flush is<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>      // a sequence id that we can be sure is beyond the last hfile written).<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>      if (assignSeqId) {<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        FlushResult fs = flushcache(true, false);<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>        if (fs.isFlushSucceeded()) {<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>        } else {<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>          throw new IOException("Could not bulk load with an assigned sequential ID because the "+<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>            "flush didn't run. Reason for not flushing: " + ((FlushResultImpl)fs).failureReason);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>        }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span>      }<a name="line.5441"></a>
-<span class="sourceLineNo">5442</span><a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        byte[] familyName = p.getFirst();<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>        String path = p.getSecond();<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>        Store store = getStore(familyName);<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>        try {<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>          String finalPath = path;<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>          if (bulkLoadListener != null) {<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path);<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>          }<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>          Path commitedStoreFile = store.bulkLoadHFile(finalPath, seqId);<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span><a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>          if(storeFiles.containsKey(familyName)) {<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>            storeFiles.get(familyName).add(commitedStoreFile);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>          } else {<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>            List&lt;Path&gt; storeFileNames = new ArrayList&lt;Path&gt;();<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>            storeFileNames.add(commitedStoreFile);<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>            storeFiles.put(familyName, storeFileNames);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>          }<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>          if (bulkLoadListener != null) {<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>            bulkLoadListener.doneBulkLoad(familyName, path);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>          }<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>        } catch (IOException ioe) {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>          // A failure here can cause an atomicity violation that we currently<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>          // cannot recover from since it is likely a failed HDFS operation.<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span><a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>          // TODO Need a better story for reverting partial failures due to HDFS.<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>          LOG.error("There was a partial failure due to IO when attempting to" +<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>              " load " + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>          if (bulkLoadListener != null) {<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>            try {<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>              bulkLoadListener.failedBulkLoad(familyName, path);<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>            } catch (Exception ex) {<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>              LOG.error("Error while calling failedBulkLoad for family " +<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>                  Bytes.toString(familyName) + " with path " + path, ex);<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>            }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>          }<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>          throw ioe;<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>        }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>      }<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span><a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>      return true;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    } finally {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        // write a bulk load event when not all hfiles are loaded<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        try {<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>          WALProtos.BulkLoadDescriptor loadDescriptor = ProtobufUtil.toBulkLoadDescriptor(<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>              this.getRegionInfo().getTable(),<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>              ByteStringer.wrap(this.getRegionInfo().getEncodedNameAsBytes()), storeFiles, seqId);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>          WALUtil.writeBulkLoadMarkerAndSync(wal, this.htableDescriptor, getRegionInfo(),<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>              loadDescriptor, mvcc);<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span>        } catch (IOException ioe) {<a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>          if (this.rsServices != null) {<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>            // Have to abort region server because some hfiles has been loaded but we can't write<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>            // the event into WAL<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>          }<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>        }<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>      }<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span><a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>      closeBulkRegionOperation();<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    }<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>  }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span><a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  @Override<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>  public boolean equals(Object o) {<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>                                                ((HRegion) o).getRegionInfo().getRegionName());<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>  }<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span><a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>  @Override<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>  public int hashCode() {<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    return Bytes.hashCode(getRegionInfo().getRegionName());<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>  }<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span><a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>  @Override<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>  public String toString() {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>    return getRegionInfo().getRegionNameAsString();<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>  }<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span><a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>  /**<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>   * RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>   */<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>  class RegionScannerImpl implements RegionScanner, org.apache.hadoop.hbase.ipc.RpcCallback {<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    // Package local for testability<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>    KeyValueHeap storeHeap = null;<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>    /** Heap of key-values that are not essential for the provided filters and are thus read<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>     * on demand, if on-demand column family loading is enabled.*/<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>    KeyValueHeap joinedHeap = null;<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>    /**<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>     * If the joined heap data gathering is interrupted due to scan limits, this will<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>     * contain the row for which we are populating the values.*/<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>    protected Cell joinedContinuationRow = null;<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    private boolean filterClosed = false;<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span><a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>    protected final int isScan;<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    protected final byte[] stopRow;<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    protected final HRegion region;<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    protected final CellComparator comparator;<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>    protected boolean copyCellsFromSharedMem = false;<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span><a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>    private final long readPt;<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>    private final long maxResultSize;<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>    private final ScannerContext defaultScannerContext;<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>    private final FilterWrapper filter;<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span><a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    @Override<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    public HRegionInfo getRegionInfo() {<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>      return region.getRegionInfo();<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>    }<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span><a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    public void setCopyCellsFromSharedMem(boolean copyCells) {<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>      this.copyCellsFromSharedMem = copyCells;<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    }<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span><a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    RegionScannerImpl(Scan scan, List&lt;KeyValueScanner&gt; additionalScanners, HRegion region,<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        boolean copyCellsFromSharedMem)<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>        throws IOException {<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>      this.region = region;<a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      this.maxResultSize = scan.getMaxResultSize();<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>      if (scan.hasFilter()) {<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        this.filter = new FilterWrapper(scan.getFilter());<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>      } else {<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>        this.filter = null;<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>      }<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      this.comparator = region.getCellCompartor();<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>      /**<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>       * By default, calls to next/nextRaw must enforce the batch limit. Thus, construct a default<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>       * scanner context that can be used to enforce the batch limit in the event that a<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>       * ScannerContext is not specified during an invocation of next/nextRaw<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>       */<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>      defaultScannerContext = ScannerContext.newBuilder()<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>          .setBatchLimit(scan.getBatch()).build();<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span><a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) &amp;&amp; !scan.isGetScan()) {<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>        this.stopRow = null;<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span>      } else {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        this.stopRow = scan.getStopRow();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>      }<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      // If we are doing a get, we want to be [startRow,endRow]. Normally<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>      // it is [startRow,endRow) and if startRow=endRow we get nothing.<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      this.isScan = scan.isGetScan() ? 1 : 0;<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span><a name="line.5584"></a>
-<span class="sourceLineNo">5585</span>      // synchronize on scannerReadPoints so that nobody calculates<a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>      // getSmallestReadPoint, before scannerReadPoints is updated.<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      IsolationLevel isolationLevel = scan.getIsolationLevel();<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      synchronized(scannerReadPoints) {<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>        this.readPt = getReadpoint(isolationLevel);<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        scannerReadPoints.put(this, this.readPt);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>      }<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span><a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>      // Here we separate all scanners into two lists - scanner that provide data required<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      // by the filter to operate (scanners list) and all others (joinedScanners list).<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>      List&lt;KeyValueScanner&gt; scanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>      List&lt;KeyValueScanner&gt; joinedScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>      if (additionalScanners != null) {<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>        scanners.addAll(additionalScanners);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>      }<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span><a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>      for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; entry : scan.getFamilyMap().entrySet()) {<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>        Store store = stores.get(entry.getKey());<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>        KeyValueScanner scanner;<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span>        try {<a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>          scanner = store.getScanner(scan, entry.getValue(), this.readPt);<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>        } catch (FileNotFoundException e) {<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>          throw handleFileNotFound(e);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>        }<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>        if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand()<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>          || this.filter.isFamilyEssential(entry.getKey())) {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>          scanners.add(scanner);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>        } else {<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>          joinedScanners.add(scanner);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>        }<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      }<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>      this.copyCellsFromSharedMem = copyCellsFromSharedMem;<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      initializeKVHeap(scanners, joinedScanners, region);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    }<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span><a name="line.5619"></a>
-<span class="sourceLineNo">5620</span>    protected void initializeKVHeap(List&lt;KeyValueScanner&gt; scanners,<a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>        List&lt;KeyValueScanner&gt; joinedScanners, HRegion region)<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>        throws IOException {<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      this.storeHeap = new KeyValueHeap(scanners, comparator);<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      if (!joinedScanners.isEmpty()) {<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>        this.joinedHeap = new KeyValueHeap(joinedScanners, comparator);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span>      }<a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    }<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span><a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    @Override<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    public long getMaxResultSize() {<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>      return maxResultSize;<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    @Override<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    public long getMvccReadPoint() {<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      return this.readPt;<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span>    }<a name="line.5637"></a>
-<span class="sourceLineNo">5638</span><a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>    @Override<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>    public int getBatch() {<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      return this.defaultScannerContext.getBatchLimit();<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>    }<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    /**<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>     * Reset both the filter and the old filter.<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>     *<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>     * @throws IOException in case a filter raises an I/O exception.<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>     */<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    protected void resetFilters() throws IOException {<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>      if (filter != null) {<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>        filter.reset();<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span>      }<a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    }<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span><a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    @Override<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>    public boolean next(List&lt;Cell&gt; outResults)<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>        throws IOException {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>      // apply the batching limit by default<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>      return next(outResults, defaultScannerContext);<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>    }<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span><a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    @Override<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    public synchronized boolean next(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    throws IOException {<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>      if (this.filterClosed) {<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>        throw new UnknownScannerException("Scanner was closed (timed out?) " +<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>            "after we renewed it. Could be caused by a very slow scanner " +<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>            "or a lengthy garbage collection");<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>      }<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>      startRegionOperation(Operation.SCAN);<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>      readRequestsCount.increment();<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>      try {<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>        return nextRaw(outResults, scannerContext);<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>      } finally {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>        closeRegionOperation(Operation.SCAN);<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>      }<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>    }<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span><a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    @Override<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    public boolean nextRaw(List&lt;Cell&gt; outResults) throws IOException {<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      // Use the RegionScanner's context by default<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return nextRaw(outResults, defaultScannerContext);<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span><a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>    @Override<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>    public boolean nextRaw(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        throws IOException {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>      if (storeHeap == null) {<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        // scanner is closed<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>        throw new UnknownScannerException("Scanner was closed");<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      }<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      boolean moreValues = false;<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      try {<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>        if (outResults.isEmpty()) {<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>          // Usually outResults is empty. This is true when next is called<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>          // to handle scan or get operation.<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>          moreValues = nextInternal(outResults, scannerContext);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        } else {<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>          List&lt;Cell&gt; tmpList = new ArrayList&lt;Cell&gt;();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>          moreValues = nextInternal(tmpList, scannerContext);<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>          outResults.addAll(tmpList);<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        }<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span><a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        // If the size limit was reached it means a partial Result is being<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>        // returned. Returning a<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        // partial Result means that we should not reset the filters; filters<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>        // should only be reset in<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>        // between rows<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>        if (!scannerContext.partialResultFormed()) resetFilters();<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span><a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>        if (isFilterDoneInternal()) {<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>          moreValues = false;<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>        }<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span><a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        // If copyCellsFromSharedMem = true, then we need to copy the cells. Otherwise<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>        // it is a call coming from the RsRpcServices.scan().<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        if (copyCellsFromSharedMem &amp;&amp; !outResults.isEmpty()) {<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>          // Do the copy of the results here.<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          ListIterator&lt;Cell&gt; listItr = outResults.listIterator();<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          Cell cell = null;<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          while (listItr.hasNext()) {<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>            cell = listItr.next();<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>            if (cell instanceof ShareableMemory) {<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>              listItr.set(((ShareableMemory) cell).cloneToCell());<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>            }<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>          }<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>        }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>      } finally {<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        if (copyCellsFromSharedMem) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          // In case of copyCellsFromSharedMem==true (where the CPs wrap a scanner) we return<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          // the blocks then and there (for wrapped CPs)<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>          this.shipped();<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>      return moreValues;<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    }<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    /**<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>     * @return true if more cells exist after this batch, false if scanner is done<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>     */<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>    private boolean populateFromJoinedHeap(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>            throws IOException {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      assert joinedContinuationRow != null;<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>      boolean moreValues = populateResult(results, this.joinedHeap, scannerContext,<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>          joinedContinuationRow);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      if (!scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>        // We are done with this row, reset the continuation.<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>        joinedContinuationRow = null;<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span>      }<a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>      // As the data is obtained from two independent heaps, we need to<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>      // ensure that result list is sorted, because Result relies on that.<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>      Collections.sort(results, comparator);<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>      return moreValues;<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>    }<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    /**<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>     * Fetches records with currentRow into results list, until next row, batchLimit (if not -1) is<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>     * reached, or remainingResultSize (if not -1) is reaced<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>     * @param heap KeyValueHeap to fetch data from.It must be positioned on correct row before call.<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>     * @param scannerContext<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>     * @param currentRowCell<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>     * @return state of last call to {@link KeyValueHeap#next()}<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>     */<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    private boolean populateResult(List&lt;Cell&gt; results, KeyValueHeap heap,<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>        ScannerContext scannerContext, Cell currentRowCell) throws IOException {<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      Cell nextKv;<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      boolean moreCellsInRow = false;<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      boolean tmpKeepProgress = scannerContext.getKeepProgress();<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      // Scanning between column families and thus the scope is between cells<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      LimitScope limitScope = LimitScope.BETWEEN_CELLS;<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      try {<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>        do {<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>          // We want to maintain any progress that is made towards the limits while scanning across<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>          // different column families. To do this, we toggle the keep progress flag on during calls<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>          // to the StoreScanner to ensure that any progress made thus far is not wiped away.<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>          scannerContext.setKeepProgress(true);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>          heap.next(results, scannerContext);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>          scannerContext.setKeepProgress(tmpKeepProgress);<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>          nextKv = heap.peek();<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>          moreCellsInRow = moreCellsInRow(nextKv, currentRowCell);<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>          if (!moreCellsInRow) incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>          if (scannerContext.checkBatchLimit(limitScope)) {<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>            return scannerContext.setScannerState(NextState.BATCH_LIMIT_REACHED).hasMoreValues();<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>          } else if (scannerContext.checkSizeLimit(limitScope)) {<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>            ScannerContext.NextState state =<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>              moreCellsInRow? NextState.SIZE_LIMIT_REACHED_MID_ROW: NextState.SIZE_LIMIT_REACHED;<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>          } else if (scannerContext.checkTimeLimit(limitScope)) {<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>            ScannerContext.NextState state =<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>              moreCellsInRow? NextState.TIME_LIMIT_REACHED_MID_ROW: NextState.TIME_LIMIT_REACHED;<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>          }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>        } while (moreCellsInRow);<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>      } catch (FileNotFoundException e) {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>        throw handleFileNotFound(e);<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>      }<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      return nextKv != null;<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    }<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span><a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    /**<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>     * Based on the nextKv in the heap, and the current row, decide whether or not there are more<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>     * cells to be read in the heap. If the row of the nextKv in the heap matches the current row<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>     * then there are more cells to be read in the row.<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>     * @param nextKv<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>     * @param currentRowCell<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>     * @return true When there are more cells in the row to be read<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>     */<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>    private boolean moreCellsInRow(final Cell nextKv, Cell currentRowCell) {<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      return nextKv != null &amp;&amp; CellUtil.matchingRow(nextKv, currentRowCell);<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>    }<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span><a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>    /*<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>     * @return True if a filter rules the scanner is over, done.<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>     */<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    @Override<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    public synchronized boolean isFilterDone() throws IOException {<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      return isFilterDoneInternal();<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    }<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span><a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>    private boolean isFilterDoneInternal() throws IOException {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      return this.filter != null &amp;&amp; this.filter.filterAllRemaining();<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>    }<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span><a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    private boolean nextInternal(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>        throws IOException {<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>      if (!results.isEmpty()) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>        throw new IllegalArgumentException("First parameter should be an empty list");<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>      }<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      if (scannerContext == null) {<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>        throw new IllegalArgumentException("Scanner context cannot be null");<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      RpcCallContext rpcCall = RpcServer.getCurrentCall();<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span><a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>      // Save the initial progress from the Scanner context in these local variables. The progress<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      // may need to be reset a few times if rows are being filtered out so we save the initial<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      // progress.<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      int initialBatchProgress = scannerContext.getBatchProgress();<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>      long initialSizeProgress = scannerContext.getSizeProgress();<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>      long initialTimeProgress = scannerContext.getTimeProgress();<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      // The loop here is used only when at some point during the next we determine<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      // that due to effects of filters or otherwise, we have an empty row in the result.<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>      // Then we loop and try again. Otherwise, we must get out on the first iteration via return,<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>      // "true" if there's more data to read, "false" if there isn't (storeHeap is at a stop row,<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>      // and joinedHeap has no more data to read for the last row (if set, joinedContinuationRow).<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>      while (true) {<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>        // Starting to scan a new row. Reset the scanner progress according to whether or not<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>        // progress should be kept.<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>        if (scannerContext.getKeepProgress()) {<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>          // Progress should be kept. Reset to initial values seen at start of method invocation.<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>          scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>            initialTimeProgress);<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        } else {<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>          scannerContext.clearProgress();<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        }<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>        if (rpcCall != null) {<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>          // If a user specifies a too-restrictive or too-slow scanner, the<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>          // client might time out and disconnect while the server side<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>          // is still processing the request. We should abort aggressively<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>          // in that case.<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>          long afterTime = rpcCall.disconnectSince();<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>          if (afterTime &gt;= 0) {<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>            throw new CallerDisconnectedException(<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>                "Aborting on region " + getRegionInfo().getRegionNameAsString() + ", call " +<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>                    this + " after " + afterTime + " ms, since " +<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>                    "caller disconnected");<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          }<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span><a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>        // Let's see what we have in the storeHeap.<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>        Cell current = this.storeHeap.peek();<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span><a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>        boolean stopRow = isStopRow(current);<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // When has filter row is true it means that the all the cells for a particular row must be<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        // read before a filtering decision can be made. This means that filters where hasFilterRow<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>        // run the risk of encountering out of memory errors in the case that they are applied to a<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>        // table that has very large rows.<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>        boolean hasFilterRow = this.filter != null &amp;&amp; this.filter.hasFilterRow();<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span><a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>        // If filter#hasFilterRow is true, partial results are not allowed since allowing them<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>        // would prevent the filters from being evaluated. Thus, if it is true, change the<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>        // scope of any limits that could potentially create partial results to<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>        // LimitScope.BETWEEN_ROWS so that those limits are not reached mid-row<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>        if (hasFilterRow) {<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>          if (LOG.isTraceEnabled()) {<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>            LOG.trace("filter#hasFilterRow is true which prevents partial results from being "<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>                + " formed. Changing scope of limits that may create partials");<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span>          }<a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>          scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>          scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>        }<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span><a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>        // Check if we were getting data from the joinedHeap and hit the limit.<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>        // If not, then it's main path - getting results from storeHeap.<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>        if (joinedContinuationRow == null) {<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>          // First, check if we are at a stop row. If so, there are no more results.<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>          if (stopRow) {<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>            if (hasFilterRow) {<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>              filter.filterRowCells(results);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>            }<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>          }<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span><a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>          // Check if rowkey filter wants to exclude this row. If so, loop to next.<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>          // Technically, if we hit limits before on this row, we don't need this call.<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>          if (filterRowKey(current)) {<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>            // Typically the count of rows scanned is incremented inside #populateResult. However,<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>            // here we are filtering a row based purely on its row key, preventing us from calling<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>            // #populateResult. Thus, perform the necessary increment here to rows scanned metric<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>            incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>            if (!moreRows) {<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>            }<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>            results.clear();<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>            continue;<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>          }<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span><a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>          // Ok, we are good, let's try to get some results from the main heap.<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>          populateResult(results, this.storeHeap, scannerContext, current);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>            if (hasFilterRow) {<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>              throw new IncompatibleFilterException(<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>                  "Filter whose hasFilterRow() returns true is incompatible with scans that must "<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>                      + " stop mid-row because of a limit. ScannerContext:" + scannerContext);<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>            }<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>            return true;<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>          }<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span><a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>          Cell nextKv = this.storeHeap.peek();<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>          stopRow = nextKv == null || isStopRow(nextKv);<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>          // save that the row was empty before filters applied to it.<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>          final boolean isEmptyRow = results.isEmpty();<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span><a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>          // We have the part of the row necessary for filtering (all of it, usually).<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>          // First filter with the filterRow(List).<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>          FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>          if (hasFilterRow) {<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>            ret = filter.filterRowCellsWithRet(results);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span><a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>            // We don't know how the results have changed after being filtered. Must set progress<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>            // according to contents of results now. However, a change in the results should not<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>            // affect the time progress. Thus preserve whatever time progress has been made<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>            long timeProgress = scannerContext.getTimeProgress();<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>            if (scannerContext.getKeepProgress()) {<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>              scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>                initialTimeProgress);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>            } else {<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>              scannerContext.clearProgress();<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>            }<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>            scannerContext.setTimeProgress(timeProgress);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>            scannerContext.incrementBatchProgress(results.size());<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>            for (Cell cell : results) {<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>              scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOf(cell));<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>            }<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>          }<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span><a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>          if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>            results.clear();<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>            if (!moreRows) {<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>            }<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>            // This row was totally filtered out, if this is NOT the last row,<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>            // we should continue on. Otherwise, nothing else to do.<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>            if (!stopRow) continue;<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>          }<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>          // Ok, we are done with storeHeap for this row.<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>          // Now we may need to fetch additional, non-essential data into row.<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>          // These values are not needed for filter to work, so we postpone their<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>          // fetch to (possibly) reduce amount of data loads from disk.<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>          if (this.joinedHeap != null) {<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>            boolean mayHaveData = joinedHeapMayHaveData(current);<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>            if (mayHaveData) {<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>              joinedContinuationRow = current;<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>              populateFromJoinedHeap(results, scannerContext);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span><a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>              if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>                return true;<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>              }<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>            }<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>          }<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>        } else {<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>          // Populating from the joined heap was stopped by limits, populate some more.<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>          populateFromJoinedHeap(results, scannerContext);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>            return true;<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>          }<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>        }<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>        // We may have just called populateFromJoinedMap and hit the limits. If that is<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>        // the case, we need to call it again on the next next() invocation.<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span>        if (joinedContinuationRow != null) {<a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>        }<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span><a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>        // Finally, we are done with both joinedHeap and storeHeap.<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>        // Double check to prevent empty rows from appearing in result. It could be<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>        // the case when SingleColumnValueExcludeFilter is used.<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>        if (results.isEmpty()) {<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>          incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>          boolean moreRows = nextRow(scannerContext, current);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>          if (!moreRows) {<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>          }<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>          if (!stopRow) continue;<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>        }<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>        if (stopRow) {<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>        } else {<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>        }<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      }<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    }<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span><a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    protected void incrementCountOfRowsFilteredMetric(ScannerContext scannerContext) {<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span><a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      scannerContext.getMetrics().countOfRowsFiltered.incrementAndGet();<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    }<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span><a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    protected void incrementCountOfRowsScannedMetric(ScannerContext scannerContext) {<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span><a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      scannerContext.getMetrics().countOfRowsScanned.incrementAndGet();<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    }<a name="line.6035"></a>
-<span

<TRUNCATED>

[30/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html
index 704e192..e5d9af6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Listener.Reader.html
@@ -92,2526 +92,2571 @@
 <span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.conf.ConfigurationObserver;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.exceptions.RegionMovedException;<a name="line.85"></a>
 <span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.User;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.io.BytesWritable;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.io.IntWritable;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.io.Writable;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.io.WritableUtils;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.util.StringUtils;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.htrace.TraceInfo;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import com.google.protobuf.BlockingService;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import com.google.protobuf.CodedInputStream;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import com.google.protobuf.Message;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import com.google.protobuf.ServiceException;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.140"></a>
-<span class="sourceLineNo">141</span> *<a name="line.141"></a>
-<span class="sourceLineNo">142</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.142"></a>
-<span class="sourceLineNo">143</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.143"></a>
-<span class="sourceLineNo">144</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.144"></a>
-<span class="sourceLineNo">145</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.145"></a>
-<span class="sourceLineNo">146</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.146"></a>
-<span class="sourceLineNo">147</span> * and loops till done.<a name="line.147"></a>
-<span class="sourceLineNo">148</span> *<a name="line.148"></a>
-<span class="sourceLineNo">149</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.149"></a>
-<span class="sourceLineNo">150</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.150"></a>
-<span class="sourceLineNo">151</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.151"></a>
-<span class="sourceLineNo">152</span> * and keep taking while the server is up.<a name="line.152"></a>
-<span class="sourceLineNo">153</span> *<a name="line.153"></a>
-<span class="sourceLineNo">154</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.154"></a>
-<span class="sourceLineNo">155</span> * queue for Responder to pull from and return result to client.<a name="line.155"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferInputStream;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.User;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.io.BytesWritable;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.io.IntWritable;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.io.Writable;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.io.WritableUtils;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.util.StringUtils;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.htrace.TraceInfo;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import com.google.protobuf.BlockingService;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import com.google.protobuf.CodedInputStream;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import com.google.protobuf.CodedOutputStream;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import com.google.protobuf.Message;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import com.google.protobuf.ServiceException;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.143"></a>
+<span class="sourceLineNo">144</span> *<a name="line.144"></a>
+<span class="sourceLineNo">145</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.145"></a>
+<span class="sourceLineNo">146</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.146"></a>
+<span class="sourceLineNo">147</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.147"></a>
+<span class="sourceLineNo">148</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.148"></a>
+<span class="sourceLineNo">149</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.149"></a>
+<span class="sourceLineNo">150</span> * and loops till done.<a name="line.150"></a>
+<span class="sourceLineNo">151</span> *<a name="line.151"></a>
+<span class="sourceLineNo">152</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.152"></a>
+<span class="sourceLineNo">153</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.153"></a>
+<span class="sourceLineNo">154</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.154"></a>
+<span class="sourceLineNo">155</span> * and keep taking while the server is up.<a name="line.155"></a>
 <span class="sourceLineNo">156</span> *<a name="line.156"></a>
-<span class="sourceLineNo">157</span> * @see RpcClientImpl<a name="line.157"></a>
-<span class="sourceLineNo">158</span> */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.159"></a>
-<span class="sourceLineNo">160</span>@InterfaceStability.Evolving<a name="line.160"></a>
-<span class="sourceLineNo">161</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      = new CallQueueTooBigException();<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final boolean authorize;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private boolean isSecurityEnabled;<a name="line.168"></a>
+<span class="sourceLineNo">157</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.157"></a>
+<span class="sourceLineNo">158</span> * queue for Responder to pull from and return result to client.<a name="line.158"></a>
+<span class="sourceLineNo">159</span> *<a name="line.159"></a>
+<span class="sourceLineNo">160</span> * @see RpcClientImpl<a name="line.160"></a>
+<span class="sourceLineNo">161</span> */<a name="line.161"></a>
+<span class="sourceLineNo">162</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.162"></a>
+<span class="sourceLineNo">163</span>@InterfaceStability.Evolving<a name="line.163"></a>
+<span class="sourceLineNo">164</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      = new CallQueueTooBigException();<a name="line.168"></a>
 <span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public static final byte CURRENT_VERSION = 0;<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<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>   * How many calls/handler are allowed in the queue.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * The maximum size that we can hold in the RPC queue<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private final IPCUtil ipcUtil;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    Server.class.getName());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  protected ServiceAuthorizationManager authManager;<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * after the call returns.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   */<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  protected final InetSocketAddress bindAddress;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  protected int port;                             // port we listen on<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private int readThreads;                        // number of read threads<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.210"></a>
-<span class="sourceLineNo">211</span>                                                  // which a client may be<a name="line.211"></a>
-<span class="sourceLineNo">212</span>                                                  // disconnected<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.213"></a>
-<span class="sourceLineNo">214</span>                                                  // connections after which we<a name="line.214"></a>
-<span class="sourceLineNo">215</span>                                                  // will start cleaning up idle<a name="line.215"></a>
-<span class="sourceLineNo">216</span>                                                  // connections<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.217"></a>
-<span class="sourceLineNo">218</span>                                                  // connections to nuke<a name="line.218"></a>
-<span class="sourceLineNo">219</span>                                                  // during a cleanup<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  protected MetricsHBaseServer metrics;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  protected final Configuration conf;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private int maxQueueSize;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  protected int socketSendBufferSize;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  volatile boolean running = true;<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>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * for business by the call to {@link #start()}.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  volatile boolean started = false;<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>   * This is a running count of the size of all outstanding calls by size.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  protected final Counter callQueueSize = new Counter();<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  //maintain a list<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  //of client connections<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private Listener listener = null;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  protected Responder responder = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  protected int numConnections = 0;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.261"></a>
+<span class="sourceLineNo">170</span>  private final boolean authorize;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private boolean isSecurityEnabled;<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public static final byte CURRENT_VERSION = 0;<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * How many calls/handler are allowed in the queue.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * The maximum size that we can hold in the RPC queue<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private final IPCUtil ipcUtil;<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    Server.class.getName());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  protected ServiceAuthorizationManager authManager;<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * after the call returns.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   */<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected final InetSocketAddress bindAddress;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected int port;                             // port we listen on<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  private int readThreads;                        // number of read threads<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.213"></a>
+<span class="sourceLineNo">214</span>                                                  // which a client may be<a name="line.214"></a>
+<span class="sourceLineNo">215</span>                                                  // disconnected<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.216"></a>
+<span class="sourceLineNo">217</span>                                                  // connections after which we<a name="line.217"></a>
+<span class="sourceLineNo">218</span>                                                  // will start cleaning up idle<a name="line.218"></a>
+<span class="sourceLineNo">219</span>                                                  // connections<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.220"></a>
+<span class="sourceLineNo">221</span>                                                  // connections to nuke<a name="line.221"></a>
+<span class="sourceLineNo">222</span>                                                  // during a cleanup<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected MetricsHBaseServer metrics;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  protected final Configuration conf;<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private int maxQueueSize;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  protected int socketSendBufferSize;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  volatile boolean running = true;<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * for business by the call to {@link #start()}.<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  volatile boolean started = false;<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  /**<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * This is a running count of the size of all outstanding calls by size.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  protected final Counter callQueueSize = new Counter();<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  //maintain a list<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  //of client connections<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private Listener listener = null;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  protected Responder responder = null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  protected int numConnections = 0;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  /** Default value for above params */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  private final int warnResponseTime;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private final int warnResponseSize;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  private final Server server;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  private final RpcScheduler scheduler;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>  private UserProvider userProvider;<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  private final BoundedByteBufferPool reservoir;<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * the result.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  class Call implements RpcCallContext {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    protected int id;                             // the client's call id<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    protected BlockingService service;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    protected MethodDescriptor md;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    protected RequestHeader header;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    protected Message param;                      // the parameter passed<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    // Optional cell data passed outside of protobufs.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    protected CellScanner cellScanner;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    protected Connection connection;              // connection to client<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    protected long timestamp;      // the time received when response is null<a name="line.295"></a>
-<span class="sourceLineNo">296</span>                                   // the time served when response is not null<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
-<span class="sourceLineNo">298</span>     * Chain of buffers to send as response.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>     */<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    protected BufferChain response;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    protected Responder responder;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    protected long size;                          // size of current call<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    protected boolean isError;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    protected TraceInfo tinfo;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    private ByteBuffer cellBlock = null;<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private User user;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private InetAddress remoteAddress;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RpcCallback callback;<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private long responseCellSize = 0;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private long responseBlockSize = 0;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private boolean retryImmediatelySupported;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.318"></a>
-<span class="sourceLineNo">319</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.id = id;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.service = service;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.md = md;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.header = header;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      this.param = param;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      this.cellScanner = cellScanner;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      this.connection = connection;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      this.timestamp = System.currentTimeMillis();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      this.response = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      this.responder = responder;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      this.isError = false;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.size = size;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.tinfo = tinfo;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.remoteAddress = remoteAddress;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.retryImmediatelySupported =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    /**<a name="line.340"></a>
-<span class="sourceLineNo">341</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.341"></a>
-<span class="sourceLineNo">342</span>     * cleanup.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>     */<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    void done() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        // Return buffer to reservoir now we are done with it.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        reservoir.putBuffer(this.cellBlock);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        this.cellBlock = null;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>    @Override<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    public String toString() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      return toShortString() + " param: " +<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        " connection: " + connection.toString();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>    protected RequestHeader getHeader() {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      return this.header;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    /*<a name="line.366"></a>
-<span class="sourceLineNo">367</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.367"></a>
-<span class="sourceLineNo">368</span>     * the payload of a command<a name="line.368"></a>
-<span class="sourceLineNo">369</span>     */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    String toShortString() {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      String serviceName = this.connection.service != null ?<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          " connection: " + connection.toString();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    String toTraceString() {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      String serviceName = this.connection.service != null ?<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return serviceName + "." + methodName;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      this.response = new BufferChain(response);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        Throwable t, String errorMsg) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      if (this.isError) return;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (t != null) this.isError = true;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      BufferChain bc = null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      try {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        // Presume it a pb Message.  Could be null.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        Message result = (Message)m;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        // Call id.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        headerBuilder.setCallId(this.id);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (t != null) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (t instanceof RegionMovedException) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.408"></a>
-<span class="sourceLineNo">409</span>            // any kind of payload.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          // Set the exception as the result of the method invocation.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        if (this.cellBlock != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        Message header = headerBuilder.build();<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>        // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        // one big byte array; save on allocations.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        ByteBuffer bbHeader = IPCUtil.getDelimitedMessageAsByteBuffer(header);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        ByteBuffer bbResult = IPCUtil.getDelimitedMessageAsByteBuffer(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        int totalSize = bbHeader.capacity() + (bbResult == null? 0: bbResult.limit()) +<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (this.cellBlock == null? 0: this.cellBlock.limit());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        ByteBuffer bbTotalSize = ByteBuffer.wrap(Bytes.toBytes(totalSize));<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        bc = new BufferChain(bbTotalSize, bbHeader, bbResult, this.cellBlock);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        if (connection.useWrap) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          bc = wrapWithSasl(bc);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      } catch (IOException e) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        LOG.warn("Exception while creating response " + e);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      this.response = bc;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (this.callback != null) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          this.callback.run();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        } catch (Exception e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          // Don't allow any exception here to kill this handler thread.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private BufferChain wrapWithSasl(BufferChain bc)<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        throws IOException {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      if (!this.connection.useSasl) return bc;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // Looks like no way around this; saslserver wants a byte array.  I have to make it one.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // THIS IS A BIG UGLY COPY.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      byte [] responseBytes = bc.getBytes();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      byte [] token;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // synchronization may be needed since there can be multiple Handler<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      // threads using saslServer to wrap responses.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      synchronized (connection.saslServer) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        token = connection.saslServer.wrap(responseBytes, 0, responseBytes.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      if (LOG.isTraceEnabled()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        LOG.trace("Adding saslServer wrapped token of size " + token.length<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            + " as call response.");<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>      ByteBuffer bbTokenLength = ByteBuffer.wrap(Bytes.toBytes(token.length));<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      ByteBuffer bbTokenBytes = ByteBuffer.wrap(token);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return new BufferChain(bbTokenLength, bbTokenBytes);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public boolean isClientCellBlockSupported() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      return this.connection != null &amp;&amp; this.connection.codec != null;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>    @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    public long disconnectSince() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (!connection.channel.isOpen()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        return System.currentTimeMillis() - timestamp;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      } else {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        return -1L;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>    public long getSize() {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      return this.size;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>    public long getResponseCellSize() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return responseCellSize;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    public void incrementResponseCellSize(long cellSize) {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      responseCellSize += cellSize;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    @Override<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    public long getResponseBlockSize() {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return responseBlockSize;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    @Override<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    public void incrementResponseBlockSize(long blockSize) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      responseBlockSize += blockSize;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    public synchronized void sendResponseIfReady() throws IOException {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.responder.doRespond(this);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    public UserGroupInformation getRemoteUser() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      return connection.ugi;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    @Override<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    public User getRequestUser() {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      return user;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    @Override<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    public String getRequestUserName() {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      User user = getRequestUser();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return user == null? null: user.getShortName();<a name="line.531"></a>
+<span class="sourceLineNo">263</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  /** Default value for above params */<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  private final int warnResponseTime;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  private final int warnResponseSize;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  private final Server server;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  private final RpcScheduler scheduler;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  private UserProvider userProvider;<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>  private final BoundedByteBufferPool reservoir;<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * the result.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  class Call implements RpcCallContext {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int id;                             // the client's call id<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    protected BlockingService service;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    protected MethodDescriptor md;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    protected RequestHeader header;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    protected Message param;                      // the parameter passed<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // Optional cell data passed outside of protobufs.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    protected CellScanner cellScanner;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    protected Connection connection;              // connection to client<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    protected long timestamp;      // the time received when response is null<a name="line.298"></a>
+<span class="sourceLineNo">299</span>                                   // the time served when response is not null<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    /**<a name="line.300"></a>
+<span class="sourceLineNo">301</span>     * Chain of buffers to send as response.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>     */<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    protected BufferChain response;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    protected Responder responder;<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    protected long size;                          // size of current call<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    protected boolean isError;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    protected TraceInfo tinfo;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    private ByteBuffer cellBlock = null;<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    private User user;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    private InetAddress remoteAddress;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    private RpcCallback callback;<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private long responseCellSize = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private long responseBlockSize = 0;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    private boolean retryImmediatelySupported;<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.321"></a>
+<span class="sourceLineNo">322</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.322"></a>
+<span class="sourceLineNo">323</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      this.id = id;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      this.service = service;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      this.md = md;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      this.header = header;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      this.param = param;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      this.cellScanner = cellScanner;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      this.connection = connection;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.timestamp = System.currentTimeMillis();<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.response = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      this.responder = responder;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      this.isError = false;<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      this.size = size;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.tinfo = tinfo;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.remoteAddress = remoteAddress;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.retryImmediatelySupported =<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    /**<a name="line.343"></a>
+<span class="sourceLineNo">344</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.344"></a>
+<span class="sourceLineNo">345</span>     * cleanup.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>     */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    void done() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        // Return buffer to reservoir now we are done with it.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        reservoir.putBuffer(this.cellBlock);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        this.cellBlock = null;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    @Override<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    public String toString() {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      return toShortString() + " param: " +<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        " connection: " + connection.toString();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    protected RequestHeader getHeader() {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      return this.header;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>    /*<a name="line.369"></a>
+<span class="sourceLineNo">370</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.370"></a>
+<span class="sourceLineNo">371</span>     * the payload of a command<a name="line.371"></a>
+<span class="sourceLineNo">372</span>     */<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    String toShortString() {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      String serviceName = this.connection.service != null ?<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          " connection: " + connection.toString();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    String toTraceString() {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      String serviceName = this.connection.service != null ?<a name="line.383"></a>
+<span class="sourceLineNo">384</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return serviceName + "." + methodName;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      this.response = new BufferChain(response);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        Throwable t, String errorMsg) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      if (this.isError) return;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      if (t != null) this.isError = true;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      BufferChain bc = null;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      try {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        // Presume it a pb Message.  Could be null.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        Message result = (Message)m;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        // Call id.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        headerBuilder.setCallId(this.id);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (t != null) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (t instanceof RegionMovedException) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            // any kind of payload.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          // Set the exception as the result of the method invocation.<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        if (this.cellBlock != null) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        Message header = headerBuilder.build();<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>        byte[] b = createHeaderAndMessageBytes(result, header);<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>        bc = new BufferChain(ByteBuffer.wrap(b), this.cellBlock);<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>        if (connection.useWrap) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          bc = wrapWithSasl(bc);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      } catch (IOException e) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        LOG.warn("Exception while creating response " + e);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      this.response = bc;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      if (this.callback != null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          this.callback.run();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        } catch (Exception e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          // Don't allow any exception here to kill this handler thread.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>    private byte[] createHeaderAndMessageBytes(Message result, Message header)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // one big byte array; save on allocations.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      int headerSerializedSize = 0, resultSerializedSize = 0, headerVintSize = 0,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          resultVintSize = 0;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (header != null) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        headerSerializedSize = header.getSerializedSize();<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        headerVintSize = CodedOutputStream.computeRawVarint32Size(headerSerializedSize);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (result != null) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        resultSerializedSize = result.getSerializedSize();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        resultVintSize = CodedOutputStream.computeRawVarint32Size(resultSerializedSize);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      // calculate the total size<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      int totalSize = headerSerializedSize + headerVintSize<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          + (resultSerializedSize + resultVintSize)<a name="line.472"></a>
+<span class="sourceLineNo">473</span>          + (this.cellBlock == null ? 0 : this.cellBlock.limit());<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // The byte[] should also hold the totalSize of the header, message and the cellblock<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      byte[] b = new byte[headerSerializedSize + headerVintSize + resultSerializedSize<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          + resultVintSize + Bytes.SIZEOF_INT];<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      // The RpcClient expects the int to be in a format that code be decoded by<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // the DataInputStream#readInt(). Hence going with the Bytes.toBytes(int)<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // form of writing int.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Bytes.putInt(b, 0, totalSize);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      CodedOutputStream cos = CodedOutputStream.newInstance(b, Bytes.SIZEOF_INT,<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          b.length - Bytes.SIZEOF_INT);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (header != null) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        cos.writeMessageNoTag(header);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      if (result != null) {<a name="line.486"></a>
+<span class="sourceLineNo">487

<TRUNCATED>

[35/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html
index b59d17d..caf98ca 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html
@@ -907,428 +907,430 @@
 <span class="sourceLineNo">899</span>        cellBlockBuilder.setLength(cellBlock.limit());<a name="line.899"></a>
 <span class="sourceLineNo">900</span>        builder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.900"></a>
 <span class="sourceLineNo">901</span>      }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      // Only pass priority if there one.  Let zero be same as no priority.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      if (priority != 0) builder.setPriority(priority);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      RequestHeader header = builder.build();<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>      setupIOstreams();<a name="line.906"></a>
+<span class="sourceLineNo">902</span>      // Only pass priority if there is one set.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>      if (priority != PayloadCarryingRpcController.PRIORITY_UNSET) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        builder.setPriority(priority);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      RequestHeader header = builder.build();<a name="line.906"></a>
 <span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // Now we're going to write the call. We take the lock, then check that the connection<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      //  is still valid, and, if so we do the write to the socket. If the write fails, we don't<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      //  know where we stand, we have to close the connection.<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      checkIsOpen();<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      IOException writeException = null;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      synchronized (this.outLock) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>        if (Thread.interrupted()) throw new InterruptedIOException();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>        calls.put(call.id, call); // We put first as we don't want the connection to become idle.<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        checkIsOpen(); // Now we're checking that it didn't became idle in between.<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>        try {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>          call.callStats.setRequestSizeBytes(IPCUtil.write(this.out, header, call.param,<a name="line.920"></a>
-<span class="sourceLineNo">921</span>              cellBlock));<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        } catch (IOException e) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          // We set the value inside the synchronized block, this way the next in line<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          //  won't even try to write. Otherwise we might miss a call in the calls map?<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          shouldCloseConnection.set(true);<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          writeException = e;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          interrupt();<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        }<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // call close outside of the synchronized (outLock) to prevent deadlock - HBASE-14474<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (writeException != null) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        markClosed(writeException);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        close();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>      // We added a call, and may be started the connection close. In both cases, we<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      //  need to notify the reader.<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      doNotify();<a name="line.939"></a>
-<span class="sourceLineNo">940</span><a name="line.940"></a>
-<span class="sourceLineNo">941</span>      // Now that we notified, we can rethrow the exception if any. Otherwise we're good.<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      if (writeException != null) throw writeException;<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    }<a name="line.943"></a>
-<span class="sourceLineNo">944</span><a name="line.944"></a>
-<span class="sourceLineNo">945</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NN_NAKED_NOTIFY",<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        justification="Presume notifyAll is because we are closing/shutting down")<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    private synchronized void doNotify() {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      // Make a separate method so can do synchronize and add findbugs annotation; only one<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      // annotation at at time in source 1.7.<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      notifyAll(); // Findbugs: NN_NAKED_NOTIFY<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>    /* Receive a response.<a name="line.953"></a>
-<span class="sourceLineNo">954</span>     * Because only one receiver, so no synchronization on in.<a name="line.954"></a>
-<span class="sourceLineNo">955</span>     */<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    protected void readResponse() {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      if (shouldCloseConnection.get()) return;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      Call call = null;<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      boolean expectedCall = false;<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      try {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>        // See HBaseServer.Call.setResponse for where we write out the response.<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        // Total size of the response.  Unused.  But have to read it in anyways.<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        int totalSize = in.readInt();<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>        // Read the header<a name="line.965"></a>
-<span class="sourceLineNo">966</span>        ResponseHeader responseHeader = ResponseHeader.parseDelimitedFrom(in);<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        int id = responseHeader.getCallId();<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        call = calls.remove(id); // call.done have to be set before leaving this method<a name="line.968"></a>
-<span class="sourceLineNo">969</span>        expectedCall = (call != null &amp;&amp; !call.done);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        if (!expectedCall) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>          // So we got a response for which we have no corresponding 'call' here on the client-side.<a name="line.971"></a>
-<span class="sourceLineNo">972</span>          // We probably timed out waiting, cleaned up all references, and now the server decides<a name="line.972"></a>
-<span class="sourceLineNo">973</span>          // to return a response.  There is nothing we can do w/ the response at this stage. Clean<a name="line.973"></a>
-<span class="sourceLineNo">974</span>          // out the wire of the response so its out of the way and we can get other responses on<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          // this connection.<a name="line.975"></a>
-<span class="sourceLineNo">976</span>          int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>          int whatIsLeftToRead = totalSize - readSoFar;<a name="line.977"></a>
-<span class="sourceLineNo">978</span>          IOUtils.skipFully(in, whatIsLeftToRead);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>          if (call != null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            call.callStats.setResponseSizeBytes(totalSize);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>            call.callStats.setCallTimeMs(<a name="line.981"></a>
-<span class="sourceLineNo">982</span>                EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.982"></a>
-<span class="sourceLineNo">983</span>          }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>          return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        if (responseHeader.hasException()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>          ExceptionResponse exceptionResponse = responseHeader.getException();<a name="line.987"></a>
-<span class="sourceLineNo">988</span>          RemoteException re = createRemoteException(exceptionResponse);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          call.setException(re);<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.990"></a>
-<span class="sourceLineNo">991</span>          call.callStats.setCallTimeMs(<a name="line.991"></a>
-<span class="sourceLineNo">992</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          if (isFatalConnectionException(exceptionResponse)) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>            markClosed(re);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>          }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        } else {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>          Message value = null;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          if (call.responseDefaultType != null) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>            Builder builder = call.responseDefaultType.newBuilderForType();<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            ProtobufUtil.mergeDelimitedFrom(builder, in);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>            value = builder.build();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          }<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          CellScanner cellBlockScanner = null;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          if (responseHeader.hasCellBlockMeta()) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            int size = responseHeader.getCellBlockMeta().getLength();<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            byte [] cellBlock = new byte[size];<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            IOUtils.readFully(this.in, cellBlock, 0, cellBlock.length);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>            cellBlockScanner = ipcUtil.createCellScanner(this.codec, this.compressor, cellBlock);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>          call.setResponse(value, cellBlockScanner);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>          call.callStats.setCallTimeMs(<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      } catch (IOException e) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        if (expectedCall) call.setException(e);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        if (e instanceof SocketTimeoutException) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          // Clean up open calls but don't treat this as a fatal condition,<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          // since we expect certain responses to not make it by the specified<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          // {@link ConnectionId#rpcTimeout}.<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          if (LOG.isTraceEnabled()) LOG.trace("ignored", e);<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        } else {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>          // Treat this as a fatal condition and close this connection<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>          markClosed(e);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>        }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      } finally {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        cleanupCalls(false);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    }<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    /**<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * @return True if the exception is a fatal connection exception.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     */<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    private boolean isFatalConnectionException(final ExceptionResponse e) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      return e.getExceptionClassName().<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        equals(FatalConnectionException.class.getName());<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    /**<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>     * @param e exception to be wrapped<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>     * @return RemoteException made from passed &lt;code&gt;e&lt;/code&gt;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>     */<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    private RemoteException createRemoteException(final ExceptionResponse e) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      String innerExceptionClassName = e.getExceptionClassName();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      boolean doNotRetry = e.getDoNotRetry();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      return e.hasHostname()?<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        // If a hostname then add it to the RemoteWithExtrasException<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          e.getStackTrace(), e.getHostname(), e.getPort(), doNotRetry):<a name="line.1049"></a>
+<span class="sourceLineNo">908</span>      setupIOstreams();<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>      // Now we're going to write the call. We take the lock, then check that the connection<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      //  is still valid, and, if so we do the write to the socket. If the write fails, we don't<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      //  know where we stand, we have to close the connection.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      checkIsOpen();<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      IOException writeException = null;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      synchronized (this.outLock) {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        if (Thread.interrupted()) throw new InterruptedIOException();<a name="line.916"></a>
+<span class="sourceLineNo">917</span><a name="line.917"></a>
+<span class="sourceLineNo">918</span>        calls.put(call.id, call); // We put first as we don't want the connection to become idle.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>        checkIsOpen(); // Now we're checking that it didn't became idle in between.<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>        try {<a name="line.921"></a>
+<span class="sourceLineNo">922</span>          call.callStats.setRequestSizeBytes(IPCUtil.write(this.out, header, call.param,<a name="line.922"></a>
+<span class="sourceLineNo">923</span>              cellBlock));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        } catch (IOException e) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          // We set the value inside the synchronized block, this way the next in line<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          //  won't even try to write. Otherwise we might miss a call in the calls map?<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          shouldCloseConnection.set(true);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          writeException = e;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          interrupt();<a name="line.929"></a>
+<span class="sourceLineNo">930</span>        }<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      // call close outside of the synchronized (outLock) to prevent deadlock - HBASE-14474<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (writeException != null) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        markClosed(writeException);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        close();<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
+<span class="sourceLineNo">938</span><a name="line.938"></a>
+<span class="sourceLineNo">939</span>      // We added a call, and may be started the connection close. In both cases, we<a name="line.939"></a>
+<span class="sourceLineNo">940</span>      //  need to notify the reader.<a name="line.940"></a>
+<span class="sourceLineNo">941</span>      doNotify();<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>      // Now that we notified, we can rethrow the exception if any. Otherwise we're good.<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (writeException != null) throw writeException;<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NN_NAKED_NOTIFY",<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        justification="Presume notifyAll is because we are closing/shutting down")<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    private synchronized void doNotify() {<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // Make a separate method so can do synchronize and add findbugs annotation; only one<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      // annotation at at time in source 1.7.<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      notifyAll(); // Findbugs: NN_NAKED_NOTIFY<a name="line.952"></a>
+<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
+<span class="sourceLineNo">954</span><a name="line.954"></a>
+<span class="sourceLineNo">955</span>    /* Receive a response.<a name="line.955"></a>
+<span class="sourceLineNo">956</span>     * Because only one receiver, so no synchronization on in.<a name="line.956"></a>
+<span class="sourceLineNo">957</span>     */<a name="line.957"></a>
+<span class="sourceLineNo">958</span>    protected void readResponse() {<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      if (shouldCloseConnection.get()) return;<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      Call call = null;<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      boolean expectedCall = false;<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      try {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>        // See HBaseServer.Call.setResponse for where we write out the response.<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        // Total size of the response.  Unused.  But have to read it in anyways.<a name="line.964"></a>
+<span class="sourceLineNo">965</span>        int totalSize = in.readInt();<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>        // Read the header<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        ResponseHeader responseHeader = ResponseHeader.parseDelimitedFrom(in);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        int id = responseHeader.getCallId();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        call = calls.remove(id); // call.done have to be set before leaving this method<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        expectedCall = (call != null &amp;&amp; !call.done);<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        if (!expectedCall) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          // So we got a response for which we have no corresponding 'call' here on the client-side.<a name="line.973"></a>
+<span class="sourceLineNo">974</span>          // We probably timed out waiting, cleaned up all references, and now the server decides<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          // to return a response.  There is nothing we can do w/ the response at this stage. Clean<a name="line.975"></a>
+<span class="sourceLineNo">976</span>          // out the wire of the response so its out of the way and we can get other responses on<a name="line.976"></a>
+<span class="sourceLineNo">977</span>          // this connection.<a name="line.977"></a>
+<span class="sourceLineNo">978</span>          int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.978"></a>
+<span class="sourceLineNo">979</span>          int whatIsLeftToRead = totalSize - readSoFar;<a name="line.979"></a>
+<span class="sourceLineNo">980</span>          IOUtils.skipFully(in, whatIsLeftToRead);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>          if (call != null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>            call.callStats.setResponseSizeBytes(totalSize);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>            call.callStats.setCallTimeMs(<a name="line.983"></a>
+<span class="sourceLineNo">984</span>                EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.984"></a>
+<span class="sourceLineNo">985</span>          }<a name="line.985"></a>
+<span class="sourceLineNo">986</span>          return;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (responseHeader.hasException()) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          ExceptionResponse exceptionResponse = responseHeader.getException();<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          RemoteException re = createRemoteException(exceptionResponse);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          call.setException(re);<a name="line.991"></a>
+<span class="sourceLineNo">992</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>          call.callStats.setCallTimeMs(<a name="line.993"></a>
+<span class="sourceLineNo">994</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.994"></a>
+<span class="sourceLineNo">995</span>          if (isFatalConnectionException(exceptionResponse)) {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>            markClosed(re);<a name="line.996"></a>
+<span class="sourceLineNo">997</span>          }<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        } else {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>          Message value = null;<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>          if (call.responseDefaultType != null) {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>            Builder builder = call.responseDefaultType.newBuilderForType();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>            ProtobufUtil.mergeDelimitedFrom(builder, in);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>            value = builder.build();<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          }<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>          CellScanner cellBlockScanner = null;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          if (responseHeader.hasCellBlockMeta()) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>            int size = responseHeader.getCellBlockMeta().getLength();<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>            byte [] cellBlock = new byte[size];<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>            IOUtils.readFully(this.in, cellBlock, 0, cellBlock.length);<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>            cellBlockScanner = ipcUtil.createCellScanner(this.codec, this.compressor, cellBlock);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>          call.setResponse(value, cellBlockScanner);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>          call.callStats.setCallTimeMs(<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      } catch (IOException e) {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        if (expectedCall) call.setException(e);<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        if (e instanceof SocketTimeoutException) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>          // Clean up open calls but don't treat this as a fatal condition,<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>          // since we expect certain responses to not make it by the specified<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>          // {@link ConnectionId#rpcTimeout}.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>          if (LOG.isTraceEnabled()) LOG.trace("ignored", e);<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>        } else {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>          // Treat this as a fatal condition and close this connection<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>          markClosed(e);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      } finally {<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>        cleanupCalls(false);<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span><a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    /**<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>     * @return True if the exception is a fatal connection exception.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>     */<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    private boolean isFatalConnectionException(final ExceptionResponse e) {<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>      return e.getExceptionClassName().<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        equals(FatalConnectionException.class.getName());<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span><a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    /**<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>     * @param e exception to be wrapped<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>     * @return RemoteException made from passed &lt;code&gt;e&lt;/code&gt;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>     */<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    private RemoteException createRemoteException(final ExceptionResponse e) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      String innerExceptionClassName = e.getExceptionClassName();<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>      boolean doNotRetry = e.getDoNotRetry();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>      return e.hasHostname()?<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>        // If a hostname then add it to the RemoteWithExtrasException<a name="line.1049"></a>
 <span class="sourceLineNo">1050</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          e.getStackTrace(), doNotRetry);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    protected synchronized boolean markClosed(IOException e) {<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>      if (e == null) throw new NullPointerException();<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      boolean ret = shouldCloseConnection.compareAndSet(false, true);<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      if (ret) {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        if (LOG.isTraceEnabled()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          LOG.trace(getName() + ": marking at should close, reason: " + e.getMessage());<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>        }<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (callSender != null) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          callSender.close();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        }<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        notifyAll();<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      return ret;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    /**<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>     * Cleanup the calls older than a given timeout, in milli seconds.<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>     * @param allCalls true for all calls, false for only the calls in timeout<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     */<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    protected synchronized void cleanupCalls(boolean allCalls) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      Iterator&lt;Entry&lt;Integer, Call&gt;&gt; itor = calls.entrySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      while (itor.hasNext()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        Call c = itor.next().getValue();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        if (c.done) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>          // To catch the calls without timeout that were cancelled.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>          itor.remove();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        } else if (allCalls) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>          long waitTime = EnvironmentEdgeManager.currentTime() - c.getStartTime();<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          IOException ie = new ConnectionClosingException("Connection to " + getRemoteAddress()<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>              + " is closing. Call id=" + c.id + ", waitTime=" + waitTime);<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          c.setException(ie);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          itor.remove();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        } else if (c.checkAndSetTimeout()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1051</span>          e.getStackTrace(), e.getHostname(), e.getPort(), doNotRetry):<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          e.getStackTrace(), doNotRetry);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    protected synchronized boolean markClosed(IOException e) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      if (e == null) throw new NullPointerException();<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span><a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      boolean ret = shouldCloseConnection.compareAndSet(false, true);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>      if (ret) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>        if (LOG.isTraceEnabled()) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          LOG.trace(getName() + ": marking at should close, reason: " + e.getMessage());<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>        if (callSender != null) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>          callSender.close();<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        notifyAll();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>      return ret;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span><a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>     * Cleanup the calls older than a given timeout, in milli seconds.<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>     * @param allCalls true for all calls, false for only the calls in timeout<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>     */<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    protected synchronized void cleanupCalls(boolean allCalls) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      Iterator&lt;Entry&lt;Integer, Call&gt;&gt; itor = calls.entrySet().iterator();<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      while (itor.hasNext()) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>        Call c = itor.next().getValue();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        if (c.done) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>          // To catch the calls without timeout that were cancelled.<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          itor.remove();<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        } else if (allCalls) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          long waitTime = EnvironmentEdgeManager.currentTime() - c.getStartTime();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          IOException ie = new ConnectionClosingException("Connection to " + getRemoteAddress()<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>              + " is closing. Call id=" + c.id + ", waitTime=" + waitTime);<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>          c.setException(ie);<a name="line.1088"></a>
 <span class="sourceLineNo">1089</span>          itor.remove();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        } else {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>          // We expect the call to be ordered by timeout. It may not be the case, but stopping<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          //  at the first valid call allows to be sure that we still have something to do without<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>          //  spending too much time by reading the full list.<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          break;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span><a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>  /**<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>   * Used in test only. Construct an IPC cluster client whose values are of the<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>   * {@link Message} class.<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>   * @param conf configuration<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>   * @param clusterId the cluster id<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>   * @param factory socket factory<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   */<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @VisibleForTesting<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    this(conf, clusterId, factory, null, null);<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span><a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  /**<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>   * Construct an IPC cluster client whose values are of the {@link Message} class.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>   * @param conf configuration<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>   * @param clusterId the cluster id<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>   * @param factory socket factory<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>   * @param localAddr client socket bind address<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>   * @param metrics the connection metrics<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>   */<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory,<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      SocketAddress localAddr, MetricsConnection metrics) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    super(conf, clusterId, localAddr, metrics);<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    this.socketFactory = factory;<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    this.connections = new PoolMap&lt;ConnectionId, Connection&gt;(getPoolType(conf), getPoolSize(conf));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    this.failedServers = new FailedServers(conf);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  /**<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   * Used in test only. Construct an IPC client for the cluster {@code clusterId} with<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   * the default SocketFactory<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   */<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>  @VisibleForTesting<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  RpcClientImpl(Configuration conf, String clusterId) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), null, null);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span><a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  /**<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>   * Construct an IPC client for the cluster {@code clusterId} with the default SocketFactory<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   *<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * This method is called with reflection by the RpcClientFactory to create an instance<a name="line.1141"></a>
+<span class="sourceLineNo">1090</span>        } else if (c.checkAndSetTimeout()) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>          itor.remove();<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        } else {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          // We expect the call to be ordered by timeout. It may not be the case, but stopping<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>          //  at the first valid call allows to be sure that we still have something to do without<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          //  spending too much time by reading the full list.<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>          break;<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>        }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  }<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span><a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>  /**<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * Used in test only. Construct an IPC cluster client whose values are of the<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   * {@link Message} class.<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>   * @param conf configuration<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>   * @param clusterId the cluster id<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>   * @param factory socket factory<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  @VisibleForTesting<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    this(conf, clusterId, factory, null, null);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  /**<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>   * Construct an IPC cluster client whose values are of the {@link Message} class.<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>   * @param conf configuration<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>   * @param clusterId the cluster id<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>   * @param factory socket factory<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>   * @param localAddr client socket bind address<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>   * @param metrics the connection metrics<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>   */<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory,<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      SocketAddress localAddr, MetricsConnection metrics) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    super(conf, clusterId, localAddr, metrics);<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    this.socketFactory = factory;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    this.connections = new PoolMap&lt;ConnectionId, Connection&gt;(getPoolType(conf), getPoolSize(conf));<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    this.failedServers = new FailedServers(conf);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  /**<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   * Used in test only. Construct an IPC client for the cluster {@code clusterId} with<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   * the default SocketFactory<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   */<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>  @VisibleForTesting<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>  RpcClientImpl(Configuration conf, String clusterId) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), null, null);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  /**<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>   * Construct an IPC client for the cluster {@code clusterId} with the default SocketFactory<a name="line.1141"></a>
 <span class="sourceLineNo">1142</span>   *<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>   * @param conf configuration<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * @param clusterId the cluster id<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * @param localAddr client socket bind address.<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @param metrics the connection metrics<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public RpcClientImpl(Configuration conf, String clusterId, SocketAddress localAddr,<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      MetricsConnection metrics) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), localAddr, metrics);<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  /** Stop all threads related to this client.  No further calls may be made<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   * using this client. */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void close() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (LOG.isDebugEnabled()) LOG.debug("Stopping rpc client");<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!running.compareAndSet(true, false)) return;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    Set&lt;Connection&gt; connsToClose = null;<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    // wake up all connections<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    synchronized (connections) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      for (Connection conn : connections.values()) {<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>        conn.interrupt();<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>        if (conn.callSender != null) {<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          conn.callSender.interrupt();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>        // In case the CallSender did not setupIOStreams() yet, the Connection may not be started<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        // at all (if CallSender has a cancelled Call it can happen). See HBASE-13851<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        if (!conn.isAlive()) {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          if (connsToClose == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>            connsToClose = new HashSet&lt;Connection&gt;();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          connsToClose.add(conn);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    if (connsToClose != null) {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (Connection conn : connsToClose) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        if (conn.markClosed(new InterruptedIOException("RpcClient is closing"))) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>          conn.close();<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>        }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    // wait until all connections are closed<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    while (!connections.isEmpty()) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      try {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>        Thread.sleep(10);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      } catch (InterruptedException e) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.info("Interrupted while stopping the client. We still have " + connections.size() +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            " connections.");<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Thread.currentThread().interrupt();<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        return;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /** Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * threw an exception.<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   *          {@link UserProvider#getCurrent()} makes a new instance of User each time so will be a<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   *          new Connection each time.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * @throws InterruptedException<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * @throws IOException<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   */<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  @Override<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  protected Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc, MethodDescriptor md,<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>      Message param, Message returnType, User ticket, InetSocketAddress addr,<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      MetricsConnection.CallStats callStats)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      throws IOException, InterruptedException {<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    if (pcrc == null) {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      pcrc = new PayloadCarryingRpcController();<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    CellScanner cells = pcrc.cellScanner();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span><a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    final Call call = new Call(this.callIdCnt.getAndIncrement(), md, param, cells, returnType,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        pcrc.getCallTimeout(), MetricsConnection.newCallStats());<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    final Connection connection = getConnection(ticket, call, addr);<a name="line.1224"></a>
+<span class="sourceLineNo">1143</span>   * This method is called with reflection by the RpcClientFactory to create an instance<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   *<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * @param conf configuration<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   * @param clusterId the cluster id<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * @param localAddr client socket bind address.<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * @param metrics the connection metrics<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  public RpcClientImpl(Configuration conf, String clusterId, SocketAddress localAddr,<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>      MetricsConnection metrics) {<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), localAddr, metrics);<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  }<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  /** Stop all threads related to this client.  No further calls may be made<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * using this client. */<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>  @Override<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  public void close() {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    if (LOG.isDebugEnabled()) LOG.debug("Stopping rpc client");<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!running.compareAndSet(true, false)) return;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span><a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    Set&lt;Connection&gt; connsToClose = null;<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    // wake up all connections<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    synchronized (connections) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      for (Connection conn : connections.values()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>        conn.interrupt();<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>        if (conn.callSender != null) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>          conn.callSender.interrupt();<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        // In case the CallSender did not setupIOStreams() yet, the Connection may not be started<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>        // at all (if CallSender has a cancelled Call it can happen). See HBASE-13851<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        if (!conn.isAlive()) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>          if (connsToClose == null) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>            connsToClose = new HashSet&lt;Connection&gt;();<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          }<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>          connsToClose.add(conn);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>      }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    if (connsToClose != null) {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      for (Connection conn : connsToClose) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>        if (conn.markClosed(new InterruptedIOException("RpcClient is closing"))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>          conn.close();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>        }<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    // wait until all connections are closed<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>    while (!connections.isEmpty()) {<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      try {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        Thread.sleep(10);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>      } catch (InterruptedException e) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        LOG.info("Interrupted while stopping the client. We still have " + connections.size() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>            " connections.");<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        Thread.currentThread().interrupt();<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>        return;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>  /** Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * threw an exception.<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   *          {@link UserProvider#getCurrent()} makes a new instance of User each time so will be a<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>   *          new Connection each time.<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   * @throws InterruptedException<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * @throws IOException<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   */<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>  @Override<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  protected Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc, MethodDescriptor md,<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      Message param, Message returnType, User ticket, InetSocketAddress addr,<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      MetricsConnection.CallStats callStats)<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      throws IOException, InterruptedException {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    if (pcrc == null) {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      pcrc = new PayloadCarryingRpcController();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>    }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    CellScanner cells = pcrc.cellScanner();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span><a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    final Call call = new Call(this.callIdCnt.getAndIncrement(), md, param, cells, returnType,<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        pcrc.getCallTimeout(), MetricsConnection.newCallStats());<a name="line.1224"></a>
 <span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final CallFuture cts;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    if (connection.callSender != null) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      cts = connection.callSender.sendCall(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>        pcrc.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>          @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>          public void run(Object parameter) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>            connection.callSender.remove(cts);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        });<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        if (pcrc.isCanceled()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          // To finish if the call was cancelled before we set the notification (race condition)<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          call.callComplete();<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>          return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>        }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    } else {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      cts = null;<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      connection.tracedWriteRequest(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    while (!call.done) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      if (call.checkAndSetTimeout()) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        break;<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      }<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (connection.shouldCloseConnection.get()) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        throw new ConnectionClosingException("Call id=" + call.id +<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>            " on server " + addr + " aborted: connection is closing");<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      try {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>        synchronized (call) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>          if (call.done) break;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>          call.wait(Math.min(call.remainingTime(), 1000) + 1);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      } catch (InterruptedException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>        call.setException(new InterruptedIOException());<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>        throw e;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    if (call.error != null) {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      if (call.error instanceof RemoteException) {<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        call.error.fillInStackTrace();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>        throw call.error;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      }<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      // local exception<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      throw wrapException(addr, call.error);<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    }<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span><a name="line.1277"></a>
-<span class="sourceLineNo">1278</span><a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>  /**<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * Interrupt the connections to the given ip:port server. This should be called if the server<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   *  is known as actually dead. This will not prevent current operation to be retried, and,<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   *  depending on their own behavior, they may retry on the same server. This can be a feature,<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   *  for example at startup. In any case, they're likely to get connection refused (if the<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *  process died) or no route to host: i.e. their next retries should be faster and with a<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   *  safe exception.<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  @Override<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  public void cancelConnections(ServerName sn) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    synchronized (connections) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      for (Connection connection : connections.values()) {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        if (connection.isAlive() &amp;&amp;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>            connection.getRemoteAddress().getPort() == sn.getPort() &amp;&amp;<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>            connection.getRemoteAddress().getHostName().equals(sn.getHostname())) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>          LOG.info("The server on " + sn.toString() +<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>              " is dead - stopping the connection " + connection.remoteId);<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>          connection.interrupt(); // We're interrupting a Reader. It means we want it to finish.<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>                                  // This will close the connection as well.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>        }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>  }<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span><a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>  /**<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>   *  Get a connection from the pool, or create a new one and add it to the<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>   * pool. Connections to a given host/port are reused.<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>   */<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  protected Connection getConnection(User ticket, Call call, InetSocketAddress addr)<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  throws IOException {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    if (!running.get()) throw new StoppedRpcClientException();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    Connection connection;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    ConnectionId remoteId =<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      new ConnectionId(ticket, call.md.getService().getName(), addr);<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    synchronized (connections) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      connection = connections.get(remoteId);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      if (connection == null) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        connection = createConnection(remoteId, this.codec, this.compressor);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>        connections.put(remoteId, connection);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    return connection;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>}<a name="line.1323"></a>
+<span class="sourceLineNo">1226</span>    final Connection connection = getConnection(ticket, call, addr);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    final CallFuture cts;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    if (connection.callSender != null) {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>      cts = connection.callSender.sendCall(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        pcrc.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          @Override<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          public void run(Object parameter) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            connection.callSender.remove(cts);<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>          }<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>        });<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>        if (pcrc.isCanceled()) {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          // To finish if the call was cancelled before we set the notification (race condition)<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          call.callComplete();<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    } else {<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>      cts = null;<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>      connection.tracedWriteRequest(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    }<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    while (!call.done) {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      if (call.checkAndSetTimeout()) {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>        break;<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      if (connection.shouldCloseConnection.get()) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        throw new ConnectionClosingException("Call id=" + call.id +<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>            " on server " + addr + " aborted: connection is closing");<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>      }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      try {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        synchronized (call) {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>          if (call.done) break;<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>          call.wait(Math.min(call.remainingTime(), 1000) + 1);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>        }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      } catch (InterruptedException e) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        call.setException(new InterruptedIOException());<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        throw e;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    if (call.error != null) {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      if (call.error instanceof RemoteException) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        call.error.fillInStackTrace();<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>        throw call.error;<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>      }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      // local exception<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      throw wrapException(addr, call.error);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span><a name="line.1279"></a>
+<span class="sourceLineNo">1280</span><a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  /**<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>   * Interrupt the connections to the given ip:port server. This should be called if the server<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   *  is known as actually dead. This will not prevent current operation to be retried, and,<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   *  depending on their own behavior, they may retry on the same server. This can be a feature,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   *  for example at startup. In any case, they're likely to get connection refused (if the<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   *  process died) or no route to host: i.e. their next retries should be faster and with a<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>   *  safe exception.<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>   */<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>  @Override<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  public void cancelConnections(ServerName sn) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    synchronized (connections) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      for (Connection connection : connections.values()) {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>        if (connection.isAlive() &amp;&amp;<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>            connection.getRemoteAddress().getPort() == sn.getPort() &amp;&amp;<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>            connection.getRemoteAddress().getHostName().equals(sn.getHostname())) {<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>          LOG.info("The server on " + sn.toString() +<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>              " is dead - stopping the connection " + connection.remoteId);<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>          connection.interrupt(); // We're interrupting a Reader. It means we want it to finish.<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>                                  // This will close the connection as well.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  /**<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   *  Get a connection from the pool, or create a new one and add it to the<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * pool. Connections to a given host/port are reused.<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   */<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  protected Connection getConnection(User ticket, Call call, InetSocketAddress addr)<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  throws IOException {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    if (!running.get()) throw new StoppedRpcClientException();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>    Connection connection;<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    ConnectionId remoteId =<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>      new ConnectionId(ticket, call.md.getService().getName(), addr);<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    synchronized (connections) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>      connection = connections.get(remoteId);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      if (connection == null) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>        connection = createConnection(remoteId, this.codec, this.compressor);<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>        connections.put(remoteId, connection);<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      }<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    }<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    return connection;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>  }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>}<a name="line.1325"></a>
 
 
 


[40/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
index 033f19e..21f5569 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
@@ -323,58 +323,58 @@ extends org.jamon.AbstractTemplateProxy</pre>
 <!--   -->
 </a>
 <h3>Field Detail</h3>
-<a name="deadServers">
+<a name="metaLocation">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>deadServers</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.275">deadServers</a></pre>
+<h4>metaLocation</h4>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.275">metaLocation</a></pre>
 </li>
 </ul>
-<a name="servers">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>servers</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.282">servers</a></pre>
+<h4>format</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.282">format</a></pre>
 </li>
 </ul>
-<a name="metaLocation">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>metaLocation</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.289">metaLocation</a></pre>
+<h4>filter</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.289">filter</a></pre>
 </li>
 </ul>
-<a name="frags">
+<a name="serverManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>frags</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.296">frags</a></pre>
+<h4>serverManager</h4>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.296">serverManager</a></pre>
 </li>
 </ul>
-<a name="serverManager">
+<a name="frags">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>serverManager</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.303">serverManager</a></pre>
+<h4>frags</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.303">frags</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="assignmentManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>format</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.310">format</a></pre>
+<h4>assignmentManager</h4>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.310">assignmentManager</a></pre>
 </li>
 </ul>
 <a name="catalogJanitorEnabled">
@@ -386,22 +386,22 @@ extends org.jamon.AbstractTemplateProxy</pre>
 <pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.317">catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="deadServers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>filter</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.324">filter</a></pre>
+<h4>deadServers</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.324">deadServers</a></pre>
 </li>
 </ul>
-<a name="assignmentManager">
+<a name="servers">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>assignmentManager</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.331">assignmentManager</a></pre>
+<h4>servers</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.331">servers</a></pre>
 </li>
 </ul>
 </li>
@@ -473,58 +473,58 @@ extends org.jamon.AbstractTemplateProxy</pre>
 </dl>
 </li>
 </ul>
-<a name="setDeadServers(java.util.Set)">
+<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setDeadServers</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.276">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_deadServers)</pre>
+<h4>setMetaLocation</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.276">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;p_metaLocation)</pre>
 </li>
 </ul>
-<a name="setServers(java.util.List)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServers</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.283">setServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_servers)</pre>
+<h4>setFormat</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.283">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
 </li>
 </ul>
-<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setMetaLocation</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.290">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;p_metaLocation)</pre>
+<h4>setFilter</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.290">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
 </li>
 </ul>
-<a name="setFrags(java.util.Map)">
+<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFrags</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.297">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;p_frags)</pre>
+<h4>setServerManager</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.297">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;p_serverManager)</pre>
 </li>
 </ul>
-<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
+<a name="setFrags(java.util.Map)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServerManager</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.304">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;p_serverManager)</pre>
+<h4>setFrags</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.304">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;p_frags)</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.311">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
+<h4>setAssignmentManager</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.311">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;p_assignmentManager)</pre>
 </li>
 </ul>
 <a name="setCatalogJanitorEnabled(boolean)">
@@ -536,22 +536,22 @@ extends org.jamon.AbstractTemplateProxy</pre>
 <pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.318">setCatalogJanitorEnabled</a>(boolean&nbsp;p_catalogJanitorEnabled)</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setDeadServers(java.util.Set)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.325">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
+<h4>setDeadServers</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.325">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_deadServers)</pre>
 </li>
 </ul>
-<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
+<a name="setServers(java.util.List)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setAssignmentManager</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.332">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;p_assignmentManager)</pre>
+<h4>setServers</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.332">setServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_servers)</pre>
 </li>
 </ul>
 <a name="constructImpl(java.lang.Class)">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
index 026c236..e106de8 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
@@ -264,58 +264,58 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/Master
 <pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.62">master</a></pre>
 </li>
 </ul>
-<a name="deadServers">
+<a name="metaLocation">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>deadServers</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.63">deadServers</a></pre>
+<h4>metaLocation</h4>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.63">metaLocation</a></pre>
 </li>
 </ul>
-<a name="servers">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>servers</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.64">servers</a></pre>
+<h4>format</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.64">format</a></pre>
 </li>
 </ul>
-<a name="metaLocation">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>metaLocation</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.65">metaLocation</a></pre>
+<h4>filter</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.65">filter</a></pre>
 </li>
 </ul>
-<a name="frags">
+<a name="serverManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>frags</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.66">frags</a></pre>
+<h4>serverManager</h4>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.66">serverManager</a></pre>
 </li>
 </ul>
-<a name="serverManager">
+<a name="frags">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>serverManager</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.67">serverManager</a></pre>
+<h4>frags</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.67">frags</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="assignmentManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>format</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.68">format</a></pre>
+<h4>assignmentManager</h4>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.68">assignmentManager</a></pre>
 </li>
 </ul>
 <a name="catalogJanitorEnabled">
@@ -327,22 +327,22 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/Master
 <pre>private final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.69">catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="deadServers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>filter</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.70">filter</a></pre>
+<h4>deadServers</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.70">deadServers</a></pre>
 </li>
 </ul>
-<a name="assignmentManager">
+<a name="servers">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>assignmentManager</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.71">assignmentManager</a></pre>
+<h4>servers</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.71">servers</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
index 8fcc9fb..4c2c2e2 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
@@ -279,76 +279,76 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.71">m_regionServer</a></pre>
 </li>
 </ul>
-<a name="m_format">
+<a name="m_filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.83">m_format</a></pre>
+<h4>m_filter</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.83">m_filter</a></pre>
 </li>
 </ul>
-<a name="m_format__IsNotDefault">
+<a name="m_filter__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.88">m_format__IsNotDefault</a></pre>
+<h4>m_filter__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.88">m_filter__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_bcv">
+<a name="m_bcn">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_bcv</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.100">m_bcv</a></pre>
+<h4>m_bcn</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.100">m_bcn</a></pre>
 </li>
 </ul>
-<a name="m_bcv__IsNotDefault">
+<a name="m_bcn__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_bcv__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.105">m_bcv__IsNotDefault</a></pre>
+<h4>m_bcn__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.105">m_bcn__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_bcn">
+<a name="m_bcv">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_bcn</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.117">m_bcn</a></pre>
+<h4>m_bcv</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.117">m_bcv</a></pre>
 </li>
 </ul>
-<a name="m_bcn__IsNotDefault">
+<a name="m_bcv__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_bcn__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.122">m_bcn__IsNotDefault</a></pre>
+<h4>m_bcv__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.122">m_bcv__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_filter">
+<a name="m_format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_filter</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.134">m_filter</a></pre>
+<h4>m_format</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.134">m_format</a></pre>
 </li>
 </ul>
-<a name="m_filter__IsNotDefault">
+<a name="m_format__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>m_filter__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.139">m_filter__IsNotDefault</a></pre>
+<h4>m_format__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.139">m_format__IsNotDefault</a></pre>
 </li>
 </ul>
 </li>
@@ -394,112 +394,112 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.67">getRegionServer</a>()</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.73">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
+<h4>setFilter</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.73">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
 </li>
 </ul>
-<a name="getFormat()">
+<a name="getFilter()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.79">getFormat</a>()</pre>
+<h4>getFilter</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.79">getFilter</a>()</pre>
 </li>
 </ul>
-<a name="getFormat__IsNotDefault()">
+<a name="getFilter__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.84">getFormat__IsNotDefault</a>()</pre>
+<h4>getFilter__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.84">getFilter__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setBcv(java.lang.String)">
+<a name="setBcn(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setBcv</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.90">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;bcv)</pre>
+<h4>setBcn</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.90">setBcn</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;bcn)</pre>
 </li>
 </ul>
-<a name="getBcv()">
+<a name="getBcn()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getBcv</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.96">getBcv</a>()</pre>
+<h4>getBcn</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.96">getBcn</a>()</pre>
 </li>
 </ul>
-<a name="getBcv__IsNotDefault()">
+<a name="getBcn__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getBcv__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.101">getBcv__IsNotDefault</a>()</pre>
+<h4>getBcn__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.101">getBcn__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setBcn(java.lang.String)">
+<a name="setBcv(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setBcn</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.107">setBcn</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;bcn)</pre>
+<h4>setBcv</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.107">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;bcv)</pre>
 </li>
 </ul>
-<a name="getBcn()">
+<a name="getBcv()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getBcn</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.113">getBcn</a>()</pre>
+<h4>getBcv</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.113">getBcv</a>()</pre>
 </li>
 </ul>
-<a name="getBcn__IsNotDefault()">
+<a name="getBcv__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getBcn__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.118">getBcn__IsNotDefault</a>()</pre>
+<h4>getBcv__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.118">getBcv__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.124">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
+<h4>setFormat</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.124">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
 </li>
 </ul>
-<a name="getFilter()">
+<a name="getFormat()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFilter</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.130">getFilter</a>()</pre>
+<h4>getFormat</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.130">getFormat</a>()</pre>
 </li>
 </ul>
-<a name="getFilter__IsNotDefault()">
+<a name="getFormat__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>getFilter__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.135">getFilter__IsNotDefault</a>()</pre>
+<h4>getFormat__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.135">getFormat__IsNotDefault</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
index 990dd14..e5198a3 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
@@ -283,40 +283,40 @@ extends org.jamon.AbstractTemplateProxy</pre>
 <!--   -->
 </a>
 <h3>Field Detail</h3>
-<a name="format">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>format</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.151">format</a></pre>
+<h4>filter</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.151">filter</a></pre>
 </li>
 </ul>
-<a name="bcv">
+<a name="bcn">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>bcv</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.158">bcv</a></pre>
+<h4>bcn</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.158">bcn</a></pre>
 </li>
 </ul>
-<a name="bcn">
+<a name="bcv">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>bcn</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.165">bcn</a></pre>
+<h4>bcv</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.165">bcv</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>filter</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.172">filter</a></pre>
+<h4>format</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.172">format</a></pre>
 </li>
 </ul>
 </li>
@@ -388,40 +388,40 @@ extends org.jamon.AbstractTemplateProxy</pre>
 </dl>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.152">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
+<h4>setFilter</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.152">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
 </li>
 </ul>
-<a name="setBcv(java.lang.String)">
+<a name="setBcn(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setBcv</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.159">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcv)</pre>
+<h4>setBcn</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.159">setBcn</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcn)</pre>
 </li>
 </ul>
-<a name="setBcn(java.lang.String)">
+<a name="setBcv(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setBcn</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.166">setBcn</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcn)</pre>
+<h4>setBcv</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.166">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcv)</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.173">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
+<h4>setFormat</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.173">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
 </li>
 </ul>
 <a name="constructImpl(java.lang.Class)">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
index 2fe9fef..512f30a 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
@@ -224,40 +224,40 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/
 <pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.28">regionServer</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>format</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.29">format</a></pre>
+<h4>filter</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.29">filter</a></pre>
 </li>
 </ul>
-<a name="bcv">
+<a name="bcn">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>bcv</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.30">bcv</a></pre>
+<h4>bcn</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.30">bcn</a></pre>
 </li>
 </ul>
-<a name="bcn">
+<a name="bcv">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>bcn</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.31">bcn</a></pre>
+<h4>bcv</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.31">bcv</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>filter</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.32">filter</a></pre>
+<h4>format</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.32">format</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/util/Threads.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/Threads.html b/devapidocs/org/apache/hadoop/hbase/util/Threads.html
index c627989..4053459 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/Threads.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/Threads.html
@@ -145,7 +145,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/util/Threads.html#LOG">LOG</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private static <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a></code></td>
+<td class="colFirst"><code>static <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/util/Threads.html#LOGGING_EXCEPTION_HANDLER">LOGGING_EXCEPTION_HANDLER</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
@@ -325,7 +325,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LOGGING_EXCEPTION_HANDLER</h4>
-<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/Threads.html#line.48">LOGGING_EXCEPTION_HANDLER</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/Threads.html#line.48">LOGGING_EXCEPTION_HANDLER</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index ec5e384..6d79a9c 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -461,13 +461,13 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">PoolMap.PoolType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 62ba729..1f810f3 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -148,8 +148,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALFactory.Providers</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.Version.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALKey.Version</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALFactory.Providers</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">RegionGroupingProvider.Strategies</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/overview-tree.html b/devapidocs/overview-tree.html
index 7306911..9b000aa 100644
--- a/devapidocs/overview-tree.html
+++ b/devapidocs/overview-tree.html
@@ -1621,6 +1621,7 @@
 </li>
 <li type="circle">java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io"><span class="strong">InputStream</span></a> (implements java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">ByteBufferInputStream</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/ByteBuffInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">ByteBuffInputStream</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/FileLink.FileLinkInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">FileLink.FileLinkInputStream</span></a> (implements org.apache.hadoop.fs.PositionedReadable, org.apache.hadoop.fs.Seekable)</li>
 <li type="circle">java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/FilterInputStream.html?is-external=true" title="class or interface in java.io"><span class="strong">FilterInputStream</span></a>


[04/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html
index 4434339..0a8fce1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html
@@ -1155,1706 +1155,1717 @@
 <span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
 <span class="sourceLineNo">1148</span>  Region getRegion(<a name="line.1148"></a>
 <span class="sourceLineNo">1149</span>      final RegionSpecifier regionSpecifier) throws IOException {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    return regionServer.getRegionByEncodedName(regionSpecifier.getValue().toByteArray(),<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        ProtobufUtil.getRegionEncodedName(regionSpecifier));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  @VisibleForTesting<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  public PriorityFunction getPriority() {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return priority;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  @VisibleForTesting<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public Configuration getConfiguration() {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    return regionServer.getConfiguration();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private RegionServerQuotaManager getQuotaManager() {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    return regionServer.getRegionServerQuotaManager();<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  void start() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    rpcServer.start();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  void stop() {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    closeAllScanners();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    rpcServer.stop();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span><a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   * Called to verify that this server is up and running.<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   *<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>   * @throws IOException<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>   */<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>  protected void checkOpen() throws IOException {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    if (regionServer.isAborted()) {<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      throw new RegionServerAbortedException("Server " + regionServer.serverName + " aborting");<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    if (regionServer.isStopped()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      throw new RegionServerStoppedException("Server " + regionServer.serverName + " stopping");<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (!regionServer.fsOk) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      throw new RegionServerStoppedException("File system not available");<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    if (!regionServer.isOnline()) {<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      throw new ServerNotRunningYetException("Server is not running yet");<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  /**<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>   * @return list of blocking services and their security info classes that this server supports<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>   */<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>  protected List&lt;BlockingServiceAndInterface&gt; getServices() {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    List&lt;BlockingServiceAndInterface&gt; bssi = new ArrayList&lt;BlockingServiceAndInterface&gt;(2);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      ClientService.newReflectiveBlockingService(this),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      ClientService.BlockingInterface.class));<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      AdminService.newReflectiveBlockingService(this),<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      AdminService.BlockingInterface.class));<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    return bssi;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span><a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  public InetSocketAddress getSocketAddress() {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    return isa;<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span><a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>  @Override<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    return priority.getPriority(header, param, user);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>  @Override<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    return priority.getDeadline(header, param);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>  }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  /*<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * Check if an OOME and, if so, abort immediately to avoid creating more objects.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   *<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @param e<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   *<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>   * @return True if we OOME'd and are aborting.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>   */<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  @Override<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  public boolean checkOOME(final Throwable e) {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    boolean stop = false;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    try {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      if (e instanceof OutOfMemoryError<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          || (e.getCause() != null &amp;&amp; e.getCause() instanceof OutOfMemoryError)<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>          || (e.getMessage() != null &amp;&amp; e.getMessage().contains(<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>              "java.lang.OutOfMemoryError"))) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>        stop = true;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        LOG.fatal("Run out of memory; " + getClass().getSimpleName()<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>          + " will abort itself immediately", e);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    } finally {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>      if (stop) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>        Runtime.getRuntime().halt(1);<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      }<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    }<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    return stop;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>  }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>  /**<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>   * Close a region on the region server.<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   *<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>   * @param controller the RPC controller<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>   * @param request the request<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>   * @throws ServiceException<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>   */<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  @Override<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  public CloseRegionResponse closeRegion(final RpcController controller,<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      final CloseRegionRequest request) throws ServiceException {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    final ServerName sn = (request.hasDestinationServer() ?<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      ProtobufUtil.toServerName(request.getDestinationServer()) : null);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    try {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      checkOpen();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>      if (request.hasServerStartCode()) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>        // check that we are the same server that this RPC is intended for.<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        long serverStartCode = request.getServerStartCode();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>        if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>              "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>              + regionServer.serverName));<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion());<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span><a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      // Can be null if we're calling close on a region that's not online<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      final Region region = regionServer.getFromOnlineRegions(encodedRegionName);<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if ((region  != null) &amp;&amp; (region .getCoprocessorHost() != null)) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        region.getCoprocessorHost().preClose(false);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      requestCount.increment();<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      LOG.info("Close " + encodedRegionName + ", moving to " + sn);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      boolean closed = regionServer.closeRegion(encodedRegionName, false, sn);<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed);<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      return builder.build();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    } catch (IOException ie) {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      throw new ServiceException(ie);<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>  }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>  /**<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * Compact a region on the region server.<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   *<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * @param controller the RPC controller<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * @param request the request<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * @throws ServiceException<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   */<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  @Override<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      final CompactRegionRequest request) throws ServiceException {<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    try {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>      checkOpen();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      requestCount.increment();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      Region region = getRegion(request.getRegion());<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      region.startRegionOperation(Operation.COMPACT_REGION);<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString());<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      boolean major = false;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      byte [] family = null;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      Store store = null;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      if (request.hasFamily()) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        family = request.getFamily().toByteArray();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>        store = region.getStore(family);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>        if (store == null) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>          throw new ServiceException(new IOException("column family " + Bytes.toString(family)<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>            + " does not exist in region " + region.getRegionInfo().getRegionNameAsString()));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>        }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      if (request.hasMajor()) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>        major = request.getMajor();<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      }<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      if (major) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>        if (family != null) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>          store.triggerMajorCompaction();<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        } else {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          region.triggerMajorCompaction();<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>        }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):"";<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      if (LOG.isTraceEnabled()) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        LOG.trace("User-triggered compaction requested for region "<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>          + region.getRegionInfo().getRegionNameAsString() + familyLogMsg);<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg;<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if(family != null) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        regionServer.compactSplitThread.requestCompaction(region, store, log,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      } else {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        regionServer.compactSplitThread.requestCompaction(region, log,<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      }<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      return CompactRegionResponse.newBuilder().build();<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    } catch (IOException ie) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      throw new ServiceException(ie);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Flush a region on the region server.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param controller the RPC controller<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param request the request<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @throws ServiceException<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>  public FlushRegionResponse flushRegion(final RpcController controller,<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>      final FlushRegionRequest request) throws ServiceException {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    try {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      checkOpen();<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      requestCount.increment();<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      Region region = getRegion(request.getRegion());<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString());<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      boolean shouldFlush = true;<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      if (request.hasIfOlderThanTs()) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>        shouldFlush = region.getEarliestFlushTimeForAllStores() &lt; request.getIfOlderThanTs();<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder();<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (shouldFlush) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        boolean writeFlushWalMarker =  request.hasWriteFlushWalMarker() ?<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>            request.getWriteFlushWalMarker() : false;<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        // Go behind the curtain so we can manage writing of the flush WAL marker<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl)<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>            ((HRegion)region).flushcache(true, writeFlushWalMarker);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        if (flushResult.isFlushSucceeded()) {<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>          regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>        }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>        boolean compactionNeeded = flushResult.isCompactionNeeded();<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        if (compactionNeeded) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          regionServer.compactSplitThread.requestSystemCompaction(region,<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>            "Compaction through user triggered flush");<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        builder.setFlushed(flushResult.isFlushSucceeded());<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores());<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      return builder.build();<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    } catch (DroppedSnapshotException ex) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>      // is required. Currently the only way to do this is a restart of<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      // the server.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>      throw new ServiceException(ex);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    } catch (IOException ie) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      throw new ServiceException(ie);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span><a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>  @Override<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>  public GetOnlineRegionResponse getOnlineRegion(final RpcController controller,<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      final GetOnlineRegionRequest request) throws ServiceException {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    try {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      checkOpen();<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      requestCount.increment();<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      Map&lt;String, Region&gt; onlineRegions = regionServer.onlineRegions;<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      List&lt;HRegionInfo&gt; list = new ArrayList&lt;HRegionInfo&gt;(onlineRegions.size());<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      for (Region region: onlineRegions.values()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>        list.add(region.getRegionInfo());<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      }<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      Collections.sort(list);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      return ResponseConverter.buildGetOnlineRegionResponse(list);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    } catch (IOException ie) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      throw new ServiceException(ie);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>  @Override<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      final GetRegionInfoRequest request) throws ServiceException {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      checkOpen();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      requestCount.increment();<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>      Region region = getRegion(request.getRegion());<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      HRegionInfo info = region.getRegionInfo();<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      builder.setRegionInfo(HRegionInfo.convert(info));<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        builder.setCompactionState(region.getCompactionState());<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      builder.setIsRecovering(region.isRecovering());<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      return builder.build();<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    } catch (IOException ie) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      throw new ServiceException(ie);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span><a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>  /**<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * Get some information of the region server.<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   *<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   * @param controller the RPC controller<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>   * @param request the request<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>   * @throws ServiceException<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>   */<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>  @Override<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>  public GetServerInfoResponse getServerInfo(final RpcController controller,<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      final GetServerInfoRequest request) throws ServiceException {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    try {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      checkOpen();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    } catch (IOException ie) {<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      throw new ServiceException(ie);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    requestCount.increment();<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1;<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>  }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>  @Override<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  public GetStoreFileResponse getStoreFile(final RpcController controller,<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      final GetStoreFileRequest request) throws ServiceException {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    try {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      checkOpen();<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      Region region = getRegion(request.getRegion());<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      requestCount.increment();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Set&lt;byte[]&gt; columnFamilies;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      if (request.getFamilyCount() == 0) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>        columnFamilies = region.getTableDesc().getFamiliesKeys();<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      } else {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>        columnFamilies = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        for (ByteString cf: request.getFamilyList()) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          columnFamilies.add(cf.toByteArray());<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        }<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      int nCF = columnFamilies.size();<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      List&lt;String&gt;  fileList = region.getStoreFileList(<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        columnFamilies.toArray(new byte[nCF][]));<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>      GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder();<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      builder.addAllStoreFile(fileList);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      return builder.build();<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    } catch (IOException ie) {<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      throw new ServiceException(ie);<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  /**<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   * Merge regions on the region server.<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>   *<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>   * @param controller the RPC controller<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>   * @param request the request<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>   * @return merge regions response<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>   * @throws ServiceException<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>   */<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  @Override<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>  @QosPriority(priority = HConstants.ADMIN_QOS)<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>  public MergeRegionsResponse mergeRegions(final RpcController controller,<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      final MergeRegionsRequest request) throws ServiceException {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    try {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      checkOpen();<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      requestCount.increment();<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>      Region regionA = getRegion(request.getRegionA());<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      Region regionB = getRegion(request.getRegionB());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>      boolean forcible = request.getForcible();<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>      long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      regionA.startRegionOperation(Operation.MERGE_REGION);<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      regionB.startRegionOperation(Operation.MERGE_REGION);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (regionA.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID ||<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>          regionB.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) {<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        throw new ServiceException(new MergeRegionException("Can't merge non-default replicas"));<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      LOG.info("Receiving merging request for  " + regionA + ", " + regionB<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          + ",forcible=" + forcible);<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>      long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>      FlushResult flushResult = regionA.flush(true);<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      if (flushResult.isFlushSucceeded()) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      }<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      startTime = EnvironmentEdgeManager.currentTime();<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      flushResult = regionB.flush(true);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      if (flushResult.isFlushSucceeded()) {<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>        long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>      regionServer.compactSplitThread.requestRegionsMerge(regionA, regionB, forcible,<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          masterSystemTime, RpcServer.getRequestUser());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      return MergeRegionsResponse.newBuilder().build();<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    } catch (DroppedSnapshotException ex) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      throw new ServiceException(ex);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>    } catch (IOException ie) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      throw new ServiceException(ie);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>  }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span><a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  /**<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>   * Open asynchronously a region or a set of regions on the region server.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>   *<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>   * The opening is coordinated by ZooKeeper, and this method requires the znode to be created<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>   *  before being called. As a consequence, this method should be called only from the master.<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>   * &lt;p&gt;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>   * Different manages states for the region are:<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>   * &lt;/p&gt;&lt;ul&gt;<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>   *  &lt;li&gt;region not opened: the region opening will start asynchronously.&lt;/li&gt;<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>   *  &lt;li&gt;a close is already in progress: this is considered as an error.&lt;/li&gt;<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>   *  &lt;li&gt;an open is already in progress: this new open request will be ignored. This is important<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>   *  because the Master can do multiple requests if it crashes.&lt;/li&gt;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>   *  &lt;li&gt;the region is already opened:  this new open request will be ignored.&lt;/li&gt;<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>   *  &lt;/ul&gt;<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>   * &lt;p&gt;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>   * Bulk assign: If there are more than 1 region to open, it will be considered as a bulk assign.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>   * For a single region opening, errors are sent through a ServiceException. For bulk assign,<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>   * errors are put in the response as FAILED_OPENING.<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>   * &lt;/p&gt;<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * @param controller the RPC controller<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @param request the request<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   * @throws ServiceException<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>   */<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  @Override<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>  public OpenRegionResponse openRegion(final RpcController controller,<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      final OpenRegionRequest request) throws ServiceException {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    requestCount.increment();<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    if (request.hasServerStartCode()) {<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      // check that we are the same server that this RPC is intended for.<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>      long serverStartCode = request.getServerStartCode();<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>            "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>            + regionServer.serverName));<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    OpenRegionResponse.Builder builder = OpenRegionResponse.newBuilder();<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    final int regionCount = request.getOpenInfoCount();<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    final Map&lt;TableName, HTableDescriptor&gt; htds =<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>        new HashMap&lt;TableName, HTableDescriptor&gt;(regionCount);<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    final boolean isBulkAssign = regionCount &gt; 1;<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    try {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      checkOpen();<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    } catch (IOException ie) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>      TableName tableName = null;<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>      if (regionCount == 1) {<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>        RegionInfo ri = request.getOpenInfo(0).getRegion();<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>        if (ri != null) {<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          tableName = ProtobufUtil.toTableName(ri.getTableName());<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>        }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      if (!TableName.META_TABLE_NAME.equals(tableName)) {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>        throw new ServiceException(ie);<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>      // We are assigning meta, wait a little for regionserver to finish initialization.<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>      int timeout = regionServer.conf.getInt(HConstants.HBASE_RPC_TIMEOUT_KEY,<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        HConstants.DEFAULT_HBASE_RPC_TIMEOUT) &gt;&gt; 2; // Quarter of RPC timeout<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      long endTime = System.currentTimeMillis() + timeout;<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>      synchronized (regionServer.online) {<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>        try {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>          while (System.currentTimeMillis() &lt;= endTime<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>              &amp;&amp; !regionServer.isStopped() &amp;&amp; !regionServer.isOnline()) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>            regionServer.online.wait(regionServer.msgInterval);<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          }<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          checkOpen();<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        } catch (InterruptedException t) {<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          Thread.currentThread().interrupt();<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          throw new ServiceException(t);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>        } catch (IOException e) {<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          throw new ServiceException(e);<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>        }<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>      }<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    }<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1;<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>    for (RegionOpenInfo regionOpenInfo : request.getOpenInfoList()) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>      final HRegionInfo region = HRegionInfo.convert(regionOpenInfo.getRegion());<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>      HTableDescriptor htd;<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>      try {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>        String encodedName = region.getEncodedName();<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        byte[] encodedNameBytes = region.getEncodedNameAsBytes();<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>        final Region onlineRegion = regionServer.getFromOnlineRegions(encodedName);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>        if (onlineRegion != null) {<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>          // The region is already online. This should not happen any more.<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>          String error = "Received OPEN for the region:"<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            + region.getRegionNameAsString() + ", which is already online";<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>          regionServer.abort(error);<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>          throw new IOException(error);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>        }<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        LOG.info("Open " + region.getRegionNameAsString());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        htd = htds.get(region.getTable());<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        if (htd == null) {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          htd = regionServer.tableDescriptors.get(region.getTable());<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>          htds.put(region.getTable(), htd);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>        }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>        final Boolean previous = regionServer.regionsInTransitionInRS.putIfAbsent(<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          encodedNameBytes, Boolean.TRUE);<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        if (Boolean.FALSE.equals(previous)) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          if (regionServer.getFromOnlineRegions(encodedName) != null) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            // There is a close in progress. This should not happen any more.<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>            String error = "Received OPEN for the region:"<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              + region.getRegionNameAsString() + ", which we are already trying to CLOSE";<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            regionServer.abort(error);<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>            throw new IOException(error);<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>          }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          regionServer.regionsInTransitionInRS.put(encodedNameBytes, Boolean.TRUE);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        }<a name="line.1657"></a>
+<span class="sourceLineNo">1150</span>    ByteString value = regionSpecifier.getValue();<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    RegionSpecifierType type = regionSpecifier.getType();<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    switch (type) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      case REGION_NAME:<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        byte[] regionName = value.toByteArray();<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>        String encodedRegionName = HRegionInfo.encodeRegionName(regionName);<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>        return regionServer.getRegionByEncodedName(regionName, encodedRegionName);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      case ENCODED_REGION_NAME:<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        return regionServer.getRegionByEncodedName(value.toStringUtf8());<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      default:<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        throw new DoNotRetryIOException(<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          "Unsupported region specifier type: " + type);<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span><a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  @VisibleForTesting<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>  public PriorityFunction getPriority() {<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    return priority;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span><a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>  @VisibleForTesting<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  public Configuration getConfiguration() {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    return regionServer.getConfiguration();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  private RegionServerQuotaManager getQuotaManager() {<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    return regionServer.getRegionServerQuotaManager();<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span><a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>  void start() {<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    rpcServer.start();<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  }<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span><a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>  void stop() {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    closeAllScanners();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    rpcServer.stop();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>  }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span><a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>  /**<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   * Called to verify that this server is up and running.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   *<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @throws IOException<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   */<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  protected void checkOpen() throws IOException {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    if (regionServer.isAborted()) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      throw new RegionServerAbortedException("Server " + regionServer.serverName + " aborting");<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regionServer.isStopped()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      throw new RegionServerStoppedException("Server " + regionServer.serverName + " stopping");<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    if (!regionServer.fsOk) {<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      throw new RegionServerStoppedException("File system not available");<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!regionServer.isOnline()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      throw new ServerNotRunningYetException("Server is not running yet");<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>  }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span><a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  /**<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * @return list of blocking services and their security info classes that this server supports<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   */<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>  protected List&lt;BlockingServiceAndInterface&gt; getServices() {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    List&lt;BlockingServiceAndInterface&gt; bssi = new ArrayList&lt;BlockingServiceAndInterface&gt;(2);<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      ClientService.newReflectiveBlockingService(this),<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      ClientService.BlockingInterface.class));<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      AdminService.newReflectiveBlockingService(this),<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      AdminService.BlockingInterface.class));<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    return bssi;<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>  public InetSocketAddress getSocketAddress() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return isa;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  @Override<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    return priority.getPriority(header, param, user);<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return priority.getDeadline(header, param);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  /*<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>   * Check if an OOME and, if so, abort immediately to avoid creating more objects.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>   *<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>   * @param e<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   *<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * @return True if we OOME'd and are aborting.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  public boolean checkOOME(final Throwable e) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    boolean stop = false;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>      if (e instanceof OutOfMemoryError<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>          || (e.getCause() != null &amp;&amp; e.getCause() instanceof OutOfMemoryError)<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>          || (e.getMessage() != null &amp;&amp; e.getMessage().contains(<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>              "java.lang.OutOfMemoryError"))) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        stop = true;<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>        LOG.fatal("Run out of memory; " + getClass().getSimpleName()<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>          + " will abort itself immediately", e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    } finally {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      if (stop) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        Runtime.getRuntime().halt(1);<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    return stop;<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span><a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>  /**<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   * Close a region on the region server.<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>   *<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>   * @param controller the RPC controller<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>   * @param request the request<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>   * @throws ServiceException<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>   */<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>  public CloseRegionResponse closeRegion(final RpcController controller,<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      final CloseRegionRequest request) throws ServiceException {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    final ServerName sn = (request.hasDestinationServer() ?<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      ProtobufUtil.toServerName(request.getDestinationServer()) : null);<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    try {<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>      checkOpen();<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      if (request.hasServerStartCode()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        // check that we are the same server that this RPC is intended for.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        long serverStartCode = request.getServerStartCode();<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>        if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>              "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>              + regionServer.serverName));<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion());<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // Can be null if we're calling close on a region that's not online<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      final Region region = regionServer.getFromOnlineRegions(encodedRegionName);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      if ((region  != null) &amp;&amp; (region .getCoprocessorHost() != null)) {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>        region.getCoprocessorHost().preClose(false);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      requestCount.increment();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      LOG.info("Close " + encodedRegionName + ", moving to " + sn);<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      boolean closed = regionServer.closeRegion(encodedRegionName, false, sn);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return builder.build();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    } catch (IOException ie) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      throw new ServiceException(ie);<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span><a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  /**<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * Compact a region on the region server.<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   *<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   * @param controller the RPC controller<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * @param request the request<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * @throws ServiceException<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  @Override<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>      final CompactRegionRequest request) throws ServiceException {<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    try {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>      checkOpen();<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>      requestCount.increment();<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      Region region = getRegion(request.getRegion());<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      region.startRegionOperation(Operation.COMPACT_REGION);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString());<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      boolean major = false;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      byte [] family = null;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>      Store store = null;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>      if (request.hasFamily()) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>        family = request.getFamily().toByteArray();<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>        store = region.getStore(family);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>        if (store == null) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>          throw new ServiceException(new IOException("column family " + Bytes.toString(family)<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>            + " does not exist in region " + region.getRegionInfo().getRegionNameAsString()));<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>        }<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      if (request.hasMajor()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        major = request.getMajor();<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      if (major) {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        if (family != null) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>          store.triggerMajorCompaction();<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        } else {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>          region.triggerMajorCompaction();<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span><a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):"";<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (LOG.isTraceEnabled()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        LOG.trace("User-triggered compaction requested for region "<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          + region.getRegionInfo().getRegionNameAsString() + familyLogMsg);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      if(family != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>        regionServer.compactSplitThread.requestCompaction(region, store, log,<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>      } else {<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>        regionServer.compactSplitThread.requestCompaction(region, log,<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return CompactRegionResponse.newBuilder().build();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    } catch (IOException ie) {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      throw new ServiceException(ie);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span><a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>  /**<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * Flush a region on the region server.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   *<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * @param controller the RPC controller<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * @param request the request<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * @throws ServiceException<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   */<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  @Override<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  public FlushRegionResponse flushRegion(final RpcController controller,<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>      final FlushRegionRequest request) throws ServiceException {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    try {<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      checkOpen();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      requestCount.increment();<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      Region region = getRegion(request.getRegion());<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>      LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString());<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>      boolean shouldFlush = true;<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      if (request.hasIfOlderThanTs()) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        shouldFlush = region.getEarliestFlushTimeForAllStores() &lt; request.getIfOlderThanTs();<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      if (shouldFlush) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        boolean writeFlushWalMarker =  request.hasWriteFlushWalMarker() ?<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>            request.getWriteFlushWalMarker() : false;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>        // Go behind the curtain so we can manage writing of the flush WAL marker<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl)<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            ((HRegion)region).flushcache(true, writeFlushWalMarker);<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        if (flushResult.isFlushSucceeded()) {<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        boolean compactionNeeded = flushResult.isCompactionNeeded();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>        if (compactionNeeded) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>          regionServer.compactSplitThread.requestSystemCompaction(region,<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>            "Compaction through user triggered flush");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        }<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        builder.setFlushed(flushResult.isFlushSucceeded());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker);<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores());<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return builder.build();<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    } catch (DroppedSnapshotException ex) {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>      // is required. Currently the only way to do this is a restart of<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      // the server.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>      throw new ServiceException(ex);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    } catch (IOException ie) {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      throw new ServiceException(ie);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>  }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>  @Override<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>  public GetOnlineRegionResponse getOnlineRegion(final RpcController controller,<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      final GetOnlineRegionRequest request) throws ServiceException {<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    try {<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>      checkOpen();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      requestCount.increment();<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>      Map&lt;String, Region&gt; onlineRegions = regionServer.onlineRegions;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      List&lt;HRegionInfo&gt; list = new ArrayList&lt;HRegionInfo&gt;(onlineRegions.size());<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      for (Region region: onlineRegions.values()) {<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        list.add(region.getRegionInfo());<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      }<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>      Collections.sort(list);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      return ResponseConverter.buildGetOnlineRegionResponse(list);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    } catch (IOException ie) {<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      throw new ServiceException(ie);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    }<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>  }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      final GetRegionInfoRequest request) throws ServiceException {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>    try {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>      checkOpen();<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      requestCount.increment();<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      Region region = getRegion(request.getRegion());<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      HRegionInfo info = region.getRegionInfo();<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      builder.setRegionInfo(HRegionInfo.convert(info));<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>        builder.setCompactionState(region.getCompactionState());<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>      }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>      builder.setIsRecovering(region.isRecovering());<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>      return builder.build();<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    } catch (IOException ie) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throw new ServiceException(ie);<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    }<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span><a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>  /**<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>   * Get some information of the region server.<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>   *<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>   * @param controller the RPC controller<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>   * @param request the request<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * @throws ServiceException<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  @Override<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>  public GetServerInfoResponse getServerInfo(final RpcController controller,<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      final GetServerInfoRequest request) throws ServiceException {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    try {<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      checkOpen();<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    } catch (IOException ie) {<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      throw new ServiceException(ie);<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>    }<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    requestCount.increment();<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>  }<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span><a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>  @Override<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>  public GetStoreFileResponse getStoreFile(final RpcController controller,<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      final GetStoreFileRequest request) throws ServiceException {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    try {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      checkOpen();<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      Region region = getRegion(request.getRegion());<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      requestCount.increment();<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>      Set&lt;byte[]&gt; columnFamilies;<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>      if (request.getFamilyCount() == 0) {<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>        columnFamilies = region.getTableDesc().getFamiliesKeys();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      } else {<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>        columnFamilies = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>        for (ByteString cf: request.getFamilyList()) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>          columnFamilies.add(cf.toByteArray());<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>      }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>      int nCF = columnFamilies.size();<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      List&lt;String&gt;  fileList = region.getStoreFileList(<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        columnFamilies.toArray(new byte[nCF][]));<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder();<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      builder.addAllStoreFile(fileList);<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      return builder.build();<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    } catch (IOException ie) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>      throw new ServiceException(ie);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>    }<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span><a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>  /**<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>   * Merge regions on the region server.<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   *<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   * @param controller the RPC controller<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>   * @param request the request<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>   * @return merge regions response<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>   * @throws ServiceException<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>   */<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  @Override<a name="line.1515"></a>
+<span c

<TRUNCATED>

[05/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerCloseCallBack.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerCloseCallBack.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerCloseCallBack.html
index 4434339..0a8fce1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerCloseCallBack.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerCloseCallBack.html
@@ -1155,1706 +1155,1717 @@
 <span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
 <span class="sourceLineNo">1148</span>  Region getRegion(<a name="line.1148"></a>
 <span class="sourceLineNo">1149</span>      final RegionSpecifier regionSpecifier) throws IOException {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    return regionServer.getRegionByEncodedName(regionSpecifier.getValue().toByteArray(),<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        ProtobufUtil.getRegionEncodedName(regionSpecifier));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  @VisibleForTesting<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  public PriorityFunction getPriority() {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return priority;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  @VisibleForTesting<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public Configuration getConfiguration() {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    return regionServer.getConfiguration();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private RegionServerQuotaManager getQuotaManager() {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    return regionServer.getRegionServerQuotaManager();<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  void start() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    rpcServer.start();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  void stop() {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    closeAllScanners();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    rpcServer.stop();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span><a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   * Called to verify that this server is up and running.<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   *<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>   * @throws IOException<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>   */<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>  protected void checkOpen() throws IOException {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    if (regionServer.isAborted()) {<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      throw new RegionServerAbortedException("Server " + regionServer.serverName + " aborting");<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    if (regionServer.isStopped()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      throw new RegionServerStoppedException("Server " + regionServer.serverName + " stopping");<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (!regionServer.fsOk) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      throw new RegionServerStoppedException("File system not available");<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    if (!regionServer.isOnline()) {<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      throw new ServerNotRunningYetException("Server is not running yet");<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  /**<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>   * @return list of blocking services and their security info classes that this server supports<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>   */<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>  protected List&lt;BlockingServiceAndInterface&gt; getServices() {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    List&lt;BlockingServiceAndInterface&gt; bssi = new ArrayList&lt;BlockingServiceAndInterface&gt;(2);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      ClientService.newReflectiveBlockingService(this),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      ClientService.BlockingInterface.class));<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      AdminService.newReflectiveBlockingService(this),<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      AdminService.BlockingInterface.class));<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    return bssi;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span><a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  public InetSocketAddress getSocketAddress() {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    return isa;<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span><a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>  @Override<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    return priority.getPriority(header, param, user);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>  @Override<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    return priority.getDeadline(header, param);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>  }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  /*<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * Check if an OOME and, if so, abort immediately to avoid creating more objects.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   *<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @param e<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   *<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>   * @return True if we OOME'd and are aborting.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>   */<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  @Override<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  public boolean checkOOME(final Throwable e) {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    boolean stop = false;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    try {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      if (e instanceof OutOfMemoryError<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          || (e.getCause() != null &amp;&amp; e.getCause() instanceof OutOfMemoryError)<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>          || (e.getMessage() != null &amp;&amp; e.getMessage().contains(<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>              "java.lang.OutOfMemoryError"))) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>        stop = true;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        LOG.fatal("Run out of memory; " + getClass().getSimpleName()<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>          + " will abort itself immediately", e);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    } finally {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>      if (stop) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>        Runtime.getRuntime().halt(1);<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      }<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    }<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    return stop;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>  }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>  /**<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>   * Close a region on the region server.<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   *<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>   * @param controller the RPC controller<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>   * @param request the request<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>   * @throws ServiceException<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>   */<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  @Override<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  public CloseRegionResponse closeRegion(final RpcController controller,<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      final CloseRegionRequest request) throws ServiceException {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    final ServerName sn = (request.hasDestinationServer() ?<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      ProtobufUtil.toServerName(request.getDestinationServer()) : null);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    try {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      checkOpen();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>      if (request.hasServerStartCode()) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>        // check that we are the same server that this RPC is intended for.<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        long serverStartCode = request.getServerStartCode();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>        if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>              "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>              + regionServer.serverName));<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion());<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span><a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      // Can be null if we're calling close on a region that's not online<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      final Region region = regionServer.getFromOnlineRegions(encodedRegionName);<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if ((region  != null) &amp;&amp; (region .getCoprocessorHost() != null)) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        region.getCoprocessorHost().preClose(false);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      requestCount.increment();<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      LOG.info("Close " + encodedRegionName + ", moving to " + sn);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      boolean closed = regionServer.closeRegion(encodedRegionName, false, sn);<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed);<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      return builder.build();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    } catch (IOException ie) {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      throw new ServiceException(ie);<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>  }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>  /**<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * Compact a region on the region server.<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   *<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * @param controller the RPC controller<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * @param request the request<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * @throws ServiceException<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   */<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  @Override<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      final CompactRegionRequest request) throws ServiceException {<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    try {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>      checkOpen();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      requestCount.increment();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      Region region = getRegion(request.getRegion());<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      region.startRegionOperation(Operation.COMPACT_REGION);<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString());<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      boolean major = false;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      byte [] family = null;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      Store store = null;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      if (request.hasFamily()) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        family = request.getFamily().toByteArray();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>        store = region.getStore(family);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>        if (store == null) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>          throw new ServiceException(new IOException("column family " + Bytes.toString(family)<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>            + " does not exist in region " + region.getRegionInfo().getRegionNameAsString()));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>        }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      if (request.hasMajor()) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>        major = request.getMajor();<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      }<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      if (major) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>        if (family != null) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>          store.triggerMajorCompaction();<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        } else {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          region.triggerMajorCompaction();<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>        }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):"";<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      if (LOG.isTraceEnabled()) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        LOG.trace("User-triggered compaction requested for region "<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>          + region.getRegionInfo().getRegionNameAsString() + familyLogMsg);<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg;<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if(family != null) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        regionServer.compactSplitThread.requestCompaction(region, store, log,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      } else {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        regionServer.compactSplitThread.requestCompaction(region, log,<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      }<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      return CompactRegionResponse.newBuilder().build();<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    } catch (IOException ie) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      throw new ServiceException(ie);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Flush a region on the region server.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param controller the RPC controller<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param request the request<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @throws ServiceException<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>  public FlushRegionResponse flushRegion(final RpcController controller,<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>      final FlushRegionRequest request) throws ServiceException {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    try {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      checkOpen();<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      requestCount.increment();<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      Region region = getRegion(request.getRegion());<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString());<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      boolean shouldFlush = true;<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      if (request.hasIfOlderThanTs()) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>        shouldFlush = region.getEarliestFlushTimeForAllStores() &lt; request.getIfOlderThanTs();<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder();<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (shouldFlush) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        boolean writeFlushWalMarker =  request.hasWriteFlushWalMarker() ?<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>            request.getWriteFlushWalMarker() : false;<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        // Go behind the curtain so we can manage writing of the flush WAL marker<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl)<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>            ((HRegion)region).flushcache(true, writeFlushWalMarker);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        if (flushResult.isFlushSucceeded()) {<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>          regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>        }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>        boolean compactionNeeded = flushResult.isCompactionNeeded();<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        if (compactionNeeded) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          regionServer.compactSplitThread.requestSystemCompaction(region,<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>            "Compaction through user triggered flush");<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        builder.setFlushed(flushResult.isFlushSucceeded());<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores());<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      return builder.build();<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    } catch (DroppedSnapshotException ex) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>      // is required. Currently the only way to do this is a restart of<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      // the server.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>      throw new ServiceException(ex);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    } catch (IOException ie) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      throw new ServiceException(ie);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span><a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>  @Override<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>  public GetOnlineRegionResponse getOnlineRegion(final RpcController controller,<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      final GetOnlineRegionRequest request) throws ServiceException {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    try {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      checkOpen();<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      requestCount.increment();<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      Map&lt;String, Region&gt; onlineRegions = regionServer.onlineRegions;<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      List&lt;HRegionInfo&gt; list = new ArrayList&lt;HRegionInfo&gt;(onlineRegions.size());<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      for (Region region: onlineRegions.values()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>        list.add(region.getRegionInfo());<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      }<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      Collections.sort(list);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      return ResponseConverter.buildGetOnlineRegionResponse(list);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    } catch (IOException ie) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      throw new ServiceException(ie);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>  @Override<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      final GetRegionInfoRequest request) throws ServiceException {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      checkOpen();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      requestCount.increment();<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>      Region region = getRegion(request.getRegion());<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      HRegionInfo info = region.getRegionInfo();<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      builder.setRegionInfo(HRegionInfo.convert(info));<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        builder.setCompactionState(region.getCompactionState());<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      builder.setIsRecovering(region.isRecovering());<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      return builder.build();<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    } catch (IOException ie) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      throw new ServiceException(ie);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span><a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>  /**<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * Get some information of the region server.<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   *<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   * @param controller the RPC controller<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>   * @param request the request<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>   * @throws ServiceException<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>   */<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>  @Override<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>  public GetServerInfoResponse getServerInfo(final RpcController controller,<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      final GetServerInfoRequest request) throws ServiceException {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    try {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      checkOpen();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    } catch (IOException ie) {<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      throw new ServiceException(ie);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    requestCount.increment();<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1;<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>  }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>  @Override<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  public GetStoreFileResponse getStoreFile(final RpcController controller,<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      final GetStoreFileRequest request) throws ServiceException {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    try {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      checkOpen();<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      Region region = getRegion(request.getRegion());<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      requestCount.increment();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Set&lt;byte[]&gt; columnFamilies;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      if (request.getFamilyCount() == 0) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>        columnFamilies = region.getTableDesc().getFamiliesKeys();<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      } else {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>        columnFamilies = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        for (ByteString cf: request.getFamilyList()) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          columnFamilies.add(cf.toByteArray());<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        }<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      int nCF = columnFamilies.size();<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      List&lt;String&gt;  fileList = region.getStoreFileList(<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        columnFamilies.toArray(new byte[nCF][]));<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>      GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder();<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      builder.addAllStoreFile(fileList);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      return builder.build();<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    } catch (IOException ie) {<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      throw new ServiceException(ie);<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  /**<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   * Merge regions on the region server.<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>   *<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>   * @param controller the RPC controller<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>   * @param request the request<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>   * @return merge regions response<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>   * @throws ServiceException<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>   */<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  @Override<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>  @QosPriority(priority = HConstants.ADMIN_QOS)<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>  public MergeRegionsResponse mergeRegions(final RpcController controller,<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      final MergeRegionsRequest request) throws ServiceException {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    try {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      checkOpen();<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      requestCount.increment();<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>      Region regionA = getRegion(request.getRegionA());<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      Region regionB = getRegion(request.getRegionB());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>      boolean forcible = request.getForcible();<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>      long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      regionA.startRegionOperation(Operation.MERGE_REGION);<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      regionB.startRegionOperation(Operation.MERGE_REGION);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (regionA.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID ||<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>          regionB.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) {<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        throw new ServiceException(new MergeRegionException("Can't merge non-default replicas"));<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      LOG.info("Receiving merging request for  " + regionA + ", " + regionB<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          + ",forcible=" + forcible);<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>      long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>      FlushResult flushResult = regionA.flush(true);<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      if (flushResult.isFlushSucceeded()) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      }<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      startTime = EnvironmentEdgeManager.currentTime();<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      flushResult = regionB.flush(true);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      if (flushResult.isFlushSucceeded()) {<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>        long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>      regionServer.compactSplitThread.requestRegionsMerge(regionA, regionB, forcible,<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          masterSystemTime, RpcServer.getRequestUser());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      return MergeRegionsResponse.newBuilder().build();<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    } catch (DroppedSnapshotException ex) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      throw new ServiceException(ex);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>    } catch (IOException ie) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      throw new ServiceException(ie);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>  }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span><a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  /**<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>   * Open asynchronously a region or a set of regions on the region server.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>   *<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>   * The opening is coordinated by ZooKeeper, and this method requires the znode to be created<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>   *  before being called. As a consequence, this method should be called only from the master.<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>   * &lt;p&gt;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>   * Different manages states for the region are:<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>   * &lt;/p&gt;&lt;ul&gt;<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>   *  &lt;li&gt;region not opened: the region opening will start asynchronously.&lt;/li&gt;<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>   *  &lt;li&gt;a close is already in progress: this is considered as an error.&lt;/li&gt;<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>   *  &lt;li&gt;an open is already in progress: this new open request will be ignored. This is important<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>   *  because the Master can do multiple requests if it crashes.&lt;/li&gt;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>   *  &lt;li&gt;the region is already opened:  this new open request will be ignored.&lt;/li&gt;<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>   *  &lt;/ul&gt;<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>   * &lt;p&gt;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>   * Bulk assign: If there are more than 1 region to open, it will be considered as a bulk assign.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>   * For a single region opening, errors are sent through a ServiceException. For bulk assign,<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>   * errors are put in the response as FAILED_OPENING.<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>   * &lt;/p&gt;<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * @param controller the RPC controller<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @param request the request<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   * @throws ServiceException<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>   */<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  @Override<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>  public OpenRegionResponse openRegion(final RpcController controller,<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      final OpenRegionRequest request) throws ServiceException {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    requestCount.increment();<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    if (request.hasServerStartCode()) {<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      // check that we are the same server that this RPC is intended for.<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>      long serverStartCode = request.getServerStartCode();<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>            "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>            + regionServer.serverName));<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    OpenRegionResponse.Builder builder = OpenRegionResponse.newBuilder();<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    final int regionCount = request.getOpenInfoCount();<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    final Map&lt;TableName, HTableDescriptor&gt; htds =<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>        new HashMap&lt;TableName, HTableDescriptor&gt;(regionCount);<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    final boolean isBulkAssign = regionCount &gt; 1;<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    try {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      checkOpen();<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    } catch (IOException ie) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>      TableName tableName = null;<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>      if (regionCount == 1) {<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>        RegionInfo ri = request.getOpenInfo(0).getRegion();<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>        if (ri != null) {<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          tableName = ProtobufUtil.toTableName(ri.getTableName());<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>        }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      if (!TableName.META_TABLE_NAME.equals(tableName)) {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>        throw new ServiceException(ie);<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>      // We are assigning meta, wait a little for regionserver to finish initialization.<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>      int timeout = regionServer.conf.getInt(HConstants.HBASE_RPC_TIMEOUT_KEY,<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        HConstants.DEFAULT_HBASE_RPC_TIMEOUT) &gt;&gt; 2; // Quarter of RPC timeout<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      long endTime = System.currentTimeMillis() + timeout;<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>      synchronized (regionServer.online) {<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>        try {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>          while (System.currentTimeMillis() &lt;= endTime<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>              &amp;&amp; !regionServer.isStopped() &amp;&amp; !regionServer.isOnline()) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>            regionServer.online.wait(regionServer.msgInterval);<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          }<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          checkOpen();<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        } catch (InterruptedException t) {<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          Thread.currentThread().interrupt();<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          throw new ServiceException(t);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>        } catch (IOException e) {<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          throw new ServiceException(e);<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>        }<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>      }<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    }<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1;<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>    for (RegionOpenInfo regionOpenInfo : request.getOpenInfoList()) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>      final HRegionInfo region = HRegionInfo.convert(regionOpenInfo.getRegion());<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>      HTableDescriptor htd;<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>      try {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>        String encodedName = region.getEncodedName();<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        byte[] encodedNameBytes = region.getEncodedNameAsBytes();<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>        final Region onlineRegion = regionServer.getFromOnlineRegions(encodedName);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>        if (onlineRegion != null) {<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>          // The region is already online. This should not happen any more.<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>          String error = "Received OPEN for the region:"<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            + region.getRegionNameAsString() + ", which is already online";<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>          regionServer.abort(error);<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>          throw new IOException(error);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>        }<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        LOG.info("Open " + region.getRegionNameAsString());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        htd = htds.get(region.getTable());<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        if (htd == null) {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          htd = regionServer.tableDescriptors.get(region.getTable());<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>          htds.put(region.getTable(), htd);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>        }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>        final Boolean previous = regionServer.regionsInTransitionInRS.putIfAbsent(<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          encodedNameBytes, Boolean.TRUE);<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        if (Boolean.FALSE.equals(previous)) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          if (regionServer.getFromOnlineRegions(encodedName) != null) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            // There is a close in progress. This should not happen any more.<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>            String error = "Received OPEN for the region:"<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              + region.getRegionNameAsString() + ", which we are already trying to CLOSE";<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            regionServer.abort(error);<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>            throw new IOException(error);<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>          }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          regionServer.regionsInTransitionInRS.put(encodedNameBytes, Boolean.TRUE);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        }<a name="line.1657"></a>
+<span class="sourceLineNo">1150</span>    ByteString value = regionSpecifier.getValue();<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    RegionSpecifierType type = regionSpecifier.getType();<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    switch (type) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      case REGION_NAME:<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        byte[] regionName = value.toByteArray();<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>        String encodedRegionName = HRegionInfo.encodeRegionName(regionName);<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>        return regionServer.getRegionByEncodedName(regionName, encodedRegionName);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      case ENCODED_REGION_NAME:<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        return regionServer.getRegionByEncodedName(value.toStringUtf8());<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      default:<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        throw new DoNotRetryIOException(<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          "Unsupported region specifier type: " + type);<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span><a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  @VisibleForTesting<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>  public PriorityFunction getPriority() {<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    return priority;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span><a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>  @VisibleForTesting<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  public Configuration getConfiguration() {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    return regionServer.getConfiguration();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  private RegionServerQuotaManager getQuotaManager() {<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    return regionServer.getRegionServerQuotaManager();<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span><a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>  void start() {<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    rpcServer.start();<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  }<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span><a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>  void stop() {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    closeAllScanners();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    rpcServer.stop();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>  }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span><a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>  /**<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   * Called to verify that this server is up and running.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   *<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @throws IOException<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   */<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  protected void checkOpen() throws IOException {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    if (regionServer.isAborted()) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      throw new RegionServerAbortedException("Server " + regionServer.serverName + " aborting");<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regionServer.isStopped()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      throw new RegionServerStoppedException("Server " + regionServer.serverName + " stopping");<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    if (!regionServer.fsOk) {<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      throw new RegionServerStoppedException("File system not available");<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!regionServer.isOnline()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      throw new ServerNotRunningYetException("Server is not running yet");<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>  }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span><a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  /**<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * @return list of blocking services and their security info classes that this server supports<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   */<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>  protected List&lt;BlockingServiceAndInterface&gt; getServices() {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    List&lt;BlockingServiceAndInterface&gt; bssi = new ArrayList&lt;BlockingServiceAndInterface&gt;(2);<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      ClientService.newReflectiveBlockingService(this),<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      ClientService.BlockingInterface.class));<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      AdminService.newReflectiveBlockingService(this),<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      AdminService.BlockingInterface.class));<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    return bssi;<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>  public InetSocketAddress getSocketAddress() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return isa;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  @Override<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    return priority.getPriority(header, param, user);<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return priority.getDeadline(header, param);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  /*<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>   * Check if an OOME and, if so, abort immediately to avoid creating more objects.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>   *<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>   * @param e<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   *<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * @return True if we OOME'd and are aborting.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  public boolean checkOOME(final Throwable e) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    boolean stop = false;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>      if (e instanceof OutOfMemoryError<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>          || (e.getCause() != null &amp;&amp; e.getCause() instanceof OutOfMemoryError)<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>          || (e.getMessage() != null &amp;&amp; e.getMessage().contains(<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>              "java.lang.OutOfMemoryError"))) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        stop = true;<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>        LOG.fatal("Run out of memory; " + getClass().getSimpleName()<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>          + " will abort itself immediately", e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    } finally {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      if (stop) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        Runtime.getRuntime().halt(1);<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    return stop;<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span><a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>  /**<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   * Close a region on the region server.<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>   *<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>   * @param controller the RPC controller<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>   * @param request the request<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>   * @throws ServiceException<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>   */<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>  public CloseRegionResponse closeRegion(final RpcController controller,<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      final CloseRegionRequest request) throws ServiceException {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    final ServerName sn = (request.hasDestinationServer() ?<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      ProtobufUtil.toServerName(request.getDestinationServer()) : null);<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    try {<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>      checkOpen();<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      if (request.hasServerStartCode()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        // check that we are the same server that this RPC is intended for.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        long serverStartCode = request.getServerStartCode();<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>        if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>              "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>              + regionServer.serverName));<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion());<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // Can be null if we're calling close on a region that's not online<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      final Region region = regionServer.getFromOnlineRegions(encodedRegionName);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      if ((region  != null) &amp;&amp; (region .getCoprocessorHost() != null)) {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>        region.getCoprocessorHost().preClose(false);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      requestCount.increment();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      LOG.info("Close " + encodedRegionName + ", moving to " + sn);<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      boolean closed = regionServer.closeRegion(encodedRegionName, false, sn);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return builder.build();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    } catch (IOException ie) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      throw new ServiceException(ie);<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span><a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  /**<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * Compact a region on the region server.<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   *<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   * @param controller the RPC controller<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * @param request the request<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * @throws ServiceException<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  @Override<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>      final CompactRegionRequest request) throws ServiceException {<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    try {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>      checkOpen();<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>      requestCount.increment();<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      Region region = getRegion(request.getRegion());<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      region.startRegionOperation(Operation.COMPACT_REGION);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString());<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      boolean major = false;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      byte [] family = null;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>      Store store = null;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>      if (request.hasFamily()) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>        family = request.getFamily().toByteArray();<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>        store = region.getStore(family);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>        if (store == null) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>          throw new ServiceException(new IOException("column family " + Bytes.toString(family)<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>            + " does not exist in region " + region.getRegionInfo().getRegionNameAsString()));<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>        }<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      if (request.hasMajor()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        major = request.getMajor();<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      if (major) {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        if (family != null) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>          store.triggerMajorCompaction();<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        } else {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>          region.triggerMajorCompaction();<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span><a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):"";<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (LOG.isTraceEnabled()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        LOG.trace("User-triggered compaction requested for region "<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          + region.getRegionInfo().getRegionNameAsString() + familyLogMsg);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      if(family != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>        regionServer.compactSplitThread.requestCompaction(region, store, log,<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>      } else {<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>        regionServer.compactSplitThread.requestCompaction(region, log,<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return CompactRegionResponse.newBuilder().build();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    } catch (IOException ie) {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      throw new ServiceException(ie);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span><a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>  /**<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * Flush a region on the region server.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   *<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * @param controller the RPC controller<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * @param request the request<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * @throws ServiceException<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   */<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  @Override<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  public FlushRegionResponse flushRegion(final RpcController controller,<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>      final FlushRegionRequest request) throws ServiceException {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    try {<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      checkOpen();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      requestCount.increment();<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      Region region = getRegion(request.getRegion());<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>      LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString());<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>      boolean shouldFlush = true;<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      if (request.hasIfOlderThanTs()) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        shouldFlush = region.getEarliestFlushTimeForAllStores() &lt; request.getIfOlderThanTs();<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      if (shouldFlush) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        boolean writeFlushWalMarker =  request.hasWriteFlushWalMarker() ?<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>            request.getWriteFlushWalMarker() : false;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>        // Go behind the curtain so we can manage writing of the flush WAL marker<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl)<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            ((HRegion)region).flushcache(true, writeFlushWalMarker);<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        if (flushResult.isFlushSucceeded()) {<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        boolean compactionNeeded = flushResult.isCompactionNeeded();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>        if (compactionNeeded) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>          regionServer.compactSplitThread.requestSystemCompaction(region,<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>            "Compaction through user triggered flush");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        }<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        builder.setFlushed(flushResult.isFlushSucceeded());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker);<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores());<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return builder.build();<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    } catch (DroppedSnapshotException ex) {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>      // is required. Currently the only way to do this is a restart of<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      // the server.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>      throw new ServiceException(ex);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    } catch (IOException ie) {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      throw new ServiceException(ie);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>  }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>  @Override<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>  public GetOnlineRegionResponse getOnlineRegion(final RpcController controller,<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      final GetOnlineRegionRequest request) throws ServiceException {<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    try {<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>      checkOpen();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      requestCount.increment();<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>      Map&lt;String, Region&gt; onlineRegions = regionServer.onlineRegions;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      List&lt;HRegionInfo&gt; list = new ArrayList&lt;HRegionInfo&gt;(onlineRegions.size());<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      for (Region region: onlineRegions.values()) {<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        list.add(region.getRegionInfo());<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      }<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>      Collections.sort(list);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      return ResponseConverter.buildGetOnlineRegionResponse(list);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    } catch (IOException ie) {<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      throw new ServiceException(ie);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    }<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>  }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      final GetRegionInfoRequest request) throws ServiceException {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>    try {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>      checkOpen();<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      requestCount.increment();<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      Region region = getRegion(request.getRegion());<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      HRegionInfo info = region.getRegionInfo();<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      builder.setRegionInfo(HRegionInfo.convert(info));<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>        builder.setCompactionState(region.getCompactionState());<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>      }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>      builder.setIsRecovering(region.isRecovering());<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>      return builder.build();<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    } catch (IOException ie) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throw new ServiceException(ie);<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    }<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span><a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>  /**<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>   * Get some information of the region server.<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>   *<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>   * @param controller the RPC controller<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>   * @param request the request<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * @throws ServiceException<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  @Override<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>  public GetServerInfoResponse getServerInfo(final RpcController controller,<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      final GetServerInfoRequest request) throws ServiceException {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    try {<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      checkOpen();<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    } catch (IOException ie) {<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      throw new ServiceException(ie);<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>    }<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    requestCount.increment();<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>  }<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span><a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>  @Override<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>  public GetStoreFileResponse getStoreFile(final RpcController controller,<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      final GetStoreFileRequest request) throws ServiceException {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    try {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      checkOpen();<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      Region region = getRegion(request.getRegion());<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      requestCount.increment();<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>      Set&lt;byte[]&gt; columnFamilies;<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>      if (request.getFamilyCount() == 0) {<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>        columnFamilies = region.getTableDesc().getFamiliesKeys();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      } else {<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>        columnFamilies = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>        for (ByteString cf: request.getFamilyList()) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>          columnFamilies.add(cf.toByteArray());<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>      }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>      int nCF = columnFamilies.size();<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      List&lt;String&gt;  fileList = region.getStoreFileList(<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        columnFamilies.toArray(new byte[nCF][]));<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder();<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      builder.addAllStoreFile(fileList);<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      return builder.build();<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    } catch (IOException ie) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>      throw new ServiceException(ie);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>    }<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span><a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>  /**<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>   * Merge regions on the region server.<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   *<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   * @param controller the RPC controller<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>   * @param request the request<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>   * @return merge regions response<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>   * @throws ServiceException<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>   */<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  @Overri

<TRUNCATED>

[14/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
index e2c4389..d03724e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
@@ -5185,3056 +5185,3058 @@
 <span class="sourceLineNo">5177</span>   * @param readLock is the lock reader or writer. True indicates that a non-exlcusive<a name="line.5177"></a>
 <span class="sourceLineNo">5178</span>   *                 lock is requested<a name="line.5178"></a>
 <span class="sourceLineNo">5179</span>   */<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>  public RowLock getRowLock(byte[] row, boolean readLock) throws IOException {<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    // Make sure the row is inside of this region before getting the lock for it.<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    checkRow(row, "row lock");<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    // create an object to use a a key in the row lock map<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    HashedBytes rowKey = new HashedBytes(row);<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    RowLockContext rowLockContext = null;<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    RowLockImpl result = null;<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    TraceScope traceScope = null;<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span><a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    // If we're tracing start a span to show how long this took.<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>    if (Trace.isTracing()) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>      traceScope = Trace.startSpan("HRegion.getRowLock");<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>      traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock"));<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>    }<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span><a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    try {<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>      // Keep trying until we have a lock or error out.<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>      // TODO: do we need to add a time component here?<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>      while (result == null) {<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span><a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>        // Try adding a RowLockContext to the lockedRows.<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>        // If we can add it then there's no other transactions currently running.<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        rowLockContext = new RowLockContext(rowKey);<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>        RowLockContext existingContext = lockedRows.putIfAbsent(rowKey, rowLockContext);<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span><a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>        // if there was a running transaction then there's already a context.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>        if (existingContext != null) {<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>          rowLockContext = existingContext;<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>        }<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span><a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>        // Now try an get the lock.<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>        //<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>        // This can fail as<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>        if (readLock) {<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>          result = rowLockContext.newReadLock();<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>        } else {<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>          result = rowLockContext.newWriteLock();<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>        }<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      }<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      if (!result.getLock().tryLock(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) {<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>        if (traceScope != null) {<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>          traceScope.getSpan().addTimelineAnnotation("Failed to get row lock");<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>        }<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>        result = null;<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>        // Clean up the counts just in case this was the thing keeping the context alive.<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        rowLockContext.cleanUp();<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        throw new IOException("Timed out waiting for lock for row: " + rowKey);<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>      }<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>      return result;<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>    } catch (InterruptedException ie) {<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>      LOG.warn("Thread interrupted waiting for lock on row: " + rowKey);<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>      iie.initCause(ie);<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>      if (traceScope != null) {<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>        traceScope.getSpan().addTimelineAnnotation("Interrupted exception getting row lock");<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>      }<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>      Thread.currentThread().interrupt();<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>      throw iie;<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    } finally {<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>      if (traceScope != null) {<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>        traceScope.close();<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>      }<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    }<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>  }<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span><a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>  @Override<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>  public void releaseRowLocks(List&lt;RowLock&gt; rowLocks) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>    if (rowLocks != null) {<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>      for (RowLock rowLock : rowLocks) {<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span>        rowLock.release();<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>      }<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>      rowLocks.clear();<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    }<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>  }<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span><a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>  @VisibleForTesting<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>  class RowLockContext {<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span>    private final HashedBytes row;<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    final AtomicBoolean usable = new AtomicBoolean(true);<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    final Object lock = new Object();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    RowLockContext(HashedBytes row) {<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>      this.row = row;<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    }<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span><a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    RowLockImpl newWriteLock() {<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>      Lock l = readWriteLock.writeLock();<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>      return getRowLock(l);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    }<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    RowLockImpl newReadLock() {<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>      Lock l = readWriteLock.readLock();<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>      return getRowLock(l);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    private RowLockImpl getRowLock(Lock l) {<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>      count.incrementAndGet();<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>      synchronized (lock) {<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        if (usable.get()) {<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>          return new RowLockImpl(this, l);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        } else {<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>          return null;<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        }<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>      }<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    }<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span><a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    void cleanUp() {<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>      long c = count.decrementAndGet();<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>      if (c &lt;= 0) {<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        synchronized (lock) {<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>          if (count.get() &lt;= 0 ){<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>            usable.set(false);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>            RowLockContext removed = lockedRows.remove(row);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>            assert removed == this: "we should never remove a different context";<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>          }<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        }<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>      }<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    }<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span><a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    @Override<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    public String toString() {<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>      return "RowLockContext{" +<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>          "row=" + row +<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>          ", readWriteLock=" + readWriteLock +<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>          ", count=" + count +<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>          '}';<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    }<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>  }<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span><a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>  /**<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>   * Class used to represent a lock on a row.<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>   */<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>  public static class RowLockImpl implements RowLock {<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    private final RowLockContext context;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    private final Lock lock;<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span><a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    public RowLockImpl(RowLockContext context, Lock lock) {<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>      this.context = context;<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>      this.lock = lock;<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    }<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span><a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    public Lock getLock() {<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>      return lock;<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    }<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span><a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    @VisibleForTesting<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>    public RowLockContext getContext() {<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      return context;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    }<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span><a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    @Override<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    public void release() {<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>      lock.unlock();<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>      context.cleanUp();<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>    }<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span><a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    @Override<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    public String toString() {<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>      return "RowLockImpl{" +<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>          "context=" + context +<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>          ", lock=" + lock +<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>          '}';<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>    }<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  }<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span><a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>  /**<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>   * Determines whether multiple column families are present<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>   * Precondition: familyPaths is not null<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>   *<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>   * @param familyPaths List of (column family, hfilePath)<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>   */<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>  private static boolean hasMultipleColumnFamilies(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) {<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    boolean multipleFamilies = false;<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    byte[] family = null;<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    for (Pair&lt;byte[], String&gt; pair : familyPaths) {<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>      byte[] fam = pair.getFirst();<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>      if (family == null) {<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>        family = fam;<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>      } else if (!Bytes.equals(family, fam)) {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>        multipleFamilies = true;<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>        break;<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>      }<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    }<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    return multipleFamilies;<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>  }<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span><a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  @Override<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>  public boolean bulkLoadHFiles(Collection&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, boolean assignSeqId,<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      BulkLoadListener bulkLoadListener) throws IOException {<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>    long seqId = -1;<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>    Map&lt;byte[], List&lt;Path&gt;&gt; storeFiles = new TreeMap&lt;byte[], List&lt;Path&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    Preconditions.checkNotNull(familyPaths);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    // we need writeLock for multi-family bulk load<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    startBulkRegionOperation(hasMultipleColumnFamilies(familyPaths));<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    try {<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      this.writeRequestsCount.increment();<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      // There possibly was a split that happened between when the split keys<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // were gathered and before the HRegion's write lock was taken.  We need<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      // to validate the HFile region before attempting to bulk load all of them<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>      List&lt;IOException&gt; ioes = new ArrayList&lt;IOException&gt;();<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>      List&lt;Pair&lt;byte[], String&gt;&gt; failures = new ArrayList&lt;Pair&lt;byte[], String&gt;&gt;();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>        byte[] familyName = p.getFirst();<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>        String path = p.getSecond();<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span><a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>        Store store = getStore(familyName);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>        if (store == null) {<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>          IOException ioe = new org.apache.hadoop.hbase.DoNotRetryIOException(<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>              "No such column family " + Bytes.toStringBinary(familyName));<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>          ioes.add(ioe);<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>        } else {<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>          try {<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>            store.assertBulkLoadHFileOk(new Path(path));<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>          } catch (WrongRegionException wre) {<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>            // recoverable (file doesn't fit in region)<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>            failures.add(p);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>          } catch (IOException ioe) {<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>            // unrecoverable (hdfs problem)<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>            ioes.add(ioe);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>          }<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>        }<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>      }<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span><a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>      // validation failed because of some sort of IO problem.<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>      if (ioes.size() != 0) {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>        IOException e = MultipleIOException.createIOException(ioes);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>        LOG.error("There were one or more IO errors when checking if the bulk load is ok.", e);<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>        throw e;<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>      }<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span><a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>      // validation failed, bail out before doing anything permanent.<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>      if (failures.size() != 0) {<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>        StringBuilder list = new StringBuilder();<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>        for (Pair&lt;byte[], String&gt; p : failures) {<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>          list.append("\n").append(Bytes.toString(p.getFirst())).append(" : ")<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>              .append(p.getSecond());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>        }<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        // problem when validating<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>        LOG.warn("There was a recoverable bulk load failure likely due to a" +<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>            " split.  These (family, HFile) pairs were not loaded: " + list);<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>        return false;<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>      }<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span><a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>      // We need to assign a sequential ID that's in between two memstores in order to preserve<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>      // the guarantee that all the edits lower than the highest sequential ID from all the<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>      // HFiles are flushed on disk. See HBASE-10958.  The sequence id returned when we flush is<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>      // guaranteed to be one beyond the file made when we flushed (or if nothing to flush, it is<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>      // a sequence id that we can be sure is beyond the last hfile written).<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>      if (assignSeqId) {<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        FlushResult fs = flushcache(true, false);<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>        if (fs.isFlushSucceeded()) {<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>        } else if (fs.getResult() == FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY) {<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>          seqId = ((FlushResultImpl)fs).flushSequenceId;<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>        } else {<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>          throw new IOException("Could not bulk load with an assigned sequential ID because the "+<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>            "flush didn't run. Reason for not flushing: " + ((FlushResultImpl)fs).failureReason);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>        }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span>      }<a name="line.5441"></a>
-<span class="sourceLineNo">5442</span><a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>      for (Pair&lt;byte[], String&gt; p : familyPaths) {<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        byte[] familyName = p.getFirst();<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>        String path = p.getSecond();<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>        Store store = getStore(familyName);<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>        try {<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>          String finalPath = path;<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>          if (bulkLoadListener != null) {<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>            finalPath = bulkLoadListener.prepareBulkLoad(familyName, path);<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>          }<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>          Path commitedStoreFile = store.bulkLoadHFile(finalPath, seqId);<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span><a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>          if(storeFiles.containsKey(familyName)) {<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>            storeFiles.get(familyName).add(commitedStoreFile);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>          } else {<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>            List&lt;Path&gt; storeFileNames = new ArrayList&lt;Path&gt;();<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>            storeFileNames.add(commitedStoreFile);<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>            storeFiles.put(familyName, storeFileNames);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>          }<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>          if (bulkLoadListener != null) {<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>            bulkLoadListener.doneBulkLoad(familyName, path);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>          }<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>        } catch (IOException ioe) {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>          // A failure here can cause an atomicity violation that we currently<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>          // cannot recover from since it is likely a failed HDFS operation.<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span><a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>          // TODO Need a better story for reverting partial failures due to HDFS.<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>          LOG.error("There was a partial failure due to IO when attempting to" +<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>              " load " + Bytes.toString(p.getFirst()) + " : " + p.getSecond(), ioe);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>          if (bulkLoadListener != null) {<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>            try {<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>              bulkLoadListener.failedBulkLoad(familyName, path);<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>            } catch (Exception ex) {<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>              LOG.error("Error while calling failedBulkLoad for family " +<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>                  Bytes.toString(familyName) + " with path " + path, ex);<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>            }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>          }<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>          throw ioe;<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>        }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>      }<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span><a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>      return true;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    } finally {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      if (wal != null &amp;&amp; !storeFiles.isEmpty()) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        // write a bulk load event when not all hfiles are loaded<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        try {<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>          WALProtos.BulkLoadDescriptor loadDescriptor = ProtobufUtil.toBulkLoadDescriptor(<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>              this.getRegionInfo().getTable(),<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>              ByteStringer.wrap(this.getRegionInfo().getEncodedNameAsBytes()), storeFiles, seqId);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>          WALUtil.writeBulkLoadMarkerAndSync(wal, this.htableDescriptor, getRegionInfo(),<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>              loadDescriptor, mvcc);<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span>        } catch (IOException ioe) {<a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>          if (this.rsServices != null) {<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>            // Have to abort region server because some hfiles has been loaded but we can't write<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>            // the event into WAL<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>            this.rsServices.abort("Failed to write bulk load event into WAL.", ioe);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>          }<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>        }<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>      }<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span><a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>      closeBulkRegionOperation();<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    }<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>  }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span><a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  @Override<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>  public boolean equals(Object o) {<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    return o instanceof HRegion &amp;&amp; Bytes.equals(getRegionInfo().getRegionName(),<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>                                                ((HRegion) o).getRegionInfo().getRegionName());<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>  }<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span><a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>  @Override<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>  public int hashCode() {<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    return Bytes.hashCode(getRegionInfo().getRegionName());<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>  }<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span><a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>  @Override<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>  public String toString() {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>    return getRegionInfo().getRegionNameAsString();<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>  }<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span><a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>  /**<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>   * RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>   */<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>  class RegionScannerImpl implements RegionScanner, org.apache.hadoop.hbase.ipc.RpcCallback {<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    // Package local for testability<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>    KeyValueHeap storeHeap = null;<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>    /** Heap of key-values that are not essential for the provided filters and are thus read<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>     * on demand, if on-demand column family loading is enabled.*/<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>    KeyValueHeap joinedHeap = null;<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>    /**<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>     * If the joined heap data gathering is interrupted due to scan limits, this will<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>     * contain the row for which we are populating the values.*/<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>    protected Cell joinedContinuationRow = null;<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    private boolean filterClosed = false;<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span><a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>    protected final int isScan;<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    protected final byte[] stopRow;<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    protected final HRegion region;<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    protected final CellComparator comparator;<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>    protected boolean copyCellsFromSharedMem = false;<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span><a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>    private final long readPt;<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>    private final long maxResultSize;<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>    private final ScannerContext defaultScannerContext;<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>    private final FilterWrapper filter;<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span><a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    @Override<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    public HRegionInfo getRegionInfo() {<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>      return region.getRegionInfo();<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>    }<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span><a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    public void setCopyCellsFromSharedMem(boolean copyCells) {<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>      this.copyCellsFromSharedMem = copyCells;<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    }<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span><a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    RegionScannerImpl(Scan scan, List&lt;KeyValueScanner&gt; additionalScanners, HRegion region,<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        boolean copyCellsFromSharedMem)<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>        throws IOException {<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>      this.region = region;<a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      this.maxResultSize = scan.getMaxResultSize();<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>      if (scan.hasFilter()) {<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        this.filter = new FilterWrapper(scan.getFilter());<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>      } else {<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>        this.filter = null;<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>      }<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      this.comparator = region.getCellCompartor();<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>      /**<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>       * By default, calls to next/nextRaw must enforce the batch limit. Thus, construct a default<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>       * scanner context that can be used to enforce the batch limit in the event that a<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>       * ScannerContext is not specified during an invocation of next/nextRaw<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>       */<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>      defaultScannerContext = ScannerContext.newBuilder()<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>          .setBatchLimit(scan.getBatch()).build();<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span><a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) &amp;&amp; !scan.isGetScan()) {<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>        this.stopRow = null;<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span>      } else {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        this.stopRow = scan.getStopRow();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>      }<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      // If we are doing a get, we want to be [startRow,endRow]. Normally<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>      // it is [startRow,endRow) and if startRow=endRow we get nothing.<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      this.isScan = scan.isGetScan() ? 1 : 0;<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span><a name="line.5584"></a>
-<span class="sourceLineNo">5585</span>      // synchronize on scannerReadPoints so that nobody calculates<a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>      // getSmallestReadPoint, before scannerReadPoints is updated.<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      IsolationLevel isolationLevel = scan.getIsolationLevel();<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      synchronized(scannerReadPoints) {<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>        this.readPt = getReadpoint(isolationLevel);<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        scannerReadPoints.put(this, this.readPt);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>      }<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span><a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>      // Here we separate all scanners into two lists - scanner that provide data required<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      // by the filter to operate (scanners list) and all others (joinedScanners list).<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>      List&lt;KeyValueScanner&gt; scanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>      List&lt;KeyValueScanner&gt; joinedScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>      if (additionalScanners != null) {<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>        scanners.addAll(additionalScanners);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>      }<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span><a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>      for (Map.Entry&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; entry : scan.getFamilyMap().entrySet()) {<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>        Store store = stores.get(entry.getKey());<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>        KeyValueScanner scanner;<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span>        try {<a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>          scanner = store.getScanner(scan, entry.getValue(), this.readPt);<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>        } catch (FileNotFoundException e) {<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>          throw handleFileNotFound(e);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>        }<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>        if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand()<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>          || this.filter.isFamilyEssential(entry.getKey())) {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>          scanners.add(scanner);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>        } else {<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>          joinedScanners.add(scanner);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>        }<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      }<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>      this.copyCellsFromSharedMem = copyCellsFromSharedMem;<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      initializeKVHeap(scanners, joinedScanners, region);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    }<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span><a name="line.5619"></a>
-<span class="sourceLineNo">5620</span>    protected void initializeKVHeap(List&lt;KeyValueScanner&gt; scanners,<a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>        List&lt;KeyValueScanner&gt; joinedScanners, HRegion region)<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>        throws IOException {<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      this.storeHeap = new KeyValueHeap(scanners, comparator);<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      if (!joinedScanners.isEmpty()) {<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>        this.joinedHeap = new KeyValueHeap(joinedScanners, comparator);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span>      }<a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    }<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span><a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    @Override<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    public long getMaxResultSize() {<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>      return maxResultSize;<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    @Override<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    public long getMvccReadPoint() {<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      return this.readPt;<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span>    }<a name="line.5637"></a>
-<span class="sourceLineNo">5638</span><a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>    @Override<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>    public int getBatch() {<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      return this.defaultScannerContext.getBatchLimit();<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>    }<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    /**<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>     * Reset both the filter and the old filter.<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>     *<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>     * @throws IOException in case a filter raises an I/O exception.<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>     */<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    protected void resetFilters() throws IOException {<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>      if (filter != null) {<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>        filter.reset();<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span>      }<a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    }<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span><a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    @Override<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>    public boolean next(List&lt;Cell&gt; outResults)<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>        throws IOException {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>      // apply the batching limit by default<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>      return next(outResults, defaultScannerContext);<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>    }<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span><a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    @Override<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    public synchronized boolean next(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    throws IOException {<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>      if (this.filterClosed) {<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>        throw new UnknownScannerException("Scanner was closed (timed out?) " +<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>            "after we renewed it. Could be caused by a very slow scanner " +<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>            "or a lengthy garbage collection");<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>      }<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>      startRegionOperation(Operation.SCAN);<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>      readRequestsCount.increment();<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>      try {<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>        return nextRaw(outResults, scannerContext);<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>      } finally {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>        closeRegionOperation(Operation.SCAN);<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>      }<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>    }<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span><a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    @Override<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    public boolean nextRaw(List&lt;Cell&gt; outResults) throws IOException {<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      // Use the RegionScanner's context by default<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return nextRaw(outResults, defaultScannerContext);<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span><a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>    @Override<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>    public boolean nextRaw(List&lt;Cell&gt; outResults, ScannerContext scannerContext)<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        throws IOException {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>      if (storeHeap == null) {<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        // scanner is closed<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>        throw new UnknownScannerException("Scanner was closed");<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      }<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      boolean moreValues = false;<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      try {<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>        if (outResults.isEmpty()) {<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>          // Usually outResults is empty. This is true when next is called<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>          // to handle scan or get operation.<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>          moreValues = nextInternal(outResults, scannerContext);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        } else {<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>          List&lt;Cell&gt; tmpList = new ArrayList&lt;Cell&gt;();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>          moreValues = nextInternal(tmpList, scannerContext);<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>          outResults.addAll(tmpList);<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        }<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span><a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        // If the size limit was reached it means a partial Result is being<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>        // returned. Returning a<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        // partial Result means that we should not reset the filters; filters<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>        // should only be reset in<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>        // between rows<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>        if (!scannerContext.partialResultFormed()) resetFilters();<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span><a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>        if (isFilterDoneInternal()) {<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>          moreValues = false;<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>        }<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span><a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        // If copyCellsFromSharedMem = true, then we need to copy the cells. Otherwise<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>        // it is a call coming from the RsRpcServices.scan().<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        if (copyCellsFromSharedMem &amp;&amp; !outResults.isEmpty()) {<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>          // Do the copy of the results here.<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          ListIterator&lt;Cell&gt; listItr = outResults.listIterator();<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          Cell cell = null;<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          while (listItr.hasNext()) {<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>            cell = listItr.next();<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>            if (cell instanceof ShareableMemory) {<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>              listItr.set(((ShareableMemory) cell).cloneToCell());<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>            }<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>          }<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>        }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>      } finally {<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        if (copyCellsFromSharedMem) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          // In case of copyCellsFromSharedMem==true (where the CPs wrap a scanner) we return<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          // the blocks then and there (for wrapped CPs)<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>          this.shipped();<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>      return moreValues;<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    }<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    /**<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>     * @return true if more cells exist after this batch, false if scanner is done<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>     */<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>    private boolean populateFromJoinedHeap(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>            throws IOException {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      assert joinedContinuationRow != null;<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>      boolean moreValues = populateResult(results, this.joinedHeap, scannerContext,<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>          joinedContinuationRow);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      if (!scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>        // We are done with this row, reset the continuation.<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>        joinedContinuationRow = null;<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span>      }<a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>      // As the data is obtained from two independent heaps, we need to<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>      // ensure that result list is sorted, because Result relies on that.<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>      Collections.sort(results, comparator);<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>      return moreValues;<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>    }<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    /**<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>     * Fetches records with currentRow into results list, until next row, batchLimit (if not -1) is<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>     * reached, or remainingResultSize (if not -1) is reaced<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>     * @param heap KeyValueHeap to fetch data from.It must be positioned on correct row before call.<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>     * @param scannerContext<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>     * @param currentRowCell<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>     * @return state of last call to {@link KeyValueHeap#next()}<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>     */<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    private boolean populateResult(List&lt;Cell&gt; results, KeyValueHeap heap,<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>        ScannerContext scannerContext, Cell currentRowCell) throws IOException {<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      Cell nextKv;<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      boolean moreCellsInRow = false;<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      boolean tmpKeepProgress = scannerContext.getKeepProgress();<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      // Scanning between column families and thus the scope is between cells<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      LimitScope limitScope = LimitScope.BETWEEN_CELLS;<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      try {<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>        do {<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>          // We want to maintain any progress that is made towards the limits while scanning across<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>          // different column families. To do this, we toggle the keep progress flag on during calls<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>          // to the StoreScanner to ensure that any progress made thus far is not wiped away.<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>          scannerContext.setKeepProgress(true);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>          heap.next(results, scannerContext);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>          scannerContext.setKeepProgress(tmpKeepProgress);<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>          nextKv = heap.peek();<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>          moreCellsInRow = moreCellsInRow(nextKv, currentRowCell);<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>          if (!moreCellsInRow) incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>          if (scannerContext.checkBatchLimit(limitScope)) {<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>            return scannerContext.setScannerState(NextState.BATCH_LIMIT_REACHED).hasMoreValues();<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>          } else if (scannerContext.checkSizeLimit(limitScope)) {<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>            ScannerContext.NextState state =<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>              moreCellsInRow? NextState.SIZE_LIMIT_REACHED_MID_ROW: NextState.SIZE_LIMIT_REACHED;<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>          } else if (scannerContext.checkTimeLimit(limitScope)) {<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>            ScannerContext.NextState state =<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>              moreCellsInRow? NextState.TIME_LIMIT_REACHED_MID_ROW: NextState.TIME_LIMIT_REACHED;<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>            return scannerContext.setScannerState(state).hasMoreValues();<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>          }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>        } while (moreCellsInRow);<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>      } catch (FileNotFoundException e) {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>        throw handleFileNotFound(e);<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>      }<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      return nextKv != null;<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    }<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span><a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    /**<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>     * Based on the nextKv in the heap, and the current row, decide whether or not there are more<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>     * cells to be read in the heap. If the row of the nextKv in the heap matches the current row<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>     * then there are more cells to be read in the row.<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>     * @param nextKv<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>     * @param currentRowCell<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>     * @return true When there are more cells in the row to be read<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>     */<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>    private boolean moreCellsInRow(final Cell nextKv, Cell currentRowCell) {<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      return nextKv != null &amp;&amp; CellUtil.matchingRow(nextKv, currentRowCell);<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>    }<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span><a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>    /*<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>     * @return True if a filter rules the scanner is over, done.<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>     */<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    @Override<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    public synchronized boolean isFilterDone() throws IOException {<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      return isFilterDoneInternal();<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    }<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span><a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>    private boolean isFilterDoneInternal() throws IOException {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      return this.filter != null &amp;&amp; this.filter.filterAllRemaining();<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>    }<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span><a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    private boolean nextInternal(List&lt;Cell&gt; results, ScannerContext scannerContext)<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>        throws IOException {<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>      if (!results.isEmpty()) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>        throw new IllegalArgumentException("First parameter should be an empty list");<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>      }<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      if (scannerContext == null) {<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>        throw new IllegalArgumentException("Scanner context cannot be null");<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      RpcCallContext rpcCall = RpcServer.getCurrentCall();<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span><a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>      // Save the initial progress from the Scanner context in these local variables. The progress<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      // may need to be reset a few times if rows are being filtered out so we save the initial<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      // progress.<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      int initialBatchProgress = scannerContext.getBatchProgress();<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>      long initialSizeProgress = scannerContext.getSizeProgress();<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>      long initialTimeProgress = scannerContext.getTimeProgress();<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      // The loop here is used only when at some point during the next we determine<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      // that due to effects of filters or otherwise, we have an empty row in the result.<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>      // Then we loop and try again. Otherwise, we must get out on the first iteration via return,<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>      // "true" if there's more data to read, "false" if there isn't (storeHeap is at a stop row,<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>      // and joinedHeap has no more data to read for the last row (if set, joinedContinuationRow).<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>      while (true) {<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>        // Starting to scan a new row. Reset the scanner progress according to whether or not<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>        // progress should be kept.<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>        if (scannerContext.getKeepProgress()) {<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>          // Progress should be kept. Reset to initial values seen at start of method invocation.<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>          scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>            initialTimeProgress);<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        } else {<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>          scannerContext.clearProgress();<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        }<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>        if (rpcCall != null) {<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>          // If a user specifies a too-restrictive or too-slow scanner, the<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>          // client might time out and disconnect while the server side<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>          // is still processing the request. We should abort aggressively<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>          // in that case.<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>          long afterTime = rpcCall.disconnectSince();<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>          if (afterTime &gt;= 0) {<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>            throw new CallerDisconnectedException(<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>                "Aborting on region " + getRegionInfo().getRegionNameAsString() + ", call " +<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>                    this + " after " + afterTime + " ms, since " +<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>                    "caller disconnected");<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          }<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span><a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>        // Let's see what we have in the storeHeap.<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>        Cell current = this.storeHeap.peek();<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span><a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>        boolean stopRow = isStopRow(current);<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // When has filter row is true it means that the all the cells for a particular row must be<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        // read before a filtering decision can be made. This means that filters where hasFilterRow<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>        // run the risk of encountering out of memory errors in the case that they are applied to a<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>        // table that has very large rows.<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>        boolean hasFilterRow = this.filter != null &amp;&amp; this.filter.hasFilterRow();<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span><a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>        // If filter#hasFilterRow is true, partial results are not allowed since allowing them<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>        // would prevent the filters from being evaluated. Thus, if it is true, change the<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>        // scope of any limits that could potentially create partial results to<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>        // LimitScope.BETWEEN_ROWS so that those limits are not reached mid-row<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>        if (hasFilterRow) {<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>          if (LOG.isTraceEnabled()) {<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>            LOG.trace("filter#hasFilterRow is true which prevents partial results from being "<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>                + " formed. Changing scope of limits that may create partials");<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span>          }<a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>          scannerContext.setSizeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>          scannerContext.setTimeLimitScope(LimitScope.BETWEEN_ROWS);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>        }<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span><a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>        // Check if we were getting data from the joinedHeap and hit the limit.<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>        // If not, then it's main path - getting results from storeHeap.<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>        if (joinedContinuationRow == null) {<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>          // First, check if we are at a stop row. If so, there are no more results.<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>          if (stopRow) {<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>            if (hasFilterRow) {<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>              filter.filterRowCells(results);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>            }<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>          }<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span><a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>          // Check if rowkey filter wants to exclude this row. If so, loop to next.<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>          // Technically, if we hit limits before on this row, we don't need this call.<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>          if (filterRowKey(current)) {<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>            // Typically the count of rows scanned is incremented inside #populateResult. However,<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>            // here we are filtering a row based purely on its row key, preventing us from calling<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>            // #populateResult. Thus, perform the necessary increment here to rows scanned metric<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>            incrementCountOfRowsScannedMetric(scannerContext);<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>            if (!moreRows) {<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>            }<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>            results.clear();<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>            continue;<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>          }<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span><a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>          // Ok, we are good, let's try to get some results from the main heap.<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>          populateResult(results, this.storeHeap, scannerContext, current);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>            if (hasFilterRow) {<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>              throw new IncompatibleFilterException(<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>                  "Filter whose hasFilterRow() returns true is incompatible with scans that must "<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>                      + " stop mid-row because of a limit. ScannerContext:" + scannerContext);<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>            }<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>            return true;<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>          }<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span><a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>          Cell nextKv = this.storeHeap.peek();<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>          stopRow = nextKv == null || isStopRow(nextKv);<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>          // save that the row was empty before filters applied to it.<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>          final boolean isEmptyRow = results.isEmpty();<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span><a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>          // We have the part of the row necessary for filtering (all of it, usually).<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>          // First filter with the filterRow(List).<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>          FilterWrapper.FilterRowRetCode ret = FilterWrapper.FilterRowRetCode.NOT_CALLED;<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>          if (hasFilterRow) {<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>            ret = filter.filterRowCellsWithRet(results);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span><a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>            // We don't know how the results have changed after being filtered. Must set progress<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>            // according to contents of results now. However, a change in the results should not<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>            // affect the time progress. Thus preserve whatever time progress has been made<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>            long timeProgress = scannerContext.getTimeProgress();<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>            if (scannerContext.getKeepProgress()) {<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>              scannerContext.setProgress(initialBatchProgress, initialSizeProgress,<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>                initialTimeProgress);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>            } else {<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>              scannerContext.clearProgress();<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>            }<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>            scannerContext.setTimeProgress(timeProgress);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>            scannerContext.incrementBatchProgress(results.size());<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>            for (Cell cell : results) {<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>              scannerContext.incrementSizeProgress(CellUtil.estimatedHeapSizeOf(cell));<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>            }<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>          }<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span><a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>          if (isEmptyRow || ret == FilterWrapper.FilterRowRetCode.EXCLUDE || filterRow()) {<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>            incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>            results.clear();<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>            boolean moreRows = nextRow(scannerContext, current);<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>            if (!moreRows) {<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>              return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>            }<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>            // This row was totally filtered out, if this is NOT the last row,<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>            // we should continue on. Otherwise, nothing else to do.<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>            if (!stopRow) continue;<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>          }<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>          // Ok, we are done with storeHeap for this row.<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>          // Now we may need to fetch additional, non-essential data into row.<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>          // These values are not needed for filter to work, so we postpone their<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>          // fetch to (possibly) reduce amount of data loads from disk.<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>          if (this.joinedHeap != null) {<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>            boolean mayHaveData = joinedHeapMayHaveData(current);<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>            if (mayHaveData) {<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>              joinedContinuationRow = current;<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>              populateFromJoinedHeap(results, scannerContext);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span><a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>              if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>                return true;<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>              }<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>            }<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>          }<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>        } else {<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>          // Populating from the joined heap was stopped by limits, populate some more.<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>          populateFromJoinedHeap(results, scannerContext);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>          if (scannerContext.checkAnyLimitReached(LimitScope.BETWEEN_CELLS)) {<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>            return true;<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>          }<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>        }<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>        // We may have just called populateFromJoinedMap and hit the limits. If that is<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>        // the case, we need to call it again on the next next() invocation.<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span>        if (joinedContinuationRow != null) {<a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>        }<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span><a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>        // Finally, we are done with both joinedHeap and storeHeap.<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>        // Double check to prevent empty rows from appearing in result. It could be<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>        // the case when SingleColumnValueExcludeFilter is used.<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>        if (results.isEmpty()) {<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>          incrementCountOfRowsFilteredMetric(scannerContext);<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>          boolean moreRows = nextRow(scannerContext, current);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>          if (!moreRows) {<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>            return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>          }<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>          if (!stopRow) continue;<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>        }<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>        if (stopRow) {<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>        } else {<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>          return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>        }<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      }<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    }<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span><a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    protected void incrementCountOfRowsFilteredMetric(ScannerContext scannerContext) {<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span><a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      scannerContext.getMetrics().countOfRowsFiltered.incrementAndGet();<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    }<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span><a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    protected void incrementCountOfRowsScannedMetric(ScannerContext scannerContext) {<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      if (scannerContext == null || !scannerContext.isTrackingMetrics()) return;<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span><a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      scannerContext.getMetrics().countOfRowsScanned.incrementAndGet();<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    }<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span><a name="lin

<TRUNCATED>

[34/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
index b59d17d..caf98ca 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
@@ -907,428 +907,430 @@
 <span class="sourceLineNo">899</span>        cellBlockBuilder.setLength(cellBlock.limit());<a name="line.899"></a>
 <span class="sourceLineNo">900</span>        builder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.900"></a>
 <span class="sourceLineNo">901</span>      }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      // Only pass priority if there one.  Let zero be same as no priority.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      if (priority != 0) builder.setPriority(priority);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      RequestHeader header = builder.build();<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>      setupIOstreams();<a name="line.906"></a>
+<span class="sourceLineNo">902</span>      // Only pass priority if there is one set.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>      if (priority != PayloadCarryingRpcController.PRIORITY_UNSET) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        builder.setPriority(priority);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      RequestHeader header = builder.build();<a name="line.906"></a>
 <span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // Now we're going to write the call. We take the lock, then check that the connection<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      //  is still valid, and, if so we do the write to the socket. If the write fails, we don't<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      //  know where we stand, we have to close the connection.<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      checkIsOpen();<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      IOException writeException = null;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      synchronized (this.outLock) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>        if (Thread.interrupted()) throw new InterruptedIOException();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>        calls.put(call.id, call); // We put first as we don't want the connection to become idle.<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        checkIsOpen(); // Now we're checking that it didn't became idle in between.<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>        try {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>          call.callStats.setRequestSizeBytes(IPCUtil.write(this.out, header, call.param,<a name="line.920"></a>
-<span class="sourceLineNo">921</span>              cellBlock));<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        } catch (IOException e) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          // We set the value inside the synchronized block, this way the next in line<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          //  won't even try to write. Otherwise we might miss a call in the calls map?<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          shouldCloseConnection.set(true);<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          writeException = e;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          interrupt();<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        }<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // call close outside of the synchronized (outLock) to prevent deadlock - HBASE-14474<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (writeException != null) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        markClosed(writeException);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        close();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>      // We added a call, and may be started the connection close. In both cases, we<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      //  need to notify the reader.<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      doNotify();<a name="line.939"></a>
-<span class="sourceLineNo">940</span><a name="line.940"></a>
-<span class="sourceLineNo">941</span>      // Now that we notified, we can rethrow the exception if any. Otherwise we're good.<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      if (writeException != null) throw writeException;<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    }<a name="line.943"></a>
-<span class="sourceLineNo">944</span><a name="line.944"></a>
-<span class="sourceLineNo">945</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NN_NAKED_NOTIFY",<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        justification="Presume notifyAll is because we are closing/shutting down")<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    private synchronized void doNotify() {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      // Make a separate method so can do synchronize and add findbugs annotation; only one<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      // annotation at at time in source 1.7.<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      notifyAll(); // Findbugs: NN_NAKED_NOTIFY<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>    /* Receive a response.<a name="line.953"></a>
-<span class="sourceLineNo">954</span>     * Because only one receiver, so no synchronization on in.<a name="line.954"></a>
-<span class="sourceLineNo">955</span>     */<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    protected void readResponse() {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      if (shouldCloseConnection.get()) return;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      Call call = null;<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      boolean expectedCall = false;<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      try {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>        // See HBaseServer.Call.setResponse for where we write out the response.<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        // Total size of the response.  Unused.  But have to read it in anyways.<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        int totalSize = in.readInt();<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>        // Read the header<a name="line.965"></a>
-<span class="sourceLineNo">966</span>        ResponseHeader responseHeader = ResponseHeader.parseDelimitedFrom(in);<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        int id = responseHeader.getCallId();<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        call = calls.remove(id); // call.done have to be set before leaving this method<a name="line.968"></a>
-<span class="sourceLineNo">969</span>        expectedCall = (call != null &amp;&amp; !call.done);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        if (!expectedCall) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>          // So we got a response for which we have no corresponding 'call' here on the client-side.<a name="line.971"></a>
-<span class="sourceLineNo">972</span>          // We probably timed out waiting, cleaned up all references, and now the server decides<a name="line.972"></a>
-<span class="sourceLineNo">973</span>          // to return a response.  There is nothing we can do w/ the response at this stage. Clean<a name="line.973"></a>
-<span class="sourceLineNo">974</span>          // out the wire of the response so its out of the way and we can get other responses on<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          // this connection.<a name="line.975"></a>
-<span class="sourceLineNo">976</span>          int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>          int whatIsLeftToRead = totalSize - readSoFar;<a name="line.977"></a>
-<span class="sourceLineNo">978</span>          IOUtils.skipFully(in, whatIsLeftToRead);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>          if (call != null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            call.callStats.setResponseSizeBytes(totalSize);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>            call.callStats.setCallTimeMs(<a name="line.981"></a>
-<span class="sourceLineNo">982</span>                EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.982"></a>
-<span class="sourceLineNo">983</span>          }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>          return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        if (responseHeader.hasException()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>          ExceptionResponse exceptionResponse = responseHeader.getException();<a name="line.987"></a>
-<span class="sourceLineNo">988</span>          RemoteException re = createRemoteException(exceptionResponse);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          call.setException(re);<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.990"></a>
-<span class="sourceLineNo">991</span>          call.callStats.setCallTimeMs(<a name="line.991"></a>
-<span class="sourceLineNo">992</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          if (isFatalConnectionException(exceptionResponse)) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>            markClosed(re);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>          }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        } else {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>          Message value = null;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          if (call.responseDefaultType != null) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>            Builder builder = call.responseDefaultType.newBuilderForType();<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            ProtobufUtil.mergeDelimitedFrom(builder, in);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>            value = builder.build();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          }<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          CellScanner cellBlockScanner = null;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          if (responseHeader.hasCellBlockMeta()) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            int size = responseHeader.getCellBlockMeta().getLength();<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            byte [] cellBlock = new byte[size];<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            IOUtils.readFully(this.in, cellBlock, 0, cellBlock.length);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>            cellBlockScanner = ipcUtil.createCellScanner(this.codec, this.compressor, cellBlock);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>          call.setResponse(value, cellBlockScanner);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>          call.callStats.setCallTimeMs(<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      } catch (IOException e) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        if (expectedCall) call.setException(e);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        if (e instanceof SocketTimeoutException) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          // Clean up open calls but don't treat this as a fatal condition,<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          // since we expect certain responses to not make it by the specified<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          // {@link ConnectionId#rpcTimeout}.<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          if (LOG.isTraceEnabled()) LOG.trace("ignored", e);<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        } else {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>          // Treat this as a fatal condition and close this connection<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>          markClosed(e);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>        }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      } finally {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        cleanupCalls(false);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    }<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    /**<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * @return True if the exception is a fatal connection exception.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     */<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    private boolean isFatalConnectionException(final ExceptionResponse e) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      return e.getExceptionClassName().<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        equals(FatalConnectionException.class.getName());<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    /**<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>     * @param e exception to be wrapped<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>     * @return RemoteException made from passed &lt;code&gt;e&lt;/code&gt;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>     */<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    private RemoteException createRemoteException(final ExceptionResponse e) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      String innerExceptionClassName = e.getExceptionClassName();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      boolean doNotRetry = e.getDoNotRetry();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      return e.hasHostname()?<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        // If a hostname then add it to the RemoteWithExtrasException<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          e.getStackTrace(), e.getHostname(), e.getPort(), doNotRetry):<a name="line.1049"></a>
+<span class="sourceLineNo">908</span>      setupIOstreams();<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>      // Now we're going to write the call. We take the lock, then check that the connection<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      //  is still valid, and, if so we do the write to the socket. If the write fails, we don't<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      //  know where we stand, we have to close the connection.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      checkIsOpen();<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      IOException writeException = null;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      synchronized (this.outLock) {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        if (Thread.interrupted()) throw new InterruptedIOException();<a name="line.916"></a>
+<span class="sourceLineNo">917</span><a name="line.917"></a>
+<span class="sourceLineNo">918</span>        calls.put(call.id, call); // We put first as we don't want the connection to become idle.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>        checkIsOpen(); // Now we're checking that it didn't became idle in between.<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>        try {<a name="line.921"></a>
+<span class="sourceLineNo">922</span>          call.callStats.setRequestSizeBytes(IPCUtil.write(this.out, header, call.param,<a name="line.922"></a>
+<span class="sourceLineNo">923</span>              cellBlock));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        } catch (IOException e) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          // We set the value inside the synchronized block, this way the next in line<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          //  won't even try to write. Otherwise we might miss a call in the calls map?<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          shouldCloseConnection.set(true);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          writeException = e;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          interrupt();<a name="line.929"></a>
+<span class="sourceLineNo">930</span>        }<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      // call close outside of the synchronized (outLock) to prevent deadlock - HBASE-14474<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (writeException != null) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        markClosed(writeException);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        close();<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
+<span class="sourceLineNo">938</span><a name="line.938"></a>
+<span class="sourceLineNo">939</span>      // We added a call, and may be started the connection close. In both cases, we<a name="line.939"></a>
+<span class="sourceLineNo">940</span>      //  need to notify the reader.<a name="line.940"></a>
+<span class="sourceLineNo">941</span>      doNotify();<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>      // Now that we notified, we can rethrow the exception if any. Otherwise we're good.<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (writeException != null) throw writeException;<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NN_NAKED_NOTIFY",<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        justification="Presume notifyAll is because we are closing/shutting down")<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    private synchronized void doNotify() {<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // Make a separate method so can do synchronize and add findbugs annotation; only one<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      // annotation at at time in source 1.7.<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      notifyAll(); // Findbugs: NN_NAKED_NOTIFY<a name="line.952"></a>
+<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
+<span class="sourceLineNo">954</span><a name="line.954"></a>
+<span class="sourceLineNo">955</span>    /* Receive a response.<a name="line.955"></a>
+<span class="sourceLineNo">956</span>     * Because only one receiver, so no synchronization on in.<a name="line.956"></a>
+<span class="sourceLineNo">957</span>     */<a name="line.957"></a>
+<span class="sourceLineNo">958</span>    protected void readResponse() {<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      if (shouldCloseConnection.get()) return;<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      Call call = null;<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      boolean expectedCall = false;<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      try {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>        // See HBaseServer.Call.setResponse for where we write out the response.<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        // Total size of the response.  Unused.  But have to read it in anyways.<a name="line.964"></a>
+<span class="sourceLineNo">965</span>        int totalSize = in.readInt();<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>        // Read the header<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        ResponseHeader responseHeader = ResponseHeader.parseDelimitedFrom(in);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        int id = responseHeader.getCallId();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        call = calls.remove(id); // call.done have to be set before leaving this method<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        expectedCall = (call != null &amp;&amp; !call.done);<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        if (!expectedCall) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          // So we got a response for which we have no corresponding 'call' here on the client-side.<a name="line.973"></a>
+<span class="sourceLineNo">974</span>          // We probably timed out waiting, cleaned up all references, and now the server decides<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          // to return a response.  There is nothing we can do w/ the response at this stage. Clean<a name="line.975"></a>
+<span class="sourceLineNo">976</span>          // out the wire of the response so its out of the way and we can get other responses on<a name="line.976"></a>
+<span class="sourceLineNo">977</span>          // this connection.<a name="line.977"></a>
+<span class="sourceLineNo">978</span>          int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.978"></a>
+<span class="sourceLineNo">979</span>          int whatIsLeftToRead = totalSize - readSoFar;<a name="line.979"></a>
+<span class="sourceLineNo">980</span>          IOUtils.skipFully(in, whatIsLeftToRead);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>          if (call != null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>            call.callStats.setResponseSizeBytes(totalSize);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>            call.callStats.setCallTimeMs(<a name="line.983"></a>
+<span class="sourceLineNo">984</span>                EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.984"></a>
+<span class="sourceLineNo">985</span>          }<a name="line.985"></a>
+<span class="sourceLineNo">986</span>          return;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (responseHeader.hasException()) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          ExceptionResponse exceptionResponse = responseHeader.getException();<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          RemoteException re = createRemoteException(exceptionResponse);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          call.setException(re);<a name="line.991"></a>
+<span class="sourceLineNo">992</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>          call.callStats.setCallTimeMs(<a name="line.993"></a>
+<span class="sourceLineNo">994</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.994"></a>
+<span class="sourceLineNo">995</span>          if (isFatalConnectionException(exceptionResponse)) {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>            markClosed(re);<a name="line.996"></a>
+<span class="sourceLineNo">997</span>          }<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        } else {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>          Message value = null;<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>          if (call.responseDefaultType != null) {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>            Builder builder = call.responseDefaultType.newBuilderForType();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>            ProtobufUtil.mergeDelimitedFrom(builder, in);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>            value = builder.build();<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          }<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>          CellScanner cellBlockScanner = null;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          if (responseHeader.hasCellBlockMeta()) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>            int size = responseHeader.getCellBlockMeta().getLength();<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>            byte [] cellBlock = new byte[size];<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>            IOUtils.readFully(this.in, cellBlock, 0, cellBlock.length);<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>            cellBlockScanner = ipcUtil.createCellScanner(this.codec, this.compressor, cellBlock);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>          call.setResponse(value, cellBlockScanner);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>          call.callStats.setCallTimeMs(<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      } catch (IOException e) {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        if (expectedCall) call.setException(e);<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        if (e instanceof SocketTimeoutException) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>          // Clean up open calls but don't treat this as a fatal condition,<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>          // since we expect certain responses to not make it by the specified<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>          // {@link ConnectionId#rpcTimeout}.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>          if (LOG.isTraceEnabled()) LOG.trace("ignored", e);<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>        } else {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>          // Treat this as a fatal condition and close this connection<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>          markClosed(e);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      } finally {<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>        cleanupCalls(false);<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span><a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    /**<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>     * @return True if the exception is a fatal connection exception.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>     */<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    private boolean isFatalConnectionException(final ExceptionResponse e) {<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>      return e.getExceptionClassName().<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        equals(FatalConnectionException.class.getName());<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span><a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    /**<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>     * @param e exception to be wrapped<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>     * @return RemoteException made from passed &lt;code&gt;e&lt;/code&gt;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>     */<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    private RemoteException createRemoteException(final ExceptionResponse e) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      String innerExceptionClassName = e.getExceptionClassName();<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>      boolean doNotRetry = e.getDoNotRetry();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>      return e.hasHostname()?<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>        // If a hostname then add it to the RemoteWithExtrasException<a name="line.1049"></a>
 <span class="sourceLineNo">1050</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          e.getStackTrace(), doNotRetry);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    protected synchronized boolean markClosed(IOException e) {<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>      if (e == null) throw new NullPointerException();<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      boolean ret = shouldCloseConnection.compareAndSet(false, true);<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      if (ret) {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        if (LOG.isTraceEnabled()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          LOG.trace(getName() + ": marking at should close, reason: " + e.getMessage());<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>        }<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (callSender != null) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          callSender.close();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        }<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        notifyAll();<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      return ret;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    /**<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>     * Cleanup the calls older than a given timeout, in milli seconds.<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>     * @param allCalls true for all calls, false for only the calls in timeout<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     */<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    protected synchronized void cleanupCalls(boolean allCalls) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      Iterator&lt;Entry&lt;Integer, Call&gt;&gt; itor = calls.entrySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      while (itor.hasNext()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        Call c = itor.next().getValue();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        if (c.done) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>          // To catch the calls without timeout that were cancelled.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>          itor.remove();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        } else if (allCalls) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>          long waitTime = EnvironmentEdgeManager.currentTime() - c.getStartTime();<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          IOException ie = new ConnectionClosingException("Connection to " + getRemoteAddress()<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>              + " is closing. Call id=" + c.id + ", waitTime=" + waitTime);<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          c.setException(ie);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          itor.remove();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        } else if (c.checkAndSetTimeout()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1051</span>          e.getStackTrace(), e.getHostname(), e.getPort(), doNotRetry):<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          e.getStackTrace(), doNotRetry);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    protected synchronized boolean markClosed(IOException e) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      if (e == null) throw new NullPointerException();<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span><a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      boolean ret = shouldCloseConnection.compareAndSet(false, true);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>      if (ret) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>        if (LOG.isTraceEnabled()) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          LOG.trace(getName() + ": marking at should close, reason: " + e.getMessage());<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>        if (callSender != null) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>          callSender.close();<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        notifyAll();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>      return ret;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span><a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>     * Cleanup the calls older than a given timeout, in milli seconds.<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>     * @param allCalls true for all calls, false for only the calls in timeout<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>     */<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    protected synchronized void cleanupCalls(boolean allCalls) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      Iterator&lt;Entry&lt;Integer, Call&gt;&gt; itor = calls.entrySet().iterator();<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      while (itor.hasNext()) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>        Call c = itor.next().getValue();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        if (c.done) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>          // To catch the calls without timeout that were cancelled.<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          itor.remove();<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        } else if (allCalls) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          long waitTime = EnvironmentEdgeManager.currentTime() - c.getStartTime();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          IOException ie = new ConnectionClosingException("Connection to " + getRemoteAddress()<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>              + " is closing. Call id=" + c.id + ", waitTime=" + waitTime);<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>          c.setException(ie);<a name="line.1088"></a>
 <span class="sourceLineNo">1089</span>          itor.remove();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        } else {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>          // We expect the call to be ordered by timeout. It may not be the case, but stopping<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          //  at the first valid call allows to be sure that we still have something to do without<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>          //  spending too much time by reading the full list.<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          break;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span><a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>  /**<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>   * Used in test only. Construct an IPC cluster client whose values are of the<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>   * {@link Message} class.<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>   * @param conf configuration<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>   * @param clusterId the cluster id<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>   * @param factory socket factory<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   */<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @VisibleForTesting<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    this(conf, clusterId, factory, null, null);<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span><a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  /**<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>   * Construct an IPC cluster client whose values are of the {@link Message} class.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>   * @param conf configuration<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>   * @param clusterId the cluster id<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>   * @param factory socket factory<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>   * @param localAddr client socket bind address<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>   * @param metrics the connection metrics<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>   */<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory,<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      SocketAddress localAddr, MetricsConnection metrics) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    super(conf, clusterId, localAddr, metrics);<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    this.socketFactory = factory;<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    this.connections = new PoolMap&lt;ConnectionId, Connection&gt;(getPoolType(conf), getPoolSize(conf));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    this.failedServers = new FailedServers(conf);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  /**<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   * Used in test only. Construct an IPC client for the cluster {@code clusterId} with<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   * the default SocketFactory<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   */<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>  @VisibleForTesting<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  RpcClientImpl(Configuration conf, String clusterId) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), null, null);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span><a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  /**<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>   * Construct an IPC client for the cluster {@code clusterId} with the default SocketFactory<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   *<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * This method is called with reflection by the RpcClientFactory to create an instance<a name="line.1141"></a>
+<span class="sourceLineNo">1090</span>        } else if (c.checkAndSetTimeout()) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>          itor.remove();<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        } else {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          // We expect the call to be ordered by timeout. It may not be the case, but stopping<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>          //  at the first valid call allows to be sure that we still have something to do without<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          //  spending too much time by reading the full list.<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>          break;<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>        }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  }<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span><a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>  /**<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * Used in test only. Construct an IPC cluster client whose values are of the<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   * {@link Message} class.<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>   * @param conf configuration<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>   * @param clusterId the cluster id<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>   * @param factory socket factory<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  @VisibleForTesting<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    this(conf, clusterId, factory, null, null);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  /**<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>   * Construct an IPC cluster client whose values are of the {@link Message} class.<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>   * @param conf configuration<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>   * @param clusterId the cluster id<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>   * @param factory socket factory<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>   * @param localAddr client socket bind address<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>   * @param metrics the connection metrics<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>   */<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory,<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      SocketAddress localAddr, MetricsConnection metrics) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    super(conf, clusterId, localAddr, metrics);<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    this.socketFactory = factory;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    this.connections = new PoolMap&lt;ConnectionId, Connection&gt;(getPoolType(conf), getPoolSize(conf));<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    this.failedServers = new FailedServers(conf);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  /**<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   * Used in test only. Construct an IPC client for the cluster {@code clusterId} with<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   * the default SocketFactory<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   */<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>  @VisibleForTesting<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>  RpcClientImpl(Configuration conf, String clusterId) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), null, null);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  /**<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>   * Construct an IPC client for the cluster {@code clusterId} with the default SocketFactory<a name="line.1141"></a>
 <span class="sourceLineNo">1142</span>   *<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>   * @param conf configuration<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * @param clusterId the cluster id<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * @param localAddr client socket bind address.<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @param metrics the connection metrics<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public RpcClientImpl(Configuration conf, String clusterId, SocketAddress localAddr,<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      MetricsConnection metrics) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), localAddr, metrics);<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  /** Stop all threads related to this client.  No further calls may be made<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   * using this client. */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void close() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (LOG.isDebugEnabled()) LOG.debug("Stopping rpc client");<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!running.compareAndSet(true, false)) return;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    Set&lt;Connection&gt; connsToClose = null;<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    // wake up all connections<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    synchronized (connections) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      for (Connection conn : connections.values()) {<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>        conn.interrupt();<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>        if (conn.callSender != null) {<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          conn.callSender.interrupt();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>        // In case the CallSender did not setupIOStreams() yet, the Connection may not be started<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        // at all (if CallSender has a cancelled Call it can happen). See HBASE-13851<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        if (!conn.isAlive()) {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          if (connsToClose == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>            connsToClose = new HashSet&lt;Connection&gt;();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          connsToClose.add(conn);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    if (connsToClose != null) {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (Connection conn : connsToClose) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        if (conn.markClosed(new InterruptedIOException("RpcClient is closing"))) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>          conn.close();<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>        }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    // wait until all connections are closed<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    while (!connections.isEmpty()) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      try {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>        Thread.sleep(10);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      } catch (InterruptedException e) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.info("Interrupted while stopping the client. We still have " + connections.size() +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            " connections.");<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Thread.currentThread().interrupt();<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        return;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /** Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * threw an exception.<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   *          {@link UserProvider#getCurrent()} makes a new instance of User each time so will be a<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   *          new Connection each time.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * @throws InterruptedException<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * @throws IOException<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   */<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  @Override<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  protected Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc, MethodDescriptor md,<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>      Message param, Message returnType, User ticket, InetSocketAddress addr,<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      MetricsConnection.CallStats callStats)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      throws IOException, InterruptedException {<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    if (pcrc == null) {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      pcrc = new PayloadCarryingRpcController();<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    CellScanner cells = pcrc.cellScanner();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span><a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    final Call call = new Call(this.callIdCnt.getAndIncrement(), md, param, cells, returnType,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        pcrc.getCallTimeout(), MetricsConnection.newCallStats());<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    final Connection connection = getConnection(ticket, call, addr);<a name="line.1224"></a>
+<span class="sourceLineNo">1143</span>   * This method is called with reflection by the RpcClientFactory to create an instance<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   *<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * @param conf configuration<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   * @param clusterId the cluster id<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * @param localAddr client socket bind address.<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * @param metrics the connection metrics<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  public RpcClientImpl(Configuration conf, String clusterId, SocketAddress localAddr,<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>      MetricsConnection metrics) {<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), localAddr, metrics);<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  }<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  /** Stop all threads related to this client.  No further calls may be made<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * using this client. */<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>  @Override<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  public void close() {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    if (LOG.isDebugEnabled()) LOG.debug("Stopping rpc client");<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!running.compareAndSet(true, false)) return;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span><a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    Set&lt;Connection&gt; connsToClose = null;<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    // wake up all connections<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    synchronized (connections) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      for (Connection conn : connections.values()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>        conn.interrupt();<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>        if (conn.callSender != null) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>          conn.callSender.interrupt();<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        // In case the CallSender did not setupIOStreams() yet, the Connection may not be started<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>        // at all (if CallSender has a cancelled Call it can happen). See HBASE-13851<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        if (!conn.isAlive()) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>          if (connsToClose == null) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>            connsToClose = new HashSet&lt;Connection&gt;();<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          }<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>          connsToClose.add(conn);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>      }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    if (connsToClose != null) {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      for (Connection conn : connsToClose) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>        if (conn.markClosed(new InterruptedIOException("RpcClient is closing"))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>          conn.close();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>        }<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    // wait until all connections are closed<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>    while (!connections.isEmpty()) {<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      try {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        Thread.sleep(10);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>      } catch (InterruptedException e) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        LOG.info("Interrupted while stopping the client. We still have " + connections.size() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>            " connections.");<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        Thread.currentThread().interrupt();<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>        return;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>  /** Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * threw an exception.<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   *          {@link UserProvider#getCurrent()} makes a new instance of User each time so will be a<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>   *          new Connection each time.<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   * @throws InterruptedException<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * @throws IOException<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   */<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>  @Override<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  protected Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc, MethodDescriptor md,<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      Message param, Message returnType, User ticket, InetSocketAddress addr,<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      MetricsConnection.CallStats callStats)<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      throws IOException, InterruptedException {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    if (pcrc == null) {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      pcrc = new PayloadCarryingRpcController();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>    }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    CellScanner cells = pcrc.cellScanner();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span><a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    final Call call = new Call(this.callIdCnt.getAndIncrement(), md, param, cells, returnType,<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        pcrc.getCallTimeout(), MetricsConnection.newCallStats());<a name="line.1224"></a>
 <span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final CallFuture cts;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    if (connection.callSender != null) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      cts = connection.callSender.sendCall(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>        pcrc.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>          @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>          public void run(Object parameter) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>            connection.callSender.remove(cts);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        });<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        if (pcrc.isCanceled()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          // To finish if the call was cancelled before we set the notification (race condition)<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          call.callComplete();<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>          return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>        }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    } else {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      cts = null;<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      connection.tracedWriteRequest(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    while (!call.done) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      if (call.checkAndSetTimeout()) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        break;<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      }<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (connection.shouldCloseConnection.get()) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        throw new ConnectionClosingException("Call id=" + call.id +<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>            " on server " + addr + " aborted: connection is closing");<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      try {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>        synchronized (call) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>          if (call.done) break;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>          call.wait(Math.min(call.remainingTime(), 1000) + 1);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      } catch (InterruptedException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>        call.setException(new InterruptedIOException());<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>        throw e;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    if (call.error != null) {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      if (call.error instanceof RemoteException) {<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        call.error.fillInStackTrace();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>        throw call.error;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      }<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      // local exception<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      throw wrapException(addr, call.error);<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    }<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span><a name="line.1277"></a>
-<span class="sourceLineNo">1278</span><a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>  /**<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * Interrupt the connections to the given ip:port server. This should be called if the server<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   *  is known as actually dead. This will not prevent current operation to be retried, and,<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   *  depending on their own behavior, they may retry on the same server. This can be a feature,<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   *  for example at startup. In any case, they're likely to get connection refused (if the<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *  process died) or no route to host: i.e. their next retries should be faster and with a<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   *  safe exception.<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  @Override<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  public void cancelConnections(ServerName sn) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    synchronized (connections) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      for (Connection connection : connections.values()) {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        if (connection.isAlive() &amp;&amp;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>            connection.getRemoteAddress().getPort() == sn.getPort() &amp;&amp;<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>            connection.getRemoteAddress().getHostName().equals(sn.getHostname())) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>          LOG.info("The server on " + sn.toString() +<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>              " is dead - stopping the connection " + connection.remoteId);<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>          connection.interrupt(); // We're interrupting a Reader. It means we want it to finish.<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>                                  // This will close the connection as well.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>        }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>  }<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span><a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>  /**<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>   *  Get a connection from the pool, or create a new one and add it to the<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>   * pool. Connections to a given host/port are reused.<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>   */<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  protected Connection getConnection(User ticket, Call call, InetSocketAddress addr)<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  throws IOException {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    if (!running.get()) throw new StoppedRpcClientException();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    Connection connection;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    ConnectionId remoteId =<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      new ConnectionId(ticket, call.md.getService().getName(), addr);<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    synchronized (connections) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      connection = connections.get(remoteId);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      if (connection == null) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        connection = createConnection(remoteId, this.codec, this.compressor);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>        connections.put(remoteId, connection);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    return connection;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>}<a name="line.1323"></a>
+<span class="sourceLineNo">1226</span>    final Connection connection = getConnection(ticket, call, addr);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    final CallFuture cts;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    if (connection.callSender != null) {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>      cts = connection.callSender.sendCall(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        pcrc.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          @Override<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          public void run(Object parameter) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            connection.callSender.remove(cts);<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>          }<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>        });<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>        if (pcrc.isCanceled()) {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          // To finish if the call was cancelled before we set the notification (race condition)<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          call.callComplete();<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    } else {<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>      cts = null;<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>      connection.tracedWriteRequest(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    }<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    while (!call.done) {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      if (call.checkAndSetTimeout()) {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>        break;<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      if (connection.shouldCloseConnection.get()) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        throw new ConnectionClosingException("Call id=" + call.id +<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>            " on server " + addr + " aborted: connection is closing");<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>      }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      try {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        synchronized (call) {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>          if (call.done) break;<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>          call.wait(Math.min(call.remainingTime(), 1000) + 1);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>        }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      } catch (InterruptedException e) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        call.setException(new InterruptedIOException());<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        throw e;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    if (call.error != null) {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      if (call.error instanceof RemoteException) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        call.error.fillInStackTrace();<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>        throw call.error;<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>      }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      // local exception<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      throw wrapException(addr, call.error);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span><a name="line.1279"></a>
+<span class="sourceLineNo">1280</span><a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  /**<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>   * Interrupt the connections to the given ip:port server. This should be called if the server<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   *  is known as actually dead. This will not prevent current operation to be retried, and,<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   *  depending on their own behavior, they may retry on the same server. This can be a feature,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   *  for example at startup. In any case, they're likely to get connection refused (if the<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   *  process died) or no route to host: i.e. their next retries should be faster and with a<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>   *  safe exception.<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>   */<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>  @Override<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  public void cancelConnections(ServerName sn) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    synchronized (connections) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      for (Connection connection : connections.values()) {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>        if (connection.isAlive() &amp;&amp;<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>            connection.getRemoteAddress().getPort() == sn.getPort() &amp;&amp;<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>            connection.getRemoteAddress().getHostName().equals(sn.getHostname())) {<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>          LOG.info("The server on " + sn.toString() +<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>              " is dead - stopping the connection " + connection.remoteId);<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>          connection.interrupt(); // We're interrupting a Reader. It means we want it to finish.<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>                                  // This will close the connection as well.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  /**<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   *  Get a connection from the pool, or create a new one and add it to the<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * pool. Connections to a given host/port are reused.<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   */<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  protected Connection getConnection(User ticket, Call call, InetSocketAddress addr)<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  throws IOException {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    if (!running.get()) throw new StoppedRpcClientException();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>    Connection connection;<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    ConnectionId remoteId =<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>      new ConnectionId(ticket, call.md.getService().getName(), addr);<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    synchronized (connections) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>      connection = connections.get(remoteId);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      if (connection == null) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>        connection = createConnection(remoteId, this.codec, this.compressor);<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>        connections.put(remoteId, connection);<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      }<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    }<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    return connection;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>  }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>}<a name="line.1325"></a>
 
 
 


[32/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html
index 704e192..e5d9af6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html
@@ -92,2526 +92,2571 @@
 <span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.conf.ConfigurationObserver;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.exceptions.RegionMovedException;<a name="line.85"></a>
 <span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.User;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.io.BytesWritable;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.io.IntWritable;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.io.Writable;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.io.WritableUtils;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.util.StringUtils;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.htrace.TraceInfo;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import com.google.protobuf.BlockingService;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import com.google.protobuf.CodedInputStream;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import com.google.protobuf.Message;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import com.google.protobuf.ServiceException;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.140"></a>
-<span class="sourceLineNo">141</span> *<a name="line.141"></a>
-<span class="sourceLineNo">142</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.142"></a>
-<span class="sourceLineNo">143</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.143"></a>
-<span class="sourceLineNo">144</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.144"></a>
-<span class="sourceLineNo">145</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.145"></a>
-<span class="sourceLineNo">146</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.146"></a>
-<span class="sourceLineNo">147</span> * and loops till done.<a name="line.147"></a>
-<span class="sourceLineNo">148</span> *<a name="line.148"></a>
-<span class="sourceLineNo">149</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.149"></a>
-<span class="sourceLineNo">150</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.150"></a>
-<span class="sourceLineNo">151</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.151"></a>
-<span class="sourceLineNo">152</span> * and keep taking while the server is up.<a name="line.152"></a>
-<span class="sourceLineNo">153</span> *<a name="line.153"></a>
-<span class="sourceLineNo">154</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.154"></a>
-<span class="sourceLineNo">155</span> * queue for Responder to pull from and return result to client.<a name="line.155"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferInputStream;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.User;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.io.BytesWritable;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.io.IntWritable;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.io.Writable;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.io.WritableUtils;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.util.StringUtils;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.htrace.TraceInfo;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import com.google.protobuf.BlockingService;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import com.google.protobuf.CodedInputStream;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import com.google.protobuf.CodedOutputStream;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import com.google.protobuf.Message;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import com.google.protobuf.ServiceException;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.143"></a>
+<span class="sourceLineNo">144</span> *<a name="line.144"></a>
+<span class="sourceLineNo">145</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.145"></a>
+<span class="sourceLineNo">146</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.146"></a>
+<span class="sourceLineNo">147</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.147"></a>
+<span class="sourceLineNo">148</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.148"></a>
+<span class="sourceLineNo">149</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.149"></a>
+<span class="sourceLineNo">150</span> * and loops till done.<a name="line.150"></a>
+<span class="sourceLineNo">151</span> *<a name="line.151"></a>
+<span class="sourceLineNo">152</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.152"></a>
+<span class="sourceLineNo">153</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.153"></a>
+<span class="sourceLineNo">154</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.154"></a>
+<span class="sourceLineNo">155</span> * and keep taking while the server is up.<a name="line.155"></a>
 <span class="sourceLineNo">156</span> *<a name="line.156"></a>
-<span class="sourceLineNo">157</span> * @see RpcClientImpl<a name="line.157"></a>
-<span class="sourceLineNo">158</span> */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.159"></a>
-<span class="sourceLineNo">160</span>@InterfaceStability.Evolving<a name="line.160"></a>
-<span class="sourceLineNo">161</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      = new CallQueueTooBigException();<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final boolean authorize;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private boolean isSecurityEnabled;<a name="line.168"></a>
+<span class="sourceLineNo">157</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.157"></a>
+<span class="sourceLineNo">158</span> * queue for Responder to pull from and return result to client.<a name="line.158"></a>
+<span class="sourceLineNo">159</span> *<a name="line.159"></a>
+<span class="sourceLineNo">160</span> * @see RpcClientImpl<a name="line.160"></a>
+<span class="sourceLineNo">161</span> */<a name="line.161"></a>
+<span class="sourceLineNo">162</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.162"></a>
+<span class="sourceLineNo">163</span>@InterfaceStability.Evolving<a name="line.163"></a>
+<span class="sourceLineNo">164</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      = new CallQueueTooBigException();<a name="line.168"></a>
 <span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public static final byte CURRENT_VERSION = 0;<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<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>   * How many calls/handler are allowed in the queue.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * The maximum size that we can hold in the RPC queue<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private final IPCUtil ipcUtil;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    Server.class.getName());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  protected ServiceAuthorizationManager authManager;<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * after the call returns.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   */<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  protected final InetSocketAddress bindAddress;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  protected int port;                             // port we listen on<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private int readThreads;                        // number of read threads<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.210"></a>
-<span class="sourceLineNo">211</span>                                                  // which a client may be<a name="line.211"></a>
-<span class="sourceLineNo">212</span>                                                  // disconnected<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.213"></a>
-<span class="sourceLineNo">214</span>                                                  // connections after which we<a name="line.214"></a>
-<span class="sourceLineNo">215</span>                                                  // will start cleaning up idle<a name="line.215"></a>
-<span class="sourceLineNo">216</span>                                                  // connections<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.217"></a>
-<span class="sourceLineNo">218</span>                                                  // connections to nuke<a name="line.218"></a>
-<span class="sourceLineNo">219</span>                                                  // during a cleanup<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  protected MetricsHBaseServer metrics;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  protected final Configuration conf;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private int maxQueueSize;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  protected int socketSendBufferSize;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  volatile boolean running = true;<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>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * for business by the call to {@link #start()}.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  volatile boolean started = false;<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>   * This is a running count of the size of all outstanding calls by size.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  protected final Counter callQueueSize = new Counter();<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  //maintain a list<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  //of client connections<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private Listener listener = null;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  protected Responder responder = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  protected int numConnections = 0;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.261"></a>
+<span class="sourceLineNo">170</span>  private final boolean authorize;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private boolean isSecurityEnabled;<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public static final byte CURRENT_VERSION = 0;<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * How many calls/handler are allowed in the queue.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * The maximum size that we can hold in the RPC queue<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private final IPCUtil ipcUtil;<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    Server.class.getName());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  protected ServiceAuthorizationManager authManager;<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * after the call returns.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   */<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected final InetSocketAddress bindAddress;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected int port;                             // port we listen on<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  private int readThreads;                        // number of read threads<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.213"></a>
+<span class="sourceLineNo">214</span>                                                  // which a client may be<a name="line.214"></a>
+<span class="sourceLineNo">215</span>                                                  // disconnected<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.216"></a>
+<span class="sourceLineNo">217</span>                                                  // connections after which we<a name="line.217"></a>
+<span class="sourceLineNo">218</span>                                                  // will start cleaning up idle<a name="line.218"></a>
+<span class="sourceLineNo">219</span>                                                  // connections<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.220"></a>
+<span class="sourceLineNo">221</span>                                                  // connections to nuke<a name="line.221"></a>
+<span class="sourceLineNo">222</span>                                                  // during a cleanup<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected MetricsHBaseServer metrics;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  protected final Configuration conf;<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private int maxQueueSize;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  protected int socketSendBufferSize;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  volatile boolean running = true;<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * for business by the call to {@link #start()}.<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  volatile boolean started = false;<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  /**<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * This is a running count of the size of all outstanding calls by size.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  protected final Counter callQueueSize = new Counter();<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  //maintain a list<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  //of client connections<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private Listener listener = null;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  protected Responder responder = null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  protected int numConnections = 0;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  /** Default value for above params */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  private final int warnResponseTime;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private final int warnResponseSize;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  private final Server server;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  private final RpcScheduler scheduler;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>  private UserProvider userProvider;<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  private final BoundedByteBufferPool reservoir;<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * the result.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  class Call implements RpcCallContext {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    protected int id;                             // the client's call id<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    protected BlockingService service;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    protected MethodDescriptor md;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    protected RequestHeader header;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    protected Message param;                      // the parameter passed<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    // Optional cell data passed outside of protobufs.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    protected CellScanner cellScanner;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    protected Connection connection;              // connection to client<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    protected long timestamp;      // the time received when response is null<a name="line.295"></a>
-<span class="sourceLineNo">296</span>                                   // the time served when response is not null<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
-<span class="sourceLineNo">298</span>     * Chain of buffers to send as response.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>     */<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    protected BufferChain response;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    protected Responder responder;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    protected long size;                          // size of current call<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    protected boolean isError;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    protected TraceInfo tinfo;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    private ByteBuffer cellBlock = null;<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private User user;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private InetAddress remoteAddress;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RpcCallback callback;<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private long responseCellSize = 0;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private long responseBlockSize = 0;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private boolean retryImmediatelySupported;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.318"></a>
-<span class="sourceLineNo">319</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.id = id;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.service = service;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.md = md;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.header = header;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      this.param = param;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      this.cellScanner = cellScanner;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      this.connection = connection;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      this.timestamp = System.currentTimeMillis();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      this.response = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      this.responder = responder;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      this.isError = false;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.size = size;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.tinfo = tinfo;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.remoteAddress = remoteAddress;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.retryImmediatelySupported =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    /**<a name="line.340"></a>
-<span class="sourceLineNo">341</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.341"></a>
-<span class="sourceLineNo">342</span>     * cleanup.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>     */<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    void done() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        // Return buffer to reservoir now we are done with it.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        reservoir.putBuffer(this.cellBlock);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        this.cellBlock = null;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>    @Override<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    public String toString() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      return toShortString() + " param: " +<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        " connection: " + connection.toString();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>    protected RequestHeader getHeader() {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      return this.header;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    /*<a name="line.366"></a>
-<span class="sourceLineNo">367</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.367"></a>
-<span class="sourceLineNo">368</span>     * the payload of a command<a name="line.368"></a>
-<span class="sourceLineNo">369</span>     */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    String toShortString() {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      String serviceName = this.connection.service != null ?<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          " connection: " + connection.toString();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    String toTraceString() {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      String serviceName = this.connection.service != null ?<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return serviceName + "." + methodName;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      this.response = new BufferChain(response);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        Throwable t, String errorMsg) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      if (this.isError) return;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (t != null) this.isError = true;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      BufferChain bc = null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      try {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        // Presume it a pb Message.  Could be null.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        Message result = (Message)m;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        // Call id.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        headerBuilder.setCallId(this.id);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (t != null) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (t instanceof RegionMovedException) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.408"></a>
-<span class="sourceLineNo">409</span>            // any kind of payload.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          // Set the exception as the result of the method invocation.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        if (this.cellBlock != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        Message header = headerBuilder.build();<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>        // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        // one big byte array; save on allocations.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        ByteBuffer bbHeader = IPCUtil.getDelimitedMessageAsByteBuffer(header);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        ByteBuffer bbResult = IPCUtil.getDelimitedMessageAsByteBuffer(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        int totalSize = bbHeader.capacity() + (bbResult == null? 0: bbResult.limit()) +<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (this.cellBlock == null? 0: this.cellBlock.limit());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        ByteBuffer bbTotalSize = ByteBuffer.wrap(Bytes.toBytes(totalSize));<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        bc = new BufferChain(bbTotalSize, bbHeader, bbResult, this.cellBlock);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        if (connection.useWrap) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          bc = wrapWithSasl(bc);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      } catch (IOException e) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        LOG.warn("Exception while creating response " + e);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      this.response = bc;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (this.callback != null) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          this.callback.run();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        } catch (Exception e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          // Don't allow any exception here to kill this handler thread.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private BufferChain wrapWithSasl(BufferChain bc)<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        throws IOException {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      if (!this.connection.useSasl) return bc;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // Looks like no way around this; saslserver wants a byte array.  I have to make it one.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // THIS IS A BIG UGLY COPY.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      byte [] responseBytes = bc.getBytes();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      byte [] token;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // synchronization may be needed since there can be multiple Handler<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      // threads using saslServer to wrap responses.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      synchronized (connection.saslServer) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        token = connection.saslServer.wrap(responseBytes, 0, responseBytes.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      if (LOG.isTraceEnabled()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        LOG.trace("Adding saslServer wrapped token of size " + token.length<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            + " as call response.");<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>      ByteBuffer bbTokenLength = ByteBuffer.wrap(Bytes.toBytes(token.length));<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      ByteBuffer bbTokenBytes = ByteBuffer.wrap(token);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return new BufferChain(bbTokenLength, bbTokenBytes);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public boolean isClientCellBlockSupported() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      return this.connection != null &amp;&amp; this.connection.codec != null;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>    @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    public long disconnectSince() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (!connection.channel.isOpen()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        return System.currentTimeMillis() - timestamp;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      } else {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        return -1L;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>    public long getSize() {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      return this.size;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>    public long getResponseCellSize() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return responseCellSize;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    public void incrementResponseCellSize(long cellSize) {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      responseCellSize += cellSize;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    @Override<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    public long getResponseBlockSize() {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return responseBlockSize;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    @Override<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    public void incrementResponseBlockSize(long blockSize) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      responseBlockSize += blockSize;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    public synchronized void sendResponseIfReady() throws IOException {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.responder.doRespond(this);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    public UserGroupInformation getRemoteUser() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      return connection.ugi;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    @Override<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    public User getRequestUser() {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      return user;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    @Override<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    public String getRequestUserName() {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      User user = getRequestUser();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return user == null? null: user.getShortName();<a name="line.531"></a>
+<span class="sourceLineNo">263</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  /** Default value for above params */<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  private final int warnResponseTime;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  private final int warnResponseSize;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  private final Server server;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  private final RpcScheduler scheduler;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  private UserProvider userProvider;<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>  private final BoundedByteBufferPool reservoir;<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * the result.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  class Call implements RpcCallContext {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int id;                             // the client's call id<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    protected BlockingService service;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    protected MethodDescriptor md;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    protected RequestHeader header;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    protected Message param;                      // the parameter passed<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // Optional cell data passed outside of protobufs.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    protected CellScanner cellScanner;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    protected Connection connection;              // connection to client<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    protected long timestamp;      // the time received when response is null<a name="line.298"></a>
+<span class="sourceLineNo">299</span>                                   // the time served when response is not null<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    /**<a name="line.300"></a>
+<span class="sourceLineNo">301</span>     * Chain of buffers to send as response.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>     */<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    protected BufferChain response;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    protected Responder responder;<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    protected long size;                          // size of current call<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    protected boolean isError;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    protected TraceInfo tinfo;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    private ByteBuffer cellBlock = null;<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    private User user;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    private InetAddress remoteAddress;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    private RpcCallback callback;<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private long responseCellSize = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private long responseBlockSize = 0;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    private boolean retryImmediatelySupported;<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.321"></a>
+<span class="sourceLineNo">322</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.322"></a>
+<span class="sourceLineNo">323</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      this.id = id;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      this.service = service;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      this.md = md;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      this.header = header;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      this.param = param;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      this.cellScanner = cellScanner;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      this.connection = connection;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.timestamp = System.currentTimeMillis();<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.response = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      this.responder = responder;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      this.isError = false;<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      this.size = size;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.tinfo = tinfo;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.remoteAddress = remoteAddress;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.retryImmediatelySupported =<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    /**<a name="line.343"></a>
+<span class="sourceLineNo">344</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.344"></a>
+<span class="sourceLineNo">345</span>     * cleanup.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>     */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    void done() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        // Return buffer to reservoir now we are done with it.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        reservoir.putBuffer(this.cellBlock);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        this.cellBlock = null;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    @Override<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    public String toString() {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      return toShortString() + " param: " +<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        " connection: " + connection.toString();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    protected RequestHeader getHeader() {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      return this.header;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>    /*<a name="line.369"></a>
+<span class="sourceLineNo">370</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.370"></a>
+<span class="sourceLineNo">371</span>     * the payload of a command<a name="line.371"></a>
+<span class="sourceLineNo">372</span>     */<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    String toShortString() {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      String serviceName = this.connection.service != null ?<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          " connection: " + connection.toString();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    String toTraceString() {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      String serviceName = this.connection.service != null ?<a name="line.383"></a>
+<span class="sourceLineNo">384</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return serviceName + "." + methodName;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      this.response = new BufferChain(response);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        Throwable t, String errorMsg) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      if (this.isError) return;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      if (t != null) this.isError = true;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      BufferChain bc = null;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      try {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        // Presume it a pb Message.  Could be null.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        Message result = (Message)m;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        // Call id.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        headerBuilder.setCallId(this.id);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (t != null) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (t instanceof RegionMovedException) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            // any kind of payload.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          // Set the exception as the result of the method invocation.<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        if (this.cellBlock != null) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        Message header = headerBuilder.build();<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>        byte[] b = createHeaderAndMessageBytes(result, header);<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>        bc = new BufferChain(ByteBuffer.wrap(b), this.cellBlock);<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>        if (connection.useWrap) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          bc = wrapWithSasl(bc);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      } catch (IOException e) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        LOG.warn("Exception while creating response " + e);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      this.response = bc;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      if (this.callback != null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          this.callback.run();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        } catch (Exception e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          // Don't allow any exception here to kill this handler thread.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>    private byte[] createHeaderAndMessageBytes(Message result, Message header)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // one big byte array; save on allocations.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      int headerSerializedSize = 0, resultSerializedSize = 0, headerVintSize = 0,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          resultVintSize = 0;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (header != null) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        headerSerializedSize = header.getSerializedSize();<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        headerVintSize = CodedOutputStream.computeRawVarint32Size(headerSerializedSize);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (result != null) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        resultSerializedSize = result.getSerializedSize();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        resultVintSize = CodedOutputStream.computeRawVarint32Size(resultSerializedSize);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      // calculate the total size<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      int totalSize = headerSerializedSize + headerVintSize<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          + (resultSerializedSize + resultVintSize)<a name="line.472"></a>
+<span class="sourceLineNo">473</span>          + (this.cellBlock == null ? 0 : this.cellBlock.limit());<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // The byte[] should also hold the totalSize of the header, message and the cellblock<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      byte[] b = new byte[headerSerializedSize + headerVintSize + resultSerializedSize<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          + resultVintSize + Bytes.SIZEOF_INT];<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      // The RpcClient expects the int to be in a format that code be decoded by<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // the DataInputStream#readInt(). Hence going with the Bytes.toBytes(int)<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // form of writing int.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Bytes.putInt(b, 0, totalSize);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      CodedOutputStream cos = CodedOutputStream.newInstance(b, Bytes.SIZEOF_INT,<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          b.length - Bytes.SIZEOF_INT);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (header != null) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        cos.writeMessageNoTag(header);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      if (result != null) {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        cos.writeMessageNoTag(result);<a name="l

<TRUNCATED>

[49/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index c85f020..23f7207 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -25,8 +25,8 @@ under the License.
     <language>en-us</language>
     <copyright>&#169;2007 - 2016 The Apache Software Foundation</copyright>
     <item>
-      <title>File: 1672,
-             Errors: 12853,
+      <title>File: 1673,
+             Errors: 12850,
              Warnings: 0,
              Infos: 0
       </title>
@@ -3807,7 +3807,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  50
+                  48
                 </td>
               </tr>
                           <tr>
@@ -5408,7 +5408,7 @@ under the License.
               </tr>
                           <tr>
                 <td>
-                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.codec.prefixtree.encode.column.ColumnSectionWriter.java">org/apache/hadoop/hbase/codec/prefixtree/encode/column/ColumnSectionWriter.java</a>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.thrift2.generated.TDurability.java">org/apache/hadoop/hbase/thrift2/generated/TDurability.java</a>
                 </td>
                 <td>
                   0
@@ -5417,12 +5417,12 @@ under the License.
                   0
                 </td>
                 <td>
-                  2
+                  0
                 </td>
               </tr>
                           <tr>
                 <td>
-                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.thrift2.generated.TDurability.java">org/apache/hadoop/hbase/thrift2/generated/TDurability.java</a>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.codec.prefixtree.encode.column.ColumnSectionWriter.java">org/apache/hadoop/hbase/codec/prefixtree/encode/column/ColumnSectionWriter.java</a>
                 </td>
                 <td>
                   0
@@ -5431,7 +5431,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  0
+                  2
                 </td>
               </tr>
                           <tr>
@@ -20430,6 +20430,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.io.ByteBufferInputStream.java">org/apache/hadoop/hbase/io/ByteBufferInputStream.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper.java">org/apache/hadoop/hbase/zookeeper/RecoverableZooKeeper.java</a>
                 </td>
                 <td>
@@ -23323,7 +23337,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  27
+                  26
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 7564006..268dd28 100644
--- a/coc.html
+++ b/coc.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160204" />
+    <meta name="Date-Revision-yyyymmdd" content="20160205" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -245,7 +245,7 @@
           <div id="banner">
         <div class="pull-left">
                                     <a href="http://hbasecon.com/" id="bannerLeft">
-                                                                                                <img src="images/hbasecon2016-stack-logo.jpg"  alt="hbasecon2016"/>
+                                                                                                <img src="images/hbasecon2016-stacked.png"  alt="hbasecon2016"/>
                 </a>
                       </div>
         <div class="pull-right">                                <a href="./" id="bannerRight">
@@ -331,7 +331,7 @@ For flagrant violations requiring a firm response the PMC may opt to skip early
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/cygwin.html
----------------------------------------------------------------------
diff --git a/cygwin.html b/cygwin.html
index 56cbeae..f8586e8 100644
--- a/cygwin.html
+++ b/cygwin.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160204" />
+    <meta name="Date-Revision-yyyymmdd" content="20160205" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Installing Apache HBase (TM) on Windows using Cygwin</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -243,7 +243,7 @@
           <div id="banner">
         <div class="pull-left">
                                     <a href="http://hbasecon.com/" id="bannerLeft">
-                                                                                                <img src="images/hbasecon2016-stack-logo.jpg"  alt="hbasecon2016"/>
+                                                                                                <img src="images/hbasecon2016-stacked.png"  alt="hbasecon2016"/>
                 </a>
                       </div>
         <div class="pull-right">                                <a href="./" id="bannerRight">
@@ -673,7 +673,7 @@ Now your <b>HBase </b>server is running, <b>start coding</b> and build that next
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index c428fac..6263e40 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160204" />
+    <meta name="Date-Revision-yyyymmdd" content="20160205" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -243,7 +243,7 @@
           <div id="banner">
         <div class="pull-left">
                                     <a href="http://hbasecon.com/" id="bannerLeft">
-                                                                                                <img src="images/hbasecon2016-stack-logo.jpg"  alt="hbasecon2016"/>
+                                                                                                <img src="images/hbasecon2016-stacked.png"  alt="hbasecon2016"/>
                 </a>
                       </div>
         <div class="pull-right">                                <a href="./" id="bannerRight">
@@ -518,7 +518,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 83ecdf9..6b753ce 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160204" />
+    <meta name="Date-Revision-yyyymmdd" content="20160205" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -243,7 +243,7 @@
           <div id="banner">
         <div class="pull-left">
                                     <a href="http://hbasecon.com/" id="bannerLeft">
-                                                                                                <img src="images/hbasecon2016-stack-logo.jpg"  alt="hbasecon2016"/>
+                                                                                                <img src="images/hbasecon2016-stacked.png"  alt="hbasecon2016"/>
                 </a>
                       </div>
         <div class="pull-right">                                <a href="./" id="bannerRight">
@@ -1593,7 +1593,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 7226691..3910e82 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160204" />
+    <meta name="Date-Revision-yyyymmdd" content="20160205" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -243,7 +243,7 @@
           <div id="banner">
         <div class="pull-left">
                                     <a href="http://hbasecon.com/" id="bannerLeft">
-                                                                                                <img src="images/hbasecon2016-stack-logo.jpg"  alt="hbasecon2016"/>
+                                                                                                <img src="images/hbasecon2016-stacked.png"  alt="hbasecon2016"/>
                 </a>
                       </div>
         <div class="pull-right">                                <a href="./" id="bannerRight">
@@ -312,7 +312,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index d6425b3..2ca9101 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160204" />
+    <meta name="Date-Revision-yyyymmdd" content="20160205" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -243,7 +243,7 @@
           <div id="banner">
         <div class="pull-left">
                                     <a href="http://hbasecon.com/" id="bannerLeft">
-                                                                                                <img src="images/hbasecon2016-stack-logo.jpg"  alt="hbasecon2016"/>
+                                                                                                <img src="images/hbasecon2016-stacked.png"  alt="hbasecon2016"/>
                 </a>
                       </div>
         <div class="pull-right">                                <a href="./" id="bannerRight">
@@ -786,7 +786,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/devapidocs/allclasses-frame.html b/devapidocs/allclasses-frame.html
index c443936..b9faa1b 100644
--- a/devapidocs/allclasses-frame.html
+++ b/devapidocs/allclasses-frame.html
@@ -189,6 +189,7 @@
 <li><a href="org/apache/hadoop/hbase/util/ByteBufferArray.Visitor.html" title="interface in org.apache.hadoop.hbase.util" target="classFrame"><i>ByteBufferArray.Visitor</i></a></li>
 <li><a href="org/apache/hadoop/hbase/ByteBufferedCell.html" title="class in org.apache.hadoop.hbase" target="classFrame">ByteBufferedCell</a></li>
 <li><a href="org/apache/hadoop/hbase/ByteBufferedKeyOnlyKeyValue.html" title="class in org.apache.hadoop.hbase" target="classFrame">ByteBufferedKeyOnlyKeyValue</a></li>
+<li><a href="org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io" target="classFrame">ByteBufferInputStream</a></li>
 <li><a href="org/apache/hadoop/hbase/io/hfile/bucket/ByteBufferIOEngine.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket" target="classFrame">ByteBufferIOEngine</a></li>
 <li><a href="org/apache/hadoop/hbase/io/ByteBufferOutputStream.html" title="class in org.apache.hadoop.hbase.io" target="classFrame">ByteBufferOutputStream</a></li>
 <li><a href="org/apache/hadoop/hbase/io/ByteBufferSupportDataOutputStream.html" title="class in org.apache.hadoop.hbase.io" target="classFrame">ByteBufferSupportDataOutputStream</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/devapidocs/allclasses-noframe.html b/devapidocs/allclasses-noframe.html
index 280d1a2..a798e9e 100644
--- a/devapidocs/allclasses-noframe.html
+++ b/devapidocs/allclasses-noframe.html
@@ -189,6 +189,7 @@
 <li><a href="org/apache/hadoop/hbase/util/ByteBufferArray.Visitor.html" title="interface in org.apache.hadoop.hbase.util"><i>ByteBufferArray.Visitor</i></a></li>
 <li><a href="org/apache/hadoop/hbase/ByteBufferedCell.html" title="class in org.apache.hadoop.hbase">ByteBufferedCell</a></li>
 <li><a href="org/apache/hadoop/hbase/ByteBufferedKeyOnlyKeyValue.html" title="class in org.apache.hadoop.hbase">ByteBufferedKeyOnlyKeyValue</a></li>
+<li><a href="org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferInputStream</a></li>
 <li><a href="org/apache/hadoop/hbase/io/hfile/bucket/ByteBufferIOEngine.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">ByteBufferIOEngine</a></li>
 <li><a href="org/apache/hadoop/hbase/io/ByteBufferOutputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferOutputStream</a></li>
 <li><a href="org/apache/hadoop/hbase/io/ByteBufferSupportDataOutputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferSupportDataOutputStream</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 4ffb63d..cdf64d6 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -8095,6 +8095,25 @@
 </li>
 <li class="blockList">
 <table border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
+<caption><span>org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th scope="col">Constant Field</th>
+<th class="colLast" scope="col">Value</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController.PRIORITY_UNSET">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
+<td><code><a href="org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#PRIORITY_UNSET">PRIORITY_UNSET</a></code></td>
+<td class="colLast"><code>-1</code></td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList">
+<table border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
 <caption><span>org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/RpcClient.html" title="interface in org.apache.hadoop.hbase.ipc">RpcClient</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 1a44d03..c223a4a 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -3510,6 +3510,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/quotas/RateLimiter.html#avail">avail</a></span> - Variable in class org.apache.hadoop.hbase.quotas.<a href="./org/apache/hadoop/hbase/quotas/RateLimiter.html" title="class in org.apache.hadoop.hbase.quotas">RateLimiter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html#available()">available()</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferInputStream</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBuffInputStream.html#available()">available()</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBuffInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBuffInputStream</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/FileLink.FileLinkInputStream.html#available()">available()</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/FileLink.FileLinkInputStream.html" title="class in org.apache.hadoop.hbase.io">FileLink.FileLinkInputStream</a></dt>
@@ -5019,6 +5021,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteArrayOutputStream.html#buf">buf</a></span> - Variable in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteArrayOutputStream.html" title="class in org.apache.hadoop.hbase.io">ByteArrayOutputStream</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html#buf">buf</a></span> - Variable in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferInputStream</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBufferOutputStream.html#buf">buf</a></span> - Variable in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBufferOutputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferOutputStream</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBuffInputStream.html#buf">buf</a></span> - Variable in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBuffInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBuffInputStream</a></dt>
@@ -5518,6 +5522,12 @@
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ByteBufferedKeyOnlyKeyValue.html#ByteBufferedKeyOnlyKeyValue(java.nio.ByteBuffer,%20int,%20int)">ByteBufferedKeyOnlyKeyValue(ByteBuffer, int, int)</a></span> - Constructor for class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/ByteBufferedKeyOnlyKeyValue.html" title="class in org.apache.hadoop.hbase">ByteBufferedKeyOnlyKeyValue</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">ByteBufferInputStream</span></a> - Class in <a href="./org/apache/hadoop/hbase/io/package-summary.html">org.apache.hadoop.hbase.io</a></dt>
+<dd>
+<div class="block">Not thread safe!</div>
+</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html#ByteBufferInputStream(java.nio.ByteBuffer)">ByteBufferInputStream(ByteBuffer)</a></span> - Constructor for class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferInputStream</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="./org/apache/hadoop/hbase/io/hfile/bucket/ByteBufferIOEngine.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket"><span class="strong">ByteBufferIOEngine</span></a> - Class in <a href="./org/apache/hadoop/hbase/io/hfile/bucket/package-summary.html">org.apache.hadoop.hbase.io.hfile.bucket</a></dt>
 <dd>
 <div class="block">IO engine that stores data in memory using an array of ByteBuffers
@@ -14288,7 +14298,7 @@
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/IPCUtil.html#createCellScanner(org.apache.hadoop.hbase.codec.Codec,%20org.apache.hadoop.io.compress.CompressionCodec,%20byte[])">createCellScanner(Codec, CompressionCodec, byte[])</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/IPCUtil.html" title="class in org.apache.hadoop.hbase.ipc">IPCUtil</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/IPCUtil.html#createCellScanner(org.apache.hadoop.hbase.codec.Codec,%20org.apache.hadoop.io.compress.CompressionCodec,%20byte[],%20int,%20int)">createCellScanner(Codec, CompressionCodec, byte[], int, int)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/IPCUtil.html" title="class in org.apache.hadoop.hbase.ipc">IPCUtil</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/IPCUtil.html#createCellScanner(org.apache.hadoop.hbase.codec.Codec,%20org.apache.hadoop.io.compress.CompressionCodec,%20java.nio.ByteBuffer)">createCellScanner(Codec, CompressionCodec, ByteBuffer)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/IPCUtil.html" title="class in org.apache.hadoop.hbase.ipc">IPCUtil</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/mapreduce/Import.html#createCfRenameMap(org.apache.hadoop.conf.Configuration)">createCfRenameMap(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.mapreduce.<a href="./org/apache/hadoop/hbase/mapreduce/Import.html" title="class in org.apache.hadoop.hbase.mapreduce">Import</a></dt>
 <dd>&nbsp;</dd>
@@ -14748,6 +14758,8 @@
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.CreateHdfsRegions.html#createHdfsRegions(org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv,%20org.apache.hadoop.fs.Path,%20org.apache.hadoop.hbase.TableName,%20java.util.List)">createHdfsRegions(MasterProcedureEnv, Path, TableName, List&lt;HRegionInfo&gt;)</a></span> - Method in interface org.apache.hadoop.hbase.master.procedure.<a href="./org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.CreateHdfsRegions.html" title="interface in org.apache.hadoop.hbase.master.procedure">CreateTableProcedure.CreateHdfsRegions</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.Call.html#createHeaderAndMessageBytes(com.google.protobuf.Message,%20com.google.protobuf.Message)">createHeaderAndMessageBytes(Message, Message)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.Call.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Call</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/backup/example/ZKTableArchiveClient.html#createHFileArchiveManager()">createHFileArchiveManager()</a></span> - Method in class org.apache.hadoop.hbase.backup.example.<a href="./org/apache/hadoop/hbase/backup/example/ZKTableArchiveClient.html" title="class in org.apache.hadoop.hbase.backup.example">ZKTableArchiveClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html#createHFileContext(org.apache.hadoop.hbase.io.FSDataInputStreamWrapper,%20long,%20org.apache.hadoop.hbase.fs.HFileSystem,%20org.apache.hadoop.fs.Path,%20org.apache.hadoop.hbase.io.hfile.FixedFileTrailer)">createHFileContext(FSDataInputStreamWrapper, long, HFileSystem, Path, FixedFileTrailer)</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileReaderImpl</a></dt>
@@ -64240,6 +64252,8 @@ service.</div>
 <dd>
 <div class="block">High (system) installation priority</div>
 </dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html#PRIORITY_UNSET">PRIORITY_UNSET</a></span> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/Coprocessor.html#PRIORITY_USER">PRIORITY_USER</a></span> - Static variable in interface org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/Coprocessor.html" title="interface in org.apache.hadoop.hbase">Coprocessor</a></dt>
 <dd>
 <div class="block">Default installation priority for user coprocessors</div>
@@ -64664,7 +64678,7 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/visibility/ExpressionParser.html#processCloseParan(java.util.Stack,%20java.lang.String,%20int)">processCloseParan(Stack&lt;ExpressionNode&gt;, String, int)</a></span> - Method in class org.apache.hadoop.hbase.security.visibility.<a href="./org/apache/hadoop/hbase/security/visibility/ExpressionParser.html" title="class in org.apache.hadoop.hbase.security.visibility">ExpressionParser</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processConnectionHeader(byte[])">processConnectionHeader(byte[])</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processConnectionHeader(java.nio.ByteBuffer)">processConnectionHeader(ByteBuffer)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.html#processDeadRegion(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.master.AssignmentManager)">processDeadRegion(HRegionInfo, AssignmentManager)</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="./org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">ServerCrashProcedure</a></dt>
 <dd>
@@ -64726,7 +64740,7 @@ service.</div>
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/visibility/ExpressionParser.html#processNOTOp(java.util.Stack,%20java.lang.String,%20int)">processNOTOp(Stack&lt;ExpressionNode&gt;, String, int)</a></span> - Method in class org.apache.hadoop.hbase.security.visibility.<a href="./org/apache/hadoop/hbase/security/visibility/ExpressionParser.html" title="class in org.apache.hadoop.hbase.security.visibility">ExpressionParser</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processOneRpc(byte[])">processOneRpc(byte[])</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processOneRpc(java.nio.ByteBuffer)">processOneRpc(ByteBuffer)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/visibility/ExpressionParser.html#processOpenParan(java.util.Stack,%20java.lang.String,%20int)">processOpenParan(Stack&lt;ExpressionNode&gt;, String, int)</a></span> - Method in class org.apache.hadoop.hbase.security.visibility.<a href="./org/apache/hadoop/hbase/security/visibility/ExpressionParser.html" title="class in org.apache.hadoop.hbase.security.visibility">ExpressionParser</a></dt>
 <dd>&nbsp;</dd>
@@ -64758,7 +64772,7 @@ service.</div>
 <dd>
 <div class="block">Processes list of regions in transition at startup</div>
 </dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processRequest(byte[])">processRequest(byte[])</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#processRequest(java.nio.ByteBuffer)">processRequest(ByteBuffer)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.Responder.html#processResponse(org.apache.hadoop.hbase.ipc.RpcServer.Call)">processResponse(RpcServer.Call)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.Responder.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Responder</a></dt>
 <dd>
@@ -66347,6 +66361,15 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/procedure/ZKProcedureUtil.html#reachedZnode">reachedZnode</a></span> - Variable in class org.apache.hadoop.hbase.procedure.<a href="./org/apache/hadoop/hbase/procedure/ZKProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure">ZKProcedureUtil</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html#read()">read()</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferInputStream</a></dt>
+<dd>
+<div class="block">Reads the next byte of data from this input stream.</div>
+</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html#read(byte[],%20int,%20int)">read(byte[], int, int)</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferInputStream</a></dt>
+<dd>
+<div class="block">Reads up to next <code>len</code> bytes of data from buffer into passed array(starting from
+ given offset).</div>
+</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBuffInputStream.html#read()">read()</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBuffInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBuffInputStream</a></dt>
 <dd>
 <div class="block">Reads the next byte of data from this input stream.</div>
@@ -73848,7 +73871,7 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html#saslQop">saslQop</a></span> - Variable in enum org.apache.hadoop.hbase.security.<a href="./org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security">SaslUtil.QualityOfProtection</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#saslReadAndProcess(byte[])">saslReadAndProcess(byte[])</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html#saslReadAndProcess(java.nio.ByteBuffer)">saslReadAndProcess(ByteBuffer)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#saslRpcClient">saslRpcClient</a></span> - Variable in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcClientImpl.Connection</a></dt>
 <dd>&nbsp;</dd>
@@ -79980,6 +80003,10 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/quotas/QuotaSettings.html#sizeToString(long)">sizeToString(long)</a></span> - Static method in class org.apache.hadoop.hbase.quotas.<a href="./org/apache/hadoop/hbase/quotas/QuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">QuotaSettings</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html#skip(long)">skip(long)</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferInputStream</a></dt>
+<dd>
+<div class="block">Skips <code>n</code> bytes of input from this input stream.</div>
+</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/ByteBuffInputStream.html#skip(long)">skip(long)</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="./org/apache/hadoop/hbase/io/ByteBuffInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBuffInputStream</a></dt>
 <dd>
 <div class="block">Skips <code>n</code> bytes of input from this input stream.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/class-use/CellScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/CellScanner.html b/devapidocs/org/apache/hadoop/hbase/class-use/CellScanner.html
index 349ca5e..936ad9b 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/CellScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/CellScanner.html
@@ -451,11 +451,9 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a></code></td>
-<td class="colLast"><span class="strong">IPCUtil.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/IPCUtil.html#createCellScanner(org.apache.hadoop.hbase.codec.Codec,%20org.apache.hadoop.io.compress.CompressionCodec,%20byte[],%20int,%20int)">createCellScanner</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec">Codec</a>&nbsp;codec,
+<td class="colLast"><span class="strong">IPCUtil.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/IPCUtil.html#createCellScanner(org.apache.hadoop.hbase.codec.Codec,%20org.apache.hadoop.io.compress.CompressionCodec,%20java.nio.ByteBuffer)">createCellScanner</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec">Codec</a>&nbsp;codec,
                                   org.apache.hadoop.io.compress.CompressionCodec&nbsp;compressor,
-                                  byte[]&nbsp;cellBlock,
-                                  int&nbsp;offset,
-                                  int&nbsp;length)</code>&nbsp;</td>
+                                  <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;cellBlock)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceAudience.Private.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceAudience.Private.html b/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceAudience.Private.html
index e7c473f..79e99c7 100644
--- a/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceAudience.Private.html
+++ b/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceAudience.Private.html
@@ -2450,35 +2450,41 @@ service.</div>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferInputStream</a></strong></code>
+<div class="block">Not thread safe!</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/ByteBufferSupportDataOutputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBufferSupportDataOutputStream</a></strong></code>
 <div class="block">Our extension of DataOutputStream which implements ByteBufferSupportOutputStream</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>interface&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/ByteBufferSupportOutputStream.html" title="interface in org.apache.hadoop.hbase.io">ByteBufferSupportOutputStream</a></strong></code>
 <div class="block">Interface adds support for writing <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio"><code>ByteBuffer</code></a> into OutputStream.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/ByteBuffInputStream.html" title="class in org.apache.hadoop.hbase.io">ByteBuffInputStream</a></strong></code>
 <div class="block">Not thread safe!</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>interface&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/CellOutputStream.html" title="interface in org.apache.hadoop.hbase.io">CellOutputStream</a></strong></code>
 <div class="block">Accepts a stream of Cells.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/FileLink.html" title="class in org.apache.hadoop.hbase.io">FileLink</a></strong></code>
 <div class="block">The FileLink is a sort of hardlink, that allows access to a file given a set of locations.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/HalfStoreFileReader.html" title="class in org.apache.hadoop.hbase.io">HalfStoreFileReader</a></strong></code>
 <div class="block">A facade for a <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFile.Reader.html" title="interface in org.apache.hadoop.hbase.io.hfile"><code>HFile.Reader</code></a> that serves up
@@ -2487,26 +2493,26 @@ service.</div>
  of the file with keys that sort greater than those of the bottom half.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>interface&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/HeapSize.html" title="interface in org.apache.hadoop.hbase.io">HeapSize</a></strong></code>
 <div class="block">Implementations can be asked for an estimate of their size in bytes.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/HFileLink.html" title="class in org.apache.hadoop.hbase.io">HFileLink</a></strong></code>
 <div class="block">HFileLink describes a link to an hfile.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/LimitInputStream.html" title="class in org.apache.hadoop.hbase.io">LimitInputStream</a></strong></code>
 <div class="block">Copied from guava source code v15 (LimitedInputStream)
  Guava deprecated LimitInputStream in v14 and removed it in v15.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/Reference.html" title="class in org.apache.hadoop.hbase.io">Reference</a></strong></code>
 <div class="block">A reference to the top or bottom half of a store file where 'bottom' is the first half
@@ -2514,25 +2520,25 @@ service.</div>
  of the file with keys that sort greater than those of the bottom half.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>interface&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/SizedCellScanner.html" title="interface in org.apache.hadoop.hbase.io">SizedCellScanner</a></strong></code>
 <div class="block">A CellScanner that knows its size in memory in bytes.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/TagCompressionContext.html" title="class in org.apache.hadoop.hbase.io">TagCompressionContext</a></strong></code>
 <div class="block">Context that holds the dictionary for Tag compression and doing the compress/uncompress.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/WALLink.html" title="class in org.apache.hadoop.hbase.io">WALLink</a></strong></code>
 <div class="block">WALLink describes a link to a WAL.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>interface&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/WritableWithSize.html" title="interface in org.apache.hadoop.hbase.io">WritableWithSize</a></strong></code>
 <div class="block">An optional interface to 'size' writables.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html b/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
index afeb2f2..c5145f3 100644
--- a/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
@@ -80,11 +80,11 @@
 </ul>
 <h2 title="Annotation Type Hierarchy">Annotation Type Hierarchy</h2>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Stable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Stable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.LimitedPrivate.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.LimitedPrivate</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Unstable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Unstable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.Private</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.LimitedPrivate.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.LimitedPrivate</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Stable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Stable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Evolving.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Evolving</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Unstable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Unstable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Public.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.Public</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 </ul>
 </div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/client/ScannerCallable.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/ScannerCallable.html b/devapidocs/org/apache/hadoop/hbase/client/ScannerCallable.html
index d2d165b..d54fff1 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/ScannerCallable.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/ScannerCallable.html
@@ -729,7 +729,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>isHeartbeatMessage</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.316">isHeartbeatMessage</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.320">isHeartbeatMessage</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>true when the most recent RPC response indicated that the response was a heartbeat
          message. Heartbeat messages are sent back from the server when the processing of the
          scan request exceeds a certain time threshold. Heartbeats allow the server to avoid
@@ -742,7 +742,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>setHeartbeatMessage</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.320">setHeartbeatMessage</a>(boolean&nbsp;heartbeatMessage)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.324">setHeartbeatMessage</a>(boolean&nbsp;heartbeatMessage)</pre>
 </li>
 </ul>
 <a name="incRPCcallsMetrics()">
@@ -751,7 +751,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>incRPCcallsMetrics</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.324">incRPCcallsMetrics</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.328">incRPCcallsMetrics</a>()</pre>
 </li>
 </ul>
 <a name="updateResultsMetrics(org.apache.hadoop.hbase.client.Result[])">
@@ -760,7 +760,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>updateResultsMetrics</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.334">updateResultsMetrics</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>[]&nbsp;rrs)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.338">updateResultsMetrics</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>[]&nbsp;rrs)</pre>
 </li>
 </ul>
 <a name="updateServerSideMetrics(org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanResponse)">
@@ -769,7 +769,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>updateServerSideMetrics</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.356">updateServerSideMetrics</a>(org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanResponse&nbsp;response)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.360">updateServerSideMetrics</a>(org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanResponse&nbsp;response)</pre>
 <div class="block">Use the scan metrics returned by the server to add to the identically named counters in the
  client side metrics. If a counter does not exist with the same name as the server side metric,
  the attempt to increase the counter will fail.</div>
@@ -782,7 +782,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.365">close</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.369">close</a>()</pre>
 </li>
 </ul>
 <a name="openScanner()">
@@ -791,7 +791,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>openScanner</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.384">openScanner</a>()
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.388">openScanner</a>()
                     throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -803,7 +803,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>getScan</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.403">getScan</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.407">getScan</a>()</pre>
 </li>
 </ul>
 <a name="setClose()">
@@ -812,7 +812,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>setClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.410">setClose</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.414">setClose</a>()</pre>
 <div class="block">Call this when the next invocation of call should close the scanner</div>
 </li>
 </ul>
@@ -822,7 +822,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>setRenew</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.419">setRenew</a>(boolean&nbsp;val)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.423">setRenew</a>(boolean&nbsp;val)</pre>
 <div class="block">Indicate whether we make a call only to renew the lease, but without affected the scanner in
  any other way.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>val</code> - true if only the lease should be renewed</dd></dl>
@@ -834,7 +834,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>getHRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.427">getHRegionInfo</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.431">getHRegionInfo</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCallable.html#getHRegionInfo()">getHRegionInfo</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCallable.html" title="class in org.apache.hadoop.hbase.client">RegionServerCallable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>[]&gt;</code></dd>
@@ -847,7 +847,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>getCaching</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.438">getCaching</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.442">getCaching</a>()</pre>
 <div class="block">Get the number of rows that will be fetched on next</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the number of rows for caching</dd></dl>
 </li>
@@ -858,7 +858,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>getConnection</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.443">getConnection</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.447">getConnection</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCallable.html#getConnection()">getConnection</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCallable.html" title="class in org.apache.hadoop.hbase.client">RegionServerCallable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>[]&gt;</code></dd>
@@ -871,7 +871,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>setCaching</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.451">setCaching</a>(int&nbsp;caching)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.455">setCaching</a>(int&nbsp;caching)</pre>
 <div class="block">Set the number of rows that will be fetched on next</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>caching</code> - the number of rows for caching</dd></dl>
 </li>
@@ -882,7 +882,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>getScannerCallableForReplica</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.html" title="class in org.apache.hadoop.hbase.client">ScannerCallable</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.455">getScannerCallableForReplica</a>(int&nbsp;id)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.html" title="class in org.apache.hadoop.hbase.client">ScannerCallable</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.459">getScannerCallableForReplica</a>(int&nbsp;id)</pre>
 </li>
 </ul>
 <a name="getServerHasMoreResults()">
@@ -891,7 +891,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerHasMoreResults</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.466">getServerHasMoreResults</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.470">getServerHasMoreResults</a>()</pre>
 <div class="block">Should the client attempt to fetch more results from this region</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>True if the client should attempt to fetch more results, false otherwise.</dd></dl>
 </li>
@@ -902,7 +902,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>setServerHasMoreResults</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.471">setServerHasMoreResults</a>(boolean&nbsp;serverHasMoreResults)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.475">setServerHasMoreResults</a>(boolean&nbsp;serverHasMoreResults)</pre>
 </li>
 </ul>
 <a name="hasMoreResultsContext()">
@@ -911,7 +911,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockList">
 <li class="blockList">
 <h4>hasMoreResultsContext</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.480">hasMoreResultsContext</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.484">hasMoreResultsContext</a>()</pre>
 <div class="block">Did the server respond with information about whether more results might exist.
  Not guaranteed to respond with older server versions</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>True if the server responded with information about more results.</dd></dl>
@@ -923,7 +923,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCalla
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setHasMoreResultsContext</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.484">setHasMoreResultsContext</a>(boolean&nbsp;serverHasMoreResultsContext)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ScannerCallable.html#line.488">setHasMoreResultsContext</a>(boolean&nbsp;serverHasMoreResultsContext)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index b057c3d..226b554 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -389,12 +389,12 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">TableState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Durability</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">AsyncProcess.Retry</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Consistency</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Admin.CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Admin.CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">TableState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Durability</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/codec/class-use/Codec.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/codec/class-use/Codec.html b/devapidocs/org/apache/hadoop/hbase/codec/class-use/Codec.html
index f8a34f4..ade885f 100644
--- a/devapidocs/org/apache/hadoop/hbase/codec/class-use/Codec.html
+++ b/devapidocs/org/apache/hadoop/hbase/codec/class-use/Codec.html
@@ -213,11 +213,9 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a></code></td>
-<td class="colLast"><span class="strong">IPCUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/ipc/IPCUtil.html#createCellScanner(org.apache.hadoop.hbase.codec.Codec,%20org.apache.hadoop.io.compress.CompressionCodec,%20byte[],%20int,%20int)">createCellScanner</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec">Codec</a>&nbsp;codec,
+<td class="colLast"><span class="strong">IPCUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/ipc/IPCUtil.html#createCellScanner(org.apache.hadoop.hbase.codec.Codec,%20org.apache.hadoop.io.compress.CompressionCodec,%20java.nio.ByteBuffer)">createCellScanner</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec">Codec</a>&nbsp;codec,
                                   org.apache.hadoop.io.compress.CompressionCodec&nbsp;compressor,
-                                  byte[]&nbsp;cellBlock,
-                                  int&nbsp;offset,
-                                  int&nbsp;length)</code>&nbsp;</td>
+                                  <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;cellBlock)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcClientImpl.Connection</a></code></td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index 434ae88..dc0d7a6 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -96,8 +96,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="strong">ExecutorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="strong">EventType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="strong">ExecutorType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index dae9445..e6e3116 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -161,14 +161,14 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">FilterList.Operator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">Filter.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">RegexStringComparator.EngineType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">FilterWrapper.FilterRowRetCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">FuzzyRowFilter.SatisfiesCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">CompareFilter.CompareOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">BitComparator.BitwiseOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">CompareFilter.CompareOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">FilterList.Operator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">Filter.ReturnCode</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/io/ByteArrayOutputStream.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/ByteArrayOutputStream.html b/devapidocs/org/apache/hadoop/hbase/io/ByteArrayOutputStream.html
index e1fdf39..c452d32 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/ByteArrayOutputStream.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/ByteArrayOutputStream.html
@@ -36,7 +36,7 @@
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/io/BoundedByteBufferPool.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Prev Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferOutputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Next Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/io/ByteArrayOutputStream.html" target="_top">Frames</a></li>
@@ -467,7 +467,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferSupportO
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/io/BoundedByteBufferPool.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Prev Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferOutputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Next Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/io/ByteBufferInputStream.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/io/ByteArrayOutputStream.html" target="_top">Frames</a></li>


[47/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Call.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Call.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Call.html
index 34dccdb..acfaaaf 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Call.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcServer.Call.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.286">RpcServer.Call</a>
+<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.html#line.289">RpcServer.Call</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a></pre>
 <div class="block">Datastructure that holds all necessary to a method invocation and then afterward, carries
@@ -251,113 +251,118 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#createHeaderAndMessageBytes(com.google.protobuf.Message,%20com.google.protobuf.Message)">createHeaderAndMessageBytes</a></strong>(com.google.protobuf.Message&nbsp;result,
+                                                      com.google.protobuf.Message&nbsp;header)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#disconnectSince()">disconnectSince</a></strong>()</code>
 <div class="block">Check if the caller who made this IPC call has disconnected.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#done()">done</a></strong>()</code>
 <div class="block">Call is done.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#getClientVersionInfo()">getClientVersionInfo</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#getHeader()">getHeader</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#getRemoteAddress()">getRemoteAddress</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.security.UserGroupInformation</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#getRemoteUser()">getRemoteUser</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#getRequestUser()">getRequestUser</a></strong>()</code>
 <div class="block">Returns the user credentials associated with the current RPC request or
  <code>null</code> if no credentials were provided.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#getRequestUserName()">getRequestUserName</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#getResponseBlockSize()">getResponseBlockSize</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#getResponseCellSize()">getResponseCellSize</a></strong>()</code>
 <div class="block">The size of response cells that have been accumulated so far.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#getSize()">getSize</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#incrementResponseBlockSize(long)">incrementResponseBlockSize</a></strong>(long&nbsp;blockSize)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#incrementResponseCellSize(long)">incrementResponseCellSize</a></strong>(long&nbsp;cellSize)</code>
 <div class="block">Add on the given amount to the retained cell size.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#isClientCellBlockSupported()">isClientCellBlockSupported</a></strong>()</code>
 <div class="block">If the client connected and specified a codec to use, then we will use this codec making
  cellblocks to return.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#isRetryImmediatelySupported()">isRetryImmediatelySupported</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#sendResponseIfReady()">sendResponseIfReady</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#setCallBack(org.apache.hadoop.hbase.ipc.RpcCallback)">setCallBack</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallback</a>&nbsp;callback)</code>
 <div class="block">Sets a callback which has to be executed at the end of this RPC call.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#setResponse(java.lang.Object,%20org.apache.hadoop.hbase.CellScanner,%20java.lang.Throwable,%20java.lang.String)">setResponse</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;m,
                       <a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;cells,
                       <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;t,
                       <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;errorMsg)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#setSaslTokenResponse(java.nio.ByteBuffer)">setSaslTokenResponse</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;response)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#toShortString()">toShortString</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#toString()">toString</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#toTraceString()">toTraceString</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ipc/BufferChain.html" title="class in org.apache.hadoop.hbase.ipc">BufferChain</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Call.html#wrapWithSasl(org.apache.hadoop.hbase.ipc.BufferChain)">wrapWithSasl</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferChain.html" title="class in org.apache.hadoop.hbase.ipc">BufferChain</a>&nbsp;bc)</code>&nbsp;</td>
 </tr>
@@ -389,7 +394,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>id</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.287">id</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.290">id</a></pre>
 </li>
 </ul>
 <a name="service">
@@ -398,7 +403,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>service</h4>
-<pre>protected&nbsp;com.google.protobuf.BlockingService <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.288">service</a></pre>
+<pre>protected&nbsp;com.google.protobuf.BlockingService <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.291">service</a></pre>
 </li>
 </ul>
 <a name="md">
@@ -407,7 +412,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>md</h4>
-<pre>protected&nbsp;com.google.protobuf.Descriptors.MethodDescriptor <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.289">md</a></pre>
+<pre>protected&nbsp;com.google.protobuf.Descriptors.MethodDescriptor <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.292">md</a></pre>
 </li>
 </ul>
 <a name="header">
@@ -416,7 +421,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>header</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.290">header</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.293">header</a></pre>
 </li>
 </ul>
 <a name="param">
@@ -425,7 +430,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>param</h4>
-<pre>protected&nbsp;com.google.protobuf.Message <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.291">param</a></pre>
+<pre>protected&nbsp;com.google.protobuf.Message <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.294">param</a></pre>
 </li>
 </ul>
 <a name="cellScanner">
@@ -434,7 +439,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>cellScanner</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.293">cellScanner</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.296">cellScanner</a></pre>
 </li>
 </ul>
 <a name="connection">
@@ -443,7 +448,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.294">connection</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.297">connection</a></pre>
 </li>
 </ul>
 <a name="timestamp">
@@ -452,7 +457,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>timestamp</h4>
-<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.295">timestamp</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.298">timestamp</a></pre>
 </li>
 </ul>
 <a name="response">
@@ -461,7 +466,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>response</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferChain.html" title="class in org.apache.hadoop.hbase.ipc">BufferChain</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.300">response</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferChain.html" title="class in org.apache.hadoop.hbase.ipc">BufferChain</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.303">response</a></pre>
 <div class="block">Chain of buffers to send as response.</div>
 </li>
 </ul>
@@ -471,7 +476,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>responder</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Responder.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Responder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.301">responder</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.Responder.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.Responder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.304">responder</a></pre>
 </li>
 </ul>
 <a name="size">
@@ -480,7 +485,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.303">size</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.306">size</a></pre>
 </li>
 </ul>
 <a name="isError">
@@ -489,7 +494,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>isError</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.304">isError</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.307">isError</a></pre>
 </li>
 </ul>
 <a name="tinfo">
@@ -498,7 +503,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>tinfo</h4>
-<pre>protected&nbsp;org.apache.htrace.TraceInfo <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.305">tinfo</a></pre>
+<pre>protected&nbsp;org.apache.htrace.TraceInfo <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.308">tinfo</a></pre>
 </li>
 </ul>
 <a name="cellBlock">
@@ -507,7 +512,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>cellBlock</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.306">cellBlock</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.309">cellBlock</a></pre>
 </li>
 </ul>
 <a name="user">
@@ -516,7 +521,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>user</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.308">user</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.311">user</a></pre>
 </li>
 </ul>
 <a name="remoteAddress">
@@ -525,7 +530,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>remoteAddress</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.309">remoteAddress</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.312">remoteAddress</a></pre>
 </li>
 </ul>
 <a name="callback">
@@ -534,7 +539,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>callback</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallback</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.310">callback</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallback</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.313">callback</a></pre>
 </li>
 </ul>
 <a name="responseCellSize">
@@ -543,7 +548,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>responseCellSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.312">responseCellSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.315">responseCellSize</a></pre>
 </li>
 </ul>
 <a name="responseBlockSize">
@@ -552,7 +557,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>responseBlockSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.313">responseBlockSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.316">responseBlockSize</a></pre>
 </li>
 </ul>
 <a name="retryImmediatelySupported">
@@ -561,7 +566,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>retryImmediatelySupported</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.314">retryImmediatelySupported</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.317">retryImmediatelySupported</a></pre>
 </li>
 </ul>
 </li>
@@ -578,7 +583,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RpcServer.Call</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.318">RpcServer.Call</a>(int&nbsp;id,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.321">RpcServer.Call</a>(int&nbsp;id,
               com.google.protobuf.BlockingService&nbsp;service,
               com.google.protobuf.Descriptors.MethodDescriptor&nbsp;md,
               org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
@@ -605,7 +610,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.346">done</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.349">done</a>()</pre>
 <div class="block">Call is done. Execution happened and we returned results to client. It is now safe to
  cleanup.</div>
 </li>
@@ -616,7 +621,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.356">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.359">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -629,7 +634,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getHeader</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.362">getHeader</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.365">getHeader</a>()</pre>
 </li>
 </ul>
 <a name="toShortString()">
@@ -638,7 +643,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>toShortString</h4>
-<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.370">toShortString</a>()</pre>
+<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.373">toShortString</a>()</pre>
 </li>
 </ul>
 <a name="toTraceString()">
@@ -647,7 +652,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>toTraceString</h4>
-<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.379">toTraceString</a>()</pre>
+<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.382">toTraceString</a>()</pre>
 </li>
 </ul>
 <a name="setSaslTokenResponse(java.nio.ByteBuffer)">
@@ -656,7 +661,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>setSaslTokenResponse</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.386">setSaslTokenResponse</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;response)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.389">setSaslTokenResponse</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;response)</pre>
 </li>
 </ul>
 <a name="setResponse(java.lang.Object, org.apache.hadoop.hbase.CellScanner, java.lang.Throwable, java.lang.String)">
@@ -665,19 +670,32 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>setResponse</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.390">setResponse</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;m,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.393">setResponse</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;m,
                <a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;cells,
                <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;t,
                <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;errorMsg)</pre>
 </li>
 </ul>
+<a name="createHeaderAndMessageBytes(com.google.protobuf.Message, com.google.protobuf.Message)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>createHeaderAndMessageBytes</h4>
+<pre>private&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.456">createHeaderAndMessageBytes</a>(com.google.protobuf.Message&nbsp;result,
+                                 com.google.protobuf.Message&nbsp;header)
+                                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl><dt><span class="strong">Throws:</span></dt>
+<dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
+</li>
+</ul>
 <a name="wrapWithSasl(org.apache.hadoop.hbase.ipc.BufferChain)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>wrapWithSasl</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferChain.html" title="class in org.apache.hadoop.hbase.ipc">BufferChain</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.457">wrapWithSasl</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferChain.html" title="class in org.apache.hadoop.hbase.ipc">BufferChain</a>&nbsp;bc)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferChain.html" title="class in org.apache.hadoop.hbase.ipc">BufferChain</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.494">wrapWithSasl</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferChain.html" title="class in org.apache.hadoop.hbase.ipc">BufferChain</a>&nbsp;bc)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -689,7 +707,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>isClientCellBlockSupported</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.480">isClientCellBlockSupported</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.517">isClientCellBlockSupported</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#isClientCellBlockSupported()">RpcCallContext</a></code></strong></div>
 <div class="block">If the client connected and specified a codec to use, then we will use this codec making
  cellblocks to return.  If the client did not specify a codec, we assume it does not support
@@ -708,7 +726,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>disconnectSince</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.485">disconnectSince</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.522">disconnectSince</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#disconnectSince()">RpcCallContext</a></code></strong></div>
 <div class="block">Check if the caller who made this IPC call has disconnected.
  If called from outside the context of IPC, this does nothing.</div>
@@ -725,7 +743,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.493">getSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.530">getSize</a>()</pre>
 </li>
 </ul>
 <a name="getResponseCellSize()">
@@ -734,7 +752,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getResponseCellSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.497">getResponseCellSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.535">getResponseCellSize</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#getResponseCellSize()">RpcCallContext</a></code></strong></div>
 <div class="block">The size of response cells that have been accumulated so far.
  This along with the corresponding increment call is used to ensure that multi's or
@@ -751,7 +769,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementResponseCellSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.501">incrementResponseCellSize</a>(long&nbsp;cellSize)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.540">incrementResponseCellSize</a>(long&nbsp;cellSize)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#incrementResponseCellSize(long)">RpcCallContext</a></code></strong></div>
 <div class="block">Add on the given amount to the retained cell size.
 
@@ -770,7 +788,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getResponseBlockSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.506">getResponseBlockSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.545">getResponseBlockSize</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#getResponseBlockSize()">getResponseBlockSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a></code></dd>
@@ -783,7 +801,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementResponseBlockSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.511">incrementResponseBlockSize</a>(long&nbsp;blockSize)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.550">incrementResponseBlockSize</a>(long&nbsp;blockSize)</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#incrementResponseBlockSize(long)">incrementResponseBlockSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a></code></dd>
@@ -796,7 +814,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>sendResponseIfReady</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.515">sendResponseIfReady</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.554">sendResponseIfReady</a>()
                          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -808,7 +826,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getRemoteUser</h4>
-<pre>public&nbsp;org.apache.hadoop.security.UserGroupInformation&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.519">getRemoteUser</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.security.UserGroupInformation&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.558">getRemoteUser</a>()</pre>
 </li>
 </ul>
 <a name="getRequestUser()">
@@ -817,7 +835,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getRequestUser</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.524">getRequestUser</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.563">getRequestUser</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#getRequestUser()">RpcCallContext</a></code></strong></div>
 <div class="block">Returns the user credentials associated with the current RPC request or
  <code>null</code> if no credentials were provided.</div>
@@ -833,7 +851,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getRequestUserName</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.529">getRequestUserName</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.568">getRequestUserName</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#getRequestUserName()">getRequestUserName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a></code></dd>
@@ -846,7 +864,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getRemoteAddress</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.535">getRemoteAddress</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html?is-external=true" title="class or interface in java.net">InetAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.574">getRemoteAddress</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#getRemoteAddress()">getRemoteAddress</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a></code></dd>
@@ -859,7 +877,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getClientVersionInfo</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.540">getClientVersionInfo</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.579">getClientVersionInfo</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#getClientVersionInfo()">getClientVersionInfo</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a></code></dd>
@@ -872,7 +890,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>setCallBack</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.545">setCallBack</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallback</a>&nbsp;callback)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.584">setCallBack</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallback</a>&nbsp;callback)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#setCallBack(org.apache.hadoop.hbase.ipc.RpcCallback)">RpcCallContext</a></code></strong></div>
 <div class="block">Sets a callback which has to be executed at the end of this RPC call. Such a callback is an
  optional one for any Rpc call.</div>
@@ -888,7 +906,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isRetryImmediatelySupported</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.550">isRetryImmediatelySupported</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcServer.Call.html#line.589">isRetryImmediatelySupported</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html#isRetryImmediatelySupported()">isRetryImmediatelySupported</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a></code></dd>


[02/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html
index 4434339..0a8fce1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html
@@ -1155,1706 +1155,1717 @@
 <span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
 <span class="sourceLineNo">1148</span>  Region getRegion(<a name="line.1148"></a>
 <span class="sourceLineNo">1149</span>      final RegionSpecifier regionSpecifier) throws IOException {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    return regionServer.getRegionByEncodedName(regionSpecifier.getValue().toByteArray(),<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        ProtobufUtil.getRegionEncodedName(regionSpecifier));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>  }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>  @VisibleForTesting<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  public PriorityFunction getPriority() {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return priority;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  @VisibleForTesting<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public Configuration getConfiguration() {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    return regionServer.getConfiguration();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span><a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>  private RegionServerQuotaManager getQuotaManager() {<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    return regionServer.getRegionServerQuotaManager();<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>  }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  void start() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    rpcServer.start();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  }<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span><a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  void stop() {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    closeAllScanners();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    rpcServer.stop();<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span><a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>   * Called to verify that this server is up and running.<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>   *<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>   * @throws IOException<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>   */<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>  protected void checkOpen() throws IOException {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    if (regionServer.isAborted()) {<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      throw new RegionServerAbortedException("Server " + regionServer.serverName + " aborting");<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    if (regionServer.isStopped()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      throw new RegionServerStoppedException("Server " + regionServer.serverName + " stopping");<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    if (!regionServer.fsOk) {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      throw new RegionServerStoppedException("File system not available");<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    if (!regionServer.isOnline()) {<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      throw new ServerNotRunningYetException("Server is not running yet");<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>  }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  /**<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>   * @return list of blocking services and their security info classes that this server supports<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>   */<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>  protected List&lt;BlockingServiceAndInterface&gt; getServices() {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    List&lt;BlockingServiceAndInterface&gt; bssi = new ArrayList&lt;BlockingServiceAndInterface&gt;(2);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      ClientService.newReflectiveBlockingService(this),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>      ClientService.BlockingInterface.class));<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>      AdminService.newReflectiveBlockingService(this),<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      AdminService.BlockingInterface.class));<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    return bssi;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>  }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span><a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  public InetSocketAddress getSocketAddress() {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    return isa;<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span><a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>  @Override<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    return priority.getPriority(header, param, user);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>  @Override<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    return priority.getDeadline(header, param);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>  }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  /*<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * Check if an OOME and, if so, abort immediately to avoid creating more objects.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   *<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @param e<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   *<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>   * @return True if we OOME'd and are aborting.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>   */<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>  @Override<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>  public boolean checkOOME(final Throwable e) {<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    boolean stop = false;<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    try {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>      if (e instanceof OutOfMemoryError<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          || (e.getCause() != null &amp;&amp; e.getCause() instanceof OutOfMemoryError)<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>          || (e.getMessage() != null &amp;&amp; e.getMessage().contains(<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>              "java.lang.OutOfMemoryError"))) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>        stop = true;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        LOG.fatal("Run out of memory; " + getClass().getSimpleName()<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>          + " will abort itself immediately", e);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    } finally {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>      if (stop) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>        Runtime.getRuntime().halt(1);<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      }<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    }<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    return stop;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>  }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>  /**<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>   * Close a region on the region server.<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   *<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>   * @param controller the RPC controller<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>   * @param request the request<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>   * @throws ServiceException<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>   */<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  @Override<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  public CloseRegionResponse closeRegion(final RpcController controller,<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      final CloseRegionRequest request) throws ServiceException {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    final ServerName sn = (request.hasDestinationServer() ?<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>      ProtobufUtil.toServerName(request.getDestinationServer()) : null);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    try {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      checkOpen();<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>      if (request.hasServerStartCode()) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>        // check that we are the same server that this RPC is intended for.<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        long serverStartCode = request.getServerStartCode();<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>        if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>          throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>              "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>              + regionServer.serverName));<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion());<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span><a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      // Can be null if we're calling close on a region that's not online<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      final Region region = regionServer.getFromOnlineRegions(encodedRegionName);<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if ((region  != null) &amp;&amp; (region .getCoprocessorHost() != null)) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        region.getCoprocessorHost().preClose(false);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      requestCount.increment();<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      LOG.info("Close " + encodedRegionName + ", moving to " + sn);<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      boolean closed = regionServer.closeRegion(encodedRegionName, false, sn);<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed);<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      return builder.build();<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    } catch (IOException ie) {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      throw new ServiceException(ie);<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>  }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>  /**<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * Compact a region on the region server.<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>   *<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>   * @param controller the RPC controller<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>   * @param request the request<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>   * @throws ServiceException<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>   */<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>  @Override<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      final CompactRegionRequest request) throws ServiceException {<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    try {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>      checkOpen();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      requestCount.increment();<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      Region region = getRegion(request.getRegion());<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      region.startRegionOperation(Operation.COMPACT_REGION);<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString());<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      boolean major = false;<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>      byte [] family = null;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      Store store = null;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      if (request.hasFamily()) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        family = request.getFamily().toByteArray();<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>        store = region.getStore(family);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>        if (store == null) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>          throw new ServiceException(new IOException("column family " + Bytes.toString(family)<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>            + " does not exist in region " + region.getRegionInfo().getRegionNameAsString()));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>        }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      if (request.hasMajor()) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>        major = request.getMajor();<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      }<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      if (major) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>        if (family != null) {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>          store.triggerMajorCompaction();<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        } else {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          region.triggerMajorCompaction();<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>        }<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      }<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span><a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):"";<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      if (LOG.isTraceEnabled()) {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>        LOG.trace("User-triggered compaction requested for region "<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>          + region.getRegionInfo().getRegionNameAsString() + familyLogMsg);<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>      }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg;<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if(family != null) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        regionServer.compactSplitThread.requestCompaction(region, store, log,<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      } else {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        regionServer.compactSplitThread.requestCompaction(region, log,<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>      }<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      return CompactRegionResponse.newBuilder().build();<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    } catch (IOException ie) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>      throw new ServiceException(ie);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>  }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /**<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * Flush a region on the region server.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param controller the RPC controller<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param request the request<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @throws ServiceException<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>  public FlushRegionResponse flushRegion(final RpcController controller,<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>      final FlushRegionRequest request) throws ServiceException {<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    try {<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      checkOpen();<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      requestCount.increment();<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      Region region = getRegion(request.getRegion());<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString());<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      boolean shouldFlush = true;<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      if (request.hasIfOlderThanTs()) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>        shouldFlush = region.getEarliestFlushTimeForAllStores() &lt; request.getIfOlderThanTs();<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      }<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder();<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (shouldFlush) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>        boolean writeFlushWalMarker =  request.hasWriteFlushWalMarker() ?<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>            request.getWriteFlushWalMarker() : false;<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        // Go behind the curtain so we can manage writing of the flush WAL marker<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl)<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>            ((HRegion)region).flushcache(true, writeFlushWalMarker);<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        if (flushResult.isFlushSucceeded()) {<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>          regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>        }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>        boolean compactionNeeded = flushResult.isCompactionNeeded();<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>        if (compactionNeeded) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>          regionServer.compactSplitThread.requestSystemCompaction(region,<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>            "Compaction through user triggered flush");<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>        builder.setFlushed(flushResult.isFlushSucceeded());<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores());<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      return builder.build();<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    } catch (DroppedSnapshotException ex) {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>      // is required. Currently the only way to do this is a restart of<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>      // the server.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>      throw new ServiceException(ex);<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    } catch (IOException ie) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      throw new ServiceException(ie);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>  }<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span><a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>  @Override<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>  public GetOnlineRegionResponse getOnlineRegion(final RpcController controller,<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      final GetOnlineRegionRequest request) throws ServiceException {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    try {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      checkOpen();<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      requestCount.increment();<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      Map&lt;String, Region&gt; onlineRegions = regionServer.onlineRegions;<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      List&lt;HRegionInfo&gt; list = new ArrayList&lt;HRegionInfo&gt;(onlineRegions.size());<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>      for (Region region: onlineRegions.values()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>        list.add(region.getRegionInfo());<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      }<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      Collections.sort(list);<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      return ResponseConverter.buildGetOnlineRegionResponse(list);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    } catch (IOException ie) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      throw new ServiceException(ie);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>  }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>  @Override<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      final GetRegionInfoRequest request) throws ServiceException {<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>      checkOpen();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      requestCount.increment();<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>      Region region = getRegion(request.getRegion());<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      HRegionInfo info = region.getRegionInfo();<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      builder.setRegionInfo(HRegionInfo.convert(info));<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        builder.setCompactionState(region.getCompactionState());<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      }<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      builder.setIsRecovering(region.isRecovering());<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      return builder.build();<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    } catch (IOException ie) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      throw new ServiceException(ie);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span><a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>  /**<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>   * Get some information of the region server.<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>   *<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>   * @param controller the RPC controller<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>   * @param request the request<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>   * @throws ServiceException<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>   */<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>  @Override<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>  public GetServerInfoResponse getServerInfo(final RpcController controller,<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      final GetServerInfoRequest request) throws ServiceException {<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    try {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>      checkOpen();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    } catch (IOException ie) {<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>      throw new ServiceException(ie);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    }<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    requestCount.increment();<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1;<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort);<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>  }<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span><a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>  @Override<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  public GetStoreFileResponse getStoreFile(final RpcController controller,<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      final GetStoreFileRequest request) throws ServiceException {<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    try {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>      checkOpen();<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      Region region = getRegion(request.getRegion());<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      requestCount.increment();<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Set&lt;byte[]&gt; columnFamilies;<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      if (request.getFamilyCount() == 0) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>        columnFamilies = region.getTableDesc().getFamiliesKeys();<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      } else {<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>        columnFamilies = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>        for (ByteString cf: request.getFamilyList()) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>          columnFamilies.add(cf.toByteArray());<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>        }<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      int nCF = columnFamilies.size();<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>      List&lt;String&gt;  fileList = region.getStoreFileList(<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        columnFamilies.toArray(new byte[nCF][]));<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>      GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder();<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>      builder.addAllStoreFile(fileList);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      return builder.build();<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    } catch (IOException ie) {<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      throw new ServiceException(ie);<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>  }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span><a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>  /**<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   * Merge regions on the region server.<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>   *<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>   * @param controller the RPC controller<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>   * @param request the request<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>   * @return merge regions response<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>   * @throws ServiceException<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>   */<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  @Override<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>  @QosPriority(priority = HConstants.ADMIN_QOS)<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>  public MergeRegionsResponse mergeRegions(final RpcController controller,<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      final MergeRegionsRequest request) throws ServiceException {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    try {<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>      checkOpen();<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>      requestCount.increment();<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>      Region regionA = getRegion(request.getRegionA());<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      Region regionB = getRegion(request.getRegionB());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>      boolean forcible = request.getForcible();<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>      long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      regionA.startRegionOperation(Operation.MERGE_REGION);<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      regionB.startRegionOperation(Operation.MERGE_REGION);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (regionA.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID ||<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>          regionB.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) {<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>        throw new ServiceException(new MergeRegionException("Can't merge non-default replicas"));<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>      }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      LOG.info("Receiving merging request for  " + regionA + ", " + regionB<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          + ",forcible=" + forcible);<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>      long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>      FlushResult flushResult = regionA.flush(true);<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>      if (flushResult.isFlushSucceeded()) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>        long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>      }<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      startTime = EnvironmentEdgeManager.currentTime();<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>      flushResult = regionB.flush(true);<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      if (flushResult.isFlushSucceeded()) {<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>        long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>        regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>      }<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>      regionServer.compactSplitThread.requestRegionsMerge(regionA, regionB, forcible,<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          masterSystemTime, RpcServer.getRequestUser());<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>      return MergeRegionsResponse.newBuilder().build();<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    } catch (DroppedSnapshotException ex) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      throw new ServiceException(ex);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>    } catch (IOException ie) {<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      throw new ServiceException(ie);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    }<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>  }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span><a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>  /**<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>   * Open asynchronously a region or a set of regions on the region server.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>   *<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>   * The opening is coordinated by ZooKeeper, and this method requires the znode to be created<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>   *  before being called. As a consequence, this method should be called only from the master.<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>   * &lt;p&gt;<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>   * Different manages states for the region are:<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>   * &lt;/p&gt;&lt;ul&gt;<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>   *  &lt;li&gt;region not opened: the region opening will start asynchronously.&lt;/li&gt;<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>   *  &lt;li&gt;a close is already in progress: this is considered as an error.&lt;/li&gt;<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>   *  &lt;li&gt;an open is already in progress: this new open request will be ignored. This is important<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>   *  because the Master can do multiple requests if it crashes.&lt;/li&gt;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>   *  &lt;li&gt;the region is already opened:  this new open request will be ignored.&lt;/li&gt;<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>   *  &lt;/ul&gt;<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>   * &lt;p&gt;<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>   * Bulk assign: If there are more than 1 region to open, it will be considered as a bulk assign.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>   * For a single region opening, errors are sent through a ServiceException. For bulk assign,<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>   * errors are put in the response as FAILED_OPENING.<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>   * &lt;/p&gt;<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>   * @param controller the RPC controller<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>   * @param request the request<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>   * @throws ServiceException<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>   */<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>  @Override<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>  public OpenRegionResponse openRegion(final RpcController controller,<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      final OpenRegionRequest request) throws ServiceException {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    requestCount.increment();<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    if (request.hasServerStartCode()) {<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      // check that we are the same server that this RPC is intended for.<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>      long serverStartCode = request.getServerStartCode();<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>            "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>            + regionServer.serverName));<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    OpenRegionResponse.Builder builder = OpenRegionResponse.newBuilder();<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    final int regionCount = request.getOpenInfoCount();<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    final Map&lt;TableName, HTableDescriptor&gt; htds =<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>        new HashMap&lt;TableName, HTableDescriptor&gt;(regionCount);<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    final boolean isBulkAssign = regionCount &gt; 1;<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    try {<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      checkOpen();<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    } catch (IOException ie) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>      TableName tableName = null;<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>      if (regionCount == 1) {<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>        RegionInfo ri = request.getOpenInfo(0).getRegion();<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>        if (ri != null) {<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>          tableName = ProtobufUtil.toTableName(ri.getTableName());<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>        }<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      }<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      if (!TableName.META_TABLE_NAME.equals(tableName)) {<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>        throw new ServiceException(ie);<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>      // We are assigning meta, wait a little for regionserver to finish initialization.<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>      int timeout = regionServer.conf.getInt(HConstants.HBASE_RPC_TIMEOUT_KEY,<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        HConstants.DEFAULT_HBASE_RPC_TIMEOUT) &gt;&gt; 2; // Quarter of RPC timeout<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      long endTime = System.currentTimeMillis() + timeout;<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>      synchronized (regionServer.online) {<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>        try {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>          while (System.currentTimeMillis() &lt;= endTime<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>              &amp;&amp; !regionServer.isStopped() &amp;&amp; !regionServer.isOnline()) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>            regionServer.online.wait(regionServer.msgInterval);<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          }<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          checkOpen();<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        } catch (InterruptedException t) {<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>          Thread.currentThread().interrupt();<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>          throw new ServiceException(t);<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>        } catch (IOException e) {<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>          throw new ServiceException(e);<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>        }<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>      }<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    }<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1;<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span><a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>    for (RegionOpenInfo regionOpenInfo : request.getOpenInfoList()) {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>      final HRegionInfo region = HRegionInfo.convert(regionOpenInfo.getRegion());<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>      HTableDescriptor htd;<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>      try {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>        String encodedName = region.getEncodedName();<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        byte[] encodedNameBytes = region.getEncodedNameAsBytes();<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>        final Region onlineRegion = regionServer.getFromOnlineRegions(encodedName);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>        if (onlineRegion != null) {<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>          // The region is already online. This should not happen any more.<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>          String error = "Received OPEN for the region:"<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>            + region.getRegionNameAsString() + ", which is already online";<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>          regionServer.abort(error);<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>          throw new IOException(error);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>        }<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        LOG.info("Open " + region.getRegionNameAsString());<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        htd = htds.get(region.getTable());<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        if (htd == null) {<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>          htd = regionServer.tableDescriptors.get(region.getTable());<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>          htds.put(region.getTable(), htd);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>        }<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span><a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>        final Boolean previous = regionServer.regionsInTransitionInRS.putIfAbsent(<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>          encodedNameBytes, Boolean.TRUE);<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span><a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        if (Boolean.FALSE.equals(previous)) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          if (regionServer.getFromOnlineRegions(encodedName) != null) {<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>            // There is a close in progress. This should not happen any more.<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>            String error = "Received OPEN for the region:"<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>              + region.getRegionNameAsString() + ", which we are already trying to CLOSE";<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>            regionServer.abort(error);<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>            throw new IOException(error);<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>          }<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>          regionServer.regionsInTransitionInRS.put(encodedNameBytes, Boolean.TRUE);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>        }<a name="line.1657"></a>
+<span class="sourceLineNo">1150</span>    ByteString value = regionSpecifier.getValue();<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    RegionSpecifierType type = regionSpecifier.getType();<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    switch (type) {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      case REGION_NAME:<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        byte[] regionName = value.toByteArray();<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>        String encodedRegionName = HRegionInfo.encodeRegionName(regionName);<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>        return regionServer.getRegionByEncodedName(regionName, encodedRegionName);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      case ENCODED_REGION_NAME:<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        return regionServer.getRegionByEncodedName(value.toStringUtf8());<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      default:<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>        throw new DoNotRetryIOException(<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          "Unsupported region specifier type: " + type);<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span><a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  @VisibleForTesting<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>  public PriorityFunction getPriority() {<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    return priority;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span><a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>  @VisibleForTesting<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>  public Configuration getConfiguration() {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    return regionServer.getConfiguration();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  private RegionServerQuotaManager getQuotaManager() {<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    return regionServer.getRegionServerQuotaManager();<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  }<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span><a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>  void start() {<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    rpcServer.start();<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  }<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span><a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>  void stop() {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    closeAllScanners();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    rpcServer.stop();<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>  }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span><a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>  /**<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   * Called to verify that this server is up and running.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   *<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * @throws IOException<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   */<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>  protected void checkOpen() throws IOException {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    if (regionServer.isAborted()) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      throw new RegionServerAbortedException("Server " + regionServer.serverName + " aborting");<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regionServer.isStopped()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      throw new RegionServerStoppedException("Server " + regionServer.serverName + " stopping");<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    if (!regionServer.fsOk) {<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      throw new RegionServerStoppedException("File system not available");<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    if (!regionServer.isOnline()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      throw new ServerNotRunningYetException("Server is not running yet");<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>  }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span><a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>  /**<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * @return list of blocking services and their security info classes that this server supports<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   */<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>  protected List&lt;BlockingServiceAndInterface&gt; getServices() {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    List&lt;BlockingServiceAndInterface&gt; bssi = new ArrayList&lt;BlockingServiceAndInterface&gt;(2);<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      ClientService.newReflectiveBlockingService(this),<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      ClientService.BlockingInterface.class));<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    bssi.add(new BlockingServiceAndInterface(<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      AdminService.newReflectiveBlockingService(this),<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      AdminService.BlockingInterface.class));<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    return bssi;<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>  }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span><a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>  public InetSocketAddress getSocketAddress() {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    return isa;<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>  @Override<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>  public int getPriority(RequestHeader header, Message param, User user) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    return priority.getPriority(header, param, user);<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>  }<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>  @Override<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>  public long getDeadline(RequestHeader header, Message param) {<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    return priority.getDeadline(header, param);<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>  }<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span><a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>  /*<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>   * Check if an OOME and, if so, abort immediately to avoid creating more objects.<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>   *<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>   * @param e<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>   *<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   * @return True if we OOME'd and are aborting.<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>  @Override<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>  public boolean checkOOME(final Throwable e) {<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    boolean stop = false;<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>      if (e instanceof OutOfMemoryError<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>          || (e.getCause() != null &amp;&amp; e.getCause() instanceof OutOfMemoryError)<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>          || (e.getMessage() != null &amp;&amp; e.getMessage().contains(<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>              "java.lang.OutOfMemoryError"))) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        stop = true;<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>        LOG.fatal("Run out of memory; " + getClass().getSimpleName()<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>          + " will abort itself immediately", e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      }<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    } finally {<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      if (stop) {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        Runtime.getRuntime().halt(1);<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      }<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    return stop;<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>  }<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span><a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>  /**<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   * Close a region on the region server.<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>   *<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>   * @param controller the RPC controller<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>   * @param request the request<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>   * @throws ServiceException<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>   */<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>  @Override<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>  public CloseRegionResponse closeRegion(final RpcController controller,<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      final CloseRegionRequest request) throws ServiceException {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    final ServerName sn = (request.hasDestinationServer() ?<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      ProtobufUtil.toServerName(request.getDestinationServer()) : null);<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    try {<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>      checkOpen();<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>      if (request.hasServerStartCode()) {<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        // check that we are the same server that this RPC is intended for.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>        long serverStartCode = request.getServerStartCode();<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>        if (regionServer.serverName.getStartcode() !=  serverStartCode) {<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>          throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " +<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>              "different server with startCode: " + serverStartCode + ", this server is: "<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>              + regionServer.serverName));<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        }<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion());<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span><a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // Can be null if we're calling close on a region that's not online<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      final Region region = regionServer.getFromOnlineRegions(encodedRegionName);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      if ((region  != null) &amp;&amp; (region .getCoprocessorHost() != null)) {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>        region.getCoprocessorHost().preClose(false);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      requestCount.increment();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      LOG.info("Close " + encodedRegionName + ", moving to " + sn);<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      boolean closed = regionServer.closeRegion(encodedRegionName, false, sn);<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      return builder.build();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    } catch (IOException ie) {<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      throw new ServiceException(ie);<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span><a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>  /**<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * Compact a region on the region server.<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   *<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>   * @param controller the RPC controller<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * @param request the request<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * @throws ServiceException<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  @Override<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>  public CompactRegionResponse compactRegion(final RpcController controller,<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>      final CompactRegionRequest request) throws ServiceException {<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    try {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>      checkOpen();<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>      requestCount.increment();<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      Region region = getRegion(request.getRegion());<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      region.startRegionOperation(Operation.COMPACT_REGION);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString());<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      boolean major = false;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      byte [] family = null;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>      Store store = null;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>      if (request.hasFamily()) {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>        family = request.getFamily().toByteArray();<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>        store = region.getStore(family);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>        if (store == null) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>          throw new ServiceException(new IOException("column family " + Bytes.toString(family)<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>            + " does not exist in region " + region.getRegionInfo().getRegionNameAsString()));<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>        }<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>      if (request.hasMajor()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>        major = request.getMajor();<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      if (major) {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>        if (family != null) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>          store.triggerMajorCompaction();<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        } else {<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>          region.triggerMajorCompaction();<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>      }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span><a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>      String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):"";<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>      if (LOG.isTraceEnabled()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>        LOG.trace("User-triggered compaction requested for region "<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>          + region.getRegionInfo().getRegionNameAsString() + familyLogMsg);<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>      String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      if(family != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>        regionServer.compactSplitThread.requestCompaction(region, store, log,<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>      } else {<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>        regionServer.compactSplitThread.requestCompaction(region, log,<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>          Store.PRIORITY_USER, null, RpcServer.getRequestUser());<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      }<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return CompactRegionResponse.newBuilder().build();<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    } catch (IOException ie) {<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>      throw new ServiceException(ie);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  }<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span><a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>  /**<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>   * Flush a region on the region server.<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>   *<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>   * @param controller the RPC controller<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>   * @param request the request<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>   * @throws ServiceException<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>   */<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  @Override<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  public FlushRegionResponse flushRegion(final RpcController controller,<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>      final FlushRegionRequest request) throws ServiceException {<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    try {<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>      checkOpen();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      requestCount.increment();<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      Region region = getRegion(request.getRegion());<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>      LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString());<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>      boolean shouldFlush = true;<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>      if (request.hasIfOlderThanTs()) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>        shouldFlush = region.getEarliestFlushTimeForAllStores() &lt; request.getIfOlderThanTs();<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      }<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      if (shouldFlush) {<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        boolean writeFlushWalMarker =  request.hasWriteFlushWalMarker() ?<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>            request.getWriteFlushWalMarker() : false;<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        long startTime = EnvironmentEdgeManager.currentTime();<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>        // Go behind the curtain so we can manage writing of the flush WAL marker<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl)<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            ((HRegion)region).flushcache(true, writeFlushWalMarker);<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        if (flushResult.isFlushSucceeded()) {<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>          long endTime = EnvironmentEdgeManager.currentTime();<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          regionServer.metricsRegionServer.updateFlushTime(endTime - startTime);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        boolean compactionNeeded = flushResult.isCompactionNeeded();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>        if (compactionNeeded) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>          regionServer.compactSplitThread.requestSystemCompaction(region,<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>            "Compaction through user triggered flush");<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        }<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        builder.setFlushed(flushResult.isFlushSucceeded());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker);<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      }<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>      builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores());<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>      return builder.build();<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    } catch (DroppedSnapshotException ex) {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>      // Cache flush can fail in a few places. If it fails in a critical<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      // section, we get a DroppedSnapshotException and a replay of wal<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>      // is required. Currently the only way to do this is a restart of<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      // the server.<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      regionServer.abort("Replay of WAL required. Forcing server shutdown", ex);<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>      throw new ServiceException(ex);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>    } catch (IOException ie) {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>      throw new ServiceException(ie);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>    }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>  }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>  @Override<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>  public GetOnlineRegionResponse getOnlineRegion(final RpcController controller,<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      final GetOnlineRegionRequest request) throws ServiceException {<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>    try {<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>      checkOpen();<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      requestCount.increment();<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>      Map&lt;String, Region&gt; onlineRegions = regionServer.onlineRegions;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      List&lt;HRegionInfo&gt; list = new ArrayList&lt;HRegionInfo&gt;(onlineRegions.size());<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      for (Region region: onlineRegions.values()) {<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>        list.add(region.getRegionInfo());<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      }<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>      Collections.sort(list);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      return ResponseConverter.buildGetOnlineRegionResponse(list);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    } catch (IOException ie) {<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>      throw new ServiceException(ie);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    }<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>  }<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span><a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  @Override<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  public GetRegionInfoResponse getRegionInfo(final RpcController controller,<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      final GetRegionInfoRequest request) throws ServiceException {<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>    try {<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>      checkOpen();<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      requestCount.increment();<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>      Region region = getRegion(request.getRegion());<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      HRegionInfo info = region.getRegionInfo();<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>      GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder();<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      builder.setRegionInfo(HRegionInfo.convert(info));<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      if (request.hasCompactionState() &amp;&amp; request.getCompactionState()) {<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>        builder.setCompactionState(region.getCompactionState());<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>      }<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>      builder.setIsRecovering(region.isRecovering());<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>      return builder.build();<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    } catch (IOException ie) {<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throw new ServiceException(ie);<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    }<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  }<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span><a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>  /**<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>   * Get some information of the region server.<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>   *<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>   * @param controller the RPC controller<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>   * @param request the request<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * @throws ServiceException<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  @Override<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>  public GetServerInfoResponse getServerInfo(final RpcController controller,<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      final GetServerInfoRequest request) throws ServiceException {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    try {<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      checkOpen();<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    } catch (IOException ie) {<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      throw new ServiceException(ie);<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>    }<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    requestCount.increment();<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>  }<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span><a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>  @Override<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>  @QosPriority(priority=HConstants.ADMIN_QOS)<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>  public GetStoreFileResponse getStoreFile(final RpcController controller,<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      final GetStoreFileRequest request) throws ServiceException {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    try {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      checkOpen();<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      Region region = getRegion(request.getRegion());<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      requestCount.increment();<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>      Set&lt;byte[]&gt; columnFamilies;<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>      if (request.getFamilyCount() == 0) {<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>        columnFamilies = region.getTableDesc().getFamiliesKeys();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      } else {<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>        columnFamilies = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>        for (ByteString cf: request.getFamilyList()) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>          columnFamilies.add(cf.toByteArray());<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>        }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>      }<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>      int nCF = columnFamilies.size();<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      List&lt;String&gt;  fileList = region.getStoreFileList(<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>        columnFamilies.toArray(new byte[nCF][]));<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder();<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      builder.addAllStoreFile(fileList);<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      return builder.build();<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>    } catch (IOException ie) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>      throw new ServiceException(ie);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>    }<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  }<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span><a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>  /**<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>   * Merge regions on the region server.<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>   *<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>   * @param controller the RPC controller<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>   * @param request the request<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>   * @return merge regions response<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>   * @throws ServiceException<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>   */<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>  @O

<TRUNCATED>

[23/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
index 8fc3dbd..efdc708 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
@@ -824,743 +824,747 @@
 <span class="sourceLineNo">816</span>          i++;<a name="line.816"></a>
 <span class="sourceLineNo">817</span>          lowestLocalityServerIndex = serverIndicesSortedByLocality[i];<a name="line.817"></a>
 <span class="sourceLineNo">818</span>        }<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        LOG.debug("Lowest locality region server with non zero regions is "<a name="line.819"></a>
-<span class="sourceLineNo">820</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        return lowestLocalityServerIndex;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      }<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span><a name="line.825"></a>
-<span class="sourceLineNo">826</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      if (regionFinder != null) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        float lowestLocality = 1.0f;<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        int lowestLocalityRegionIndex = 0;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          // No regions on that region server<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          return -1;<a name="line.832"></a>
-<span class="sourceLineNo">833</span>        }<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.836"></a>
-<span class="sourceLineNo">837</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          if (locality &lt; lowestLocality) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>            lowestLocality = locality;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>            lowestLocalityRegionIndex = j;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>          }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.844"></a>
-<span class="sourceLineNo">845</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            + " regions");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      } else {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        return -1;<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      }<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    float getLocalityOfRegion(int region, int server) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      if (regionFinder != null) {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      } else {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        return 0f;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      }<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      if (regionFinder != null) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        int leastLoadedServerIndex = -1;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        int load = Integer.MAX_VALUE;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        for (ServerName sn : topLocalServers) {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            continue;<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          }<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          if (regionsPerServer[index] == null) {<a name="line.872"></a>
+<span class="sourceLineNo">819</span>        if (LOG.isTraceEnabled()) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>          LOG.trace("Lowest locality region server with non zero regions is "<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.821"></a>
+<span class="sourceLineNo">822</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        return lowestLocalityServerIndex;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (regionFinder != null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        float lowestLocality = 1.0f;<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        int lowestLocalityRegionIndex = 0;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>          // No regions on that region server<a name="line.833"></a>
+<span class="sourceLineNo">834</span>          return -1;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>        }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.837"></a>
+<span class="sourceLineNo">838</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.838"></a>
+<span class="sourceLineNo">839</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.840"></a>
+<span class="sourceLineNo">841</span>          if (locality &lt; lowestLocality) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            lowestLocality = locality;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>            lowestLocalityRegionIndex = j;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>          }<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        if (LOG.isTraceEnabled()) {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.847"></a>
+<span class="sourceLineNo">848</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.848"></a>
+<span class="sourceLineNo">849</span>            + " regions");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        }<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      } else {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        return -1;<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      }<a name="line.854"></a>
+<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
+<span class="sourceLineNo">856</span><a name="line.856"></a>
+<span class="sourceLineNo">857</span>    float getLocalityOfRegion(int region, int server) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      if (regionFinder != null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      } else {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        return 0f;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      }<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>      if (regionFinder != null) {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        int leastLoadedServerIndex = -1;<a name="line.869"></a>
+<span class="sourceLineNo">870</span>        int load = Integer.MAX_VALUE;<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        for (ServerName sn : topLocalServers) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.872"></a>
 <span class="sourceLineNo">873</span>            continue;<a name="line.873"></a>
 <span class="sourceLineNo">874</span>          }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>          int tempLoad = regionsPerServer[index].length;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          if (tempLoad &lt;= load) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>            leastLoadedServerIndex = index;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>            load = tempLoad;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>        }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        return leastLoadedServerIndex;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        return -1;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      }<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>    void calculateRegionServerLocalities() {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      if (regionFinder == null) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        return;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            int regionIndex = regionsPerServer[i][j];<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          }<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        } else {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>    @VisibleForTesting<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    protected void setNumRegions(int numRegions) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      this.numRegions = numRegions;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    @VisibleForTesting<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      this.numMovedRegions = numMovedRegions;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        justification="Not important but should be fixed")<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      String desc = "Cluster{" +<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          "servers=[";<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          for(ServerName sn:servers) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>             desc += sn.getHostAndPort() + ", ";<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          }<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          desc +=<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          ", serverIndicesSortedByRegionCount="+<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.927"></a>
-<span class="sourceLineNo">928</span>          ", regionsPerServer=[";<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>          for (int[]r:regionsPerServer) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>            desc += Arrays.toString(r);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>          }<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          desc += "]" +<a name="line.933"></a>
-<span class="sourceLineNo">934</span>          ", numMaxRegionsPerTable=" +<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          ", numRegions=" +<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          numRegions +<a name="line.937"></a>
-<span class="sourceLineNo">938</span>          ", numServers=" +<a name="line.938"></a>
-<span class="sourceLineNo">939</span>          numServers +<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          ", numTables=" +<a name="line.940"></a>
-<span class="sourceLineNo">941</span>          numTables +<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          ", numMovedRegions=" +<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          numMovedRegions +<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          '}';<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      return desc;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span>  }<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>  // slop for regions<a name="line.949"></a>
-<span class="sourceLineNo">950</span>  protected float slop;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  protected Configuration config;<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  protected RackManager rackManager;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  // Regions of these tables are put on the master by default.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static final String TABLES_ON_MASTER =<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    "hbase.balancer.tablesOnMaster";<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  protected ClusterStatus clusterStatus = null;<a name="line.967"></a>
-<span class="sourceLineNo">968</span>  protected ServerName masterServerName;<a name="line.968"></a>
-<span class="sourceLineNo">969</span>  protected MasterServices services;<a name="line.969"></a>
-<span class="sourceLineNo">970</span><a name="line.970"></a>
-<span class="sourceLineNo">971</span>  /**<a name="line.971"></a>
-<span class="sourceLineNo">972</span>   * By default, regions of some small system tables such as meta,<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * want to assign any region to the active master, you need to<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   */<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    if (valueString == null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    valueString = valueString.trim();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return null;<a name="line.984"></a>
+<span class="sourceLineNo">875</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.875"></a>
+<span class="sourceLineNo">876</span>          if (regionsPerServer[index] == null) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>            continue;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          }<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          int tempLoad = regionsPerServer[index].length;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          if (tempLoad &lt;= load) {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>            leastLoadedServerIndex = index;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>            load = tempLoad;<a name="line.882"></a>
+<span class="sourceLineNo">883</span>          }<a name="line.883"></a>
+<span class="sourceLineNo">884</span>        }<a name="line.884"></a>
+<span class="sourceLineNo">885</span>        return leastLoadedServerIndex;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      } else {<a name="line.886"></a>
+<span class="sourceLineNo">887</span>        return -1;<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      }<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
+<span class="sourceLineNo">890</span><a name="line.890"></a>
+<span class="sourceLineNo">891</span>    void calculateRegionServerLocalities() {<a name="line.891"></a>
+<span class="sourceLineNo">892</span>      if (regionFinder == null) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        return;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.897"></a>
+<span class="sourceLineNo">898</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>            int regionIndex = regionsPerServer[i][j];<a name="line.900"></a>
+<span class="sourceLineNo">901</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.901"></a>
+<span class="sourceLineNo">902</span>          }<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        } else {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    @VisibleForTesting<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected void setNumRegions(int numRegions) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      this.numRegions = numRegions;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>    @VisibleForTesting<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      this.numMovedRegions = numMovedRegions;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.920"></a>
+<span class="sourceLineNo">921</span>        justification="Not important but should be fixed")<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    @Override<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public String toString() {<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      String desc = "Cluster{" +<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          "servers=[";<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          for(ServerName sn:servers) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>             desc += sn.getHostAndPort() + ", ";<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          }<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          desc +=<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          ", serverIndicesSortedByRegionCount="+<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.931"></a>
+<span class="sourceLineNo">932</span>          ", regionsPerServer=[";<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>          for (int[]r:regionsPerServer) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>            desc += Arrays.toString(r);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          desc += "]" +<a name="line.937"></a>
+<span class="sourceLineNo">938</span>          ", numMaxRegionsPerTable=" +<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          ", numRegions=" +<a name="line.940"></a>
+<span class="sourceLineNo">941</span>          numRegions +<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          ", numServers=" +<a name="line.942"></a>
+<span class="sourceLineNo">943</span>          numServers +<a name="line.943"></a>
+<span class="sourceLineNo">944</span>          ", numTables=" +<a name="line.944"></a>
+<span class="sourceLineNo">945</span>          numTables +<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          ", numMovedRegions=" +<a name="line.946"></a>
+<span class="sourceLineNo">947</span>          numMovedRegions +<a name="line.947"></a>
+<span class="sourceLineNo">948</span>          '}';<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      return desc;<a name="line.949"></a>
+<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
+<span class="sourceLineNo">952</span><a name="line.952"></a>
+<span class="sourceLineNo">953</span>  // slop for regions<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  protected float slop;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>  protected Configuration config;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  protected RackManager rackManager;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.957"></a>
+<span class="sourceLineNo">958</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.958"></a>
+<span class="sourceLineNo">959</span><a name="line.959"></a>
+<span class="sourceLineNo">960</span>  // Regions of these tables are put on the master by default.<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  public static final String TABLES_ON_MASTER =<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    "hbase.balancer.tablesOnMaster";<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.970"></a>
+<span class="sourceLineNo">971</span>  protected ClusterStatus clusterStatus = null;<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  protected ServerName masterServerName;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>  protected MasterServices services;<a name="line.973"></a>
+<span class="sourceLineNo">974</span><a name="line.974"></a>
+<span class="sourceLineNo">975</span>  /**<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * By default, regions of some small system tables such as meta,<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * want to assign any region to the active master, you need to<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.979"></a>
+<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
+<span class="sourceLineNo">981</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    if (valueString == null) {<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.984"></a>
 <span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    return StringUtils.getStrings(valueString);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
-<span class="sourceLineNo">990</span>   * Check if configured to put any tables on the active master<a name="line.990"></a>
-<span class="sourceLineNo">991</span>   */<a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    String[] tables = getTablesOnMaster(conf);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  public void setConf(Configuration conf) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    setSlop(conf);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    if (slop &lt; 0) slop = 0;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    else if (slop &gt; 1) slop = 1;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span><a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    this.config = conf;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    this.rackManager = new RackManager(getConf());<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    regionFinder.setConf(conf);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  }<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  protected void setSlop(Configuration conf) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1013"></a>
+<span class="sourceLineNo">986</span>    valueString = valueString.trim();<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      return null;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    return StringUtils.getStrings(valueString);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>  }<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>  /**<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * Check if configured to put any tables on the active master<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   */<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    String[] tables = getTablesOnMaster(conf);<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.998"></a>
+<span class="sourceLineNo">999</span>  }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span><a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>  @Override<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  public void setConf(Configuration conf) {<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    setSlop(conf);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    if (slop &lt; 0) slop = 0;<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    else if (slop &gt; 1) slop = 1;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    this.config = conf;<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.rackManager = new RackManager(getConf());<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    regionFinder.setConf(conf);<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  }<a name="line.1014"></a>
 <span class="sourceLineNo">1015</span><a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  /**<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * Check if a region belongs to some small system table.<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   */<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Balance the regions that should be on master regionserver.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    if (masterServerName == null<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (regions != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      for (HRegionInfo region: regions) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        // Find a non-master regionserver to host the region<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>        ServerName dest = keyIt.next();<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (masterServerName.equals(dest)) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          if (!keyIt.hasNext()) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>          dest = keyIt.next();<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        // Move this region away from the master regionserver<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (plans == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>        plans.add(plan);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        // Move this region to the master regionserver<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        if (plans == null) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        plans.add(plan);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    return plans;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>  }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span><a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>  /**<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>   * Assign the regions that should be on master regionserver.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>   */<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      return null;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      for (HRegionInfo region: regions) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        if (shouldBeOnMaster(region)) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          assignments.get(masterServerName).add(region);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    return assignments;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>  }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>  @Override<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public Configuration getConf() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    return this.config;<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  @Override<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    this.clusterStatus = st;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    regionFinder.setClusterStatus(st);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @Override<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    masterServerName = masterServices.getServerName();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    this.services = masterServices;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    this.regionFinder.setServices(masterServices);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  public void setRackManager(RackManager rackManager) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    this.rackManager = rackManager;<a name="line.1115"></a>
+<span class="sourceLineNo">1016</span>  protected void setSlop(Configuration conf) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>  }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span><a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>  /**<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * Check if a region belongs to some small system table.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   */<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  /**<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>   * Balance the regions that should be on master regionserver.<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>   */<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (masterServerName == null<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    if (regions != null) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      for (HRegionInfo region: regions) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        // Find a non-master regionserver to host the region<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>        ServerName dest = keyIt.next();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        if (masterServerName.equals(dest)) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          if (!keyIt.hasNext()) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          dest = keyIt.next();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span><a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>        // Move this region away from the master regionserver<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>        if (plans == null) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>        }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>        plans.add(plan);<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span><a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        // Move this region to the master regionserver<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (plans == null) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        plans.add(plan);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    return plans;<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>  }<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>  /**<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>   * Assign the regions that should be on master regionserver.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>   */<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      return null;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>    }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      for (HRegionInfo region: regions) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (shouldBeOnMaster(region)) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          assignments.get(masterServerName).add(region);<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    return assignments;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  @Override<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  public Configuration getConf() {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    return this.config;<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  @Override<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    this.clusterStatus = st;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    regionFinder.setClusterStatus(st);<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span><a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    masterServerName = masterServices.getServerName();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    this.services = masterServices;<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    this.regionFinder.setServices(masterServices);<a name="line.1115"></a>
 <span class="sourceLineNo">1116</span>  }<a name="line.1116"></a>
 <span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>  protected boolean needsBalance(Cluster c) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      if (LOG.isDebugEnabled()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            + " active regionserver(s)");<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      return false;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    // Check if we even need to do any load balancing<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    // HBASE-3681 check sloppiness first<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      if (LOG.isTraceEnabled()) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          "servers=" + cs.getNumServers() +<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      return false;<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    return true;<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  /**<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * rack hosts replicas of the same region<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   * @param c Cluster information<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   * @return whether region replicas are currently co-located<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return false;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  /**<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>   * simple round-robin assignment.<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * &lt;p&gt;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>   * &lt;p&gt;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   *<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   *<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * @param regions all regions<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * @param servers all servers<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   * @return map of server to the regions it should take, or null if no<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   */<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  @Override<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      List&lt;ServerName&gt; servers) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    metricsBalancer.incrMiscInvocations();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Guarantee not to put other regions on master<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      servers.remove(masterServerName);<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>      if (!masterRegions.isEmpty()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>        for (HRegionInfo region: masterRegions) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          regions.remove(region);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (regions == null || regions.isEmpty()) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return assignments;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (numServers == 0) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      return null;<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      ServerName server = servers.get(0);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      return assignments;<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      servers, assignments);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      boolean assigned = false;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>          if (serverRegions == null) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>            assignments.put(serverName, serverRegions);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          serverRegions.add(region);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cluster.doAssignRegion(region, serverName);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          assigned = true;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          break;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!assigned) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        lastFewRegions.add(region);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    for (HRegionInfo region : lastFewRegions) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      int i = RANDOM.nextInt(numServers);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      ServerName server = servers.get(i);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      List&lt;HRegionInfo&gt; serverRegions = assignments.get(server);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (serverRegions == null) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>        assignments.put(server, serverRegions);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      serverRegions.add(region);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      cluster.doAssignRegion(region, server);<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    return assignments;<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      Collection&lt;HRegionInfo&gt; regions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // replicas of the regions that are passed (for performance).<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    for (ServerName server : servers) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      if (!clusterState.containsKey(server)) {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      rackManager);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * regions in transition that do not have an already known destination.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   *<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * assigned to.<a name="line.1283"></a>
+<span class="sourceLineNo">1118</span>  public void setRackManager(RackManager rackManager) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    this.rackManager = rackManager;<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span><a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  protected boolean needsBalance(Cluster c) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      if (LOG.isDebugEnabled()) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            + " active regionserver(s)");<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    // Check if we even need to do any load balancing<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    // HBASE-3681 check sloppiness first<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (LOG.isTraceEnabled()) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>          "servers=" + cs.getNumServers() +<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      return false;<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    return true;<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>  /**<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   * rack hosts replicas of the same region<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * @param c Cluster information<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>   * @return whether region replicas are currently co-located<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>   */<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    return false;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  /**<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * simple round-robin assignment.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * &lt;p&gt;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   * &lt;p&gt;<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>   *<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>   *<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   * @param regions all regions<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * @param servers all servers<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @return map of server to the regions it should take, or null if no<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      List&lt;ServerName&gt; servers) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    metricsBalancer.incrMiscInvocations();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      // Guarantee not to put other regions on master<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      servers.remove(masterServerName);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      if (!masterRegions.isEmpty()) {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        for (HRegionInfo region: masterRegions) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          regions.remove(region);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regions == null || regions.isEmpty()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return assignments;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    if (numServers == 0) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return null;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      ServerName server = servers.get(0);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      return assignments;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>      servers, assignments);<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span><a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      boolean assigned = false;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          if (serverRegions == null) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>            assignments.put(serverName, serverRegions);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>          serverRegions.add(region);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          cluster.doAssignRegion(region, serverName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          assigned = true;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>          break;<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>     

<TRUNCATED>

[21/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
index 8fc3dbd..efdc708 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
@@ -824,743 +824,747 @@
 <span class="sourceLineNo">816</span>          i++;<a name="line.816"></a>
 <span class="sourceLineNo">817</span>          lowestLocalityServerIndex = serverIndicesSortedByLocality[i];<a name="line.817"></a>
 <span class="sourceLineNo">818</span>        }<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        LOG.debug("Lowest locality region server with non zero regions is "<a name="line.819"></a>
-<span class="sourceLineNo">820</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        return lowestLocalityServerIndex;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      }<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span><a name="line.825"></a>
-<span class="sourceLineNo">826</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      if (regionFinder != null) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        float lowestLocality = 1.0f;<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        int lowestLocalityRegionIndex = 0;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          // No regions on that region server<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          return -1;<a name="line.832"></a>
-<span class="sourceLineNo">833</span>        }<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.836"></a>
-<span class="sourceLineNo">837</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          if (locality &lt; lowestLocality) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>            lowestLocality = locality;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>            lowestLocalityRegionIndex = j;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>          }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.844"></a>
-<span class="sourceLineNo">845</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            + " regions");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      } else {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        return -1;<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      }<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    float getLocalityOfRegion(int region, int server) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      if (regionFinder != null) {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      } else {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        return 0f;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      }<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      if (regionFinder != null) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        int leastLoadedServerIndex = -1;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        int load = Integer.MAX_VALUE;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        for (ServerName sn : topLocalServers) {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            continue;<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          }<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          if (regionsPerServer[index] == null) {<a name="line.872"></a>
+<span class="sourceLineNo">819</span>        if (LOG.isTraceEnabled()) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>          LOG.trace("Lowest locality region server with non zero regions is "<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.821"></a>
+<span class="sourceLineNo">822</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        return lowestLocalityServerIndex;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (regionFinder != null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        float lowestLocality = 1.0f;<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        int lowestLocalityRegionIndex = 0;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>          // No regions on that region server<a name="line.833"></a>
+<span class="sourceLineNo">834</span>          return -1;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>        }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.837"></a>
+<span class="sourceLineNo">838</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.838"></a>
+<span class="sourceLineNo">839</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.840"></a>
+<span class="sourceLineNo">841</span>          if (locality &lt; lowestLocality) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            lowestLocality = locality;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>            lowestLocalityRegionIndex = j;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>          }<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        if (LOG.isTraceEnabled()) {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.847"></a>
+<span class="sourceLineNo">848</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.848"></a>
+<span class="sourceLineNo">849</span>            + " regions");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        }<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      } else {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        return -1;<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      }<a name="line.854"></a>
+<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
+<span class="sourceLineNo">856</span><a name="line.856"></a>
+<span class="sourceLineNo">857</span>    float getLocalityOfRegion(int region, int server) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      if (regionFinder != null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      } else {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        return 0f;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      }<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>      if (regionFinder != null) {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        int leastLoadedServerIndex = -1;<a name="line.869"></a>
+<span class="sourceLineNo">870</span>        int load = Integer.MAX_VALUE;<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        for (ServerName sn : topLocalServers) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.872"></a>
 <span class="sourceLineNo">873</span>            continue;<a name="line.873"></a>
 <span class="sourceLineNo">874</span>          }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>          int tempLoad = regionsPerServer[index].length;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          if (tempLoad &lt;= load) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>            leastLoadedServerIndex = index;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>            load = tempLoad;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>        }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        return leastLoadedServerIndex;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        return -1;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      }<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>    void calculateRegionServerLocalities() {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      if (regionFinder == null) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        return;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            int regionIndex = regionsPerServer[i][j];<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          }<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        } else {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>    @VisibleForTesting<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    protected void setNumRegions(int numRegions) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      this.numRegions = numRegions;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    @VisibleForTesting<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      this.numMovedRegions = numMovedRegions;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        justification="Not important but should be fixed")<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      String desc = "Cluster{" +<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          "servers=[";<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          for(ServerName sn:servers) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>             desc += sn.getHostAndPort() + ", ";<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          }<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          desc +=<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          ", serverIndicesSortedByRegionCount="+<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.927"></a>
-<span class="sourceLineNo">928</span>          ", regionsPerServer=[";<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>          for (int[]r:regionsPerServer) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>            desc += Arrays.toString(r);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>          }<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          desc += "]" +<a name="line.933"></a>
-<span class="sourceLineNo">934</span>          ", numMaxRegionsPerTable=" +<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          ", numRegions=" +<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          numRegions +<a name="line.937"></a>
-<span class="sourceLineNo">938</span>          ", numServers=" +<a name="line.938"></a>
-<span class="sourceLineNo">939</span>          numServers +<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          ", numTables=" +<a name="line.940"></a>
-<span class="sourceLineNo">941</span>          numTables +<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          ", numMovedRegions=" +<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          numMovedRegions +<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          '}';<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      return desc;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span>  }<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>  // slop for regions<a name="line.949"></a>
-<span class="sourceLineNo">950</span>  protected float slop;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  protected Configuration config;<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  protected RackManager rackManager;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  // Regions of these tables are put on the master by default.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static final String TABLES_ON_MASTER =<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    "hbase.balancer.tablesOnMaster";<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  protected ClusterStatus clusterStatus = null;<a name="line.967"></a>
-<span class="sourceLineNo">968</span>  protected ServerName masterServerName;<a name="line.968"></a>
-<span class="sourceLineNo">969</span>  protected MasterServices services;<a name="line.969"></a>
-<span class="sourceLineNo">970</span><a name="line.970"></a>
-<span class="sourceLineNo">971</span>  /**<a name="line.971"></a>
-<span class="sourceLineNo">972</span>   * By default, regions of some small system tables such as meta,<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * want to assign any region to the active master, you need to<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   */<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    if (valueString == null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    valueString = valueString.trim();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return null;<a name="line.984"></a>
+<span class="sourceLineNo">875</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.875"></a>
+<span class="sourceLineNo">876</span>          if (regionsPerServer[index] == null) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>            continue;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          }<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          int tempLoad = regionsPerServer[index].length;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          if (tempLoad &lt;= load) {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>            leastLoadedServerIndex = index;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>            load = tempLoad;<a name="line.882"></a>
+<span class="sourceLineNo">883</span>          }<a name="line.883"></a>
+<span class="sourceLineNo">884</span>        }<a name="line.884"></a>
+<span class="sourceLineNo">885</span>        return leastLoadedServerIndex;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      } else {<a name="line.886"></a>
+<span class="sourceLineNo">887</span>        return -1;<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      }<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
+<span class="sourceLineNo">890</span><a name="line.890"></a>
+<span class="sourceLineNo">891</span>    void calculateRegionServerLocalities() {<a name="line.891"></a>
+<span class="sourceLineNo">892</span>      if (regionFinder == null) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        return;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.897"></a>
+<span class="sourceLineNo">898</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>            int regionIndex = regionsPerServer[i][j];<a name="line.900"></a>
+<span class="sourceLineNo">901</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.901"></a>
+<span class="sourceLineNo">902</span>          }<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        } else {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    @VisibleForTesting<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected void setNumRegions(int numRegions) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      this.numRegions = numRegions;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>    @VisibleForTesting<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      this.numMovedRegions = numMovedRegions;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.920"></a>
+<span class="sourceLineNo">921</span>        justification="Not important but should be fixed")<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    @Override<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public String toString() {<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      String desc = "Cluster{" +<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          "servers=[";<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          for(ServerName sn:servers) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>             desc += sn.getHostAndPort() + ", ";<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          }<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          desc +=<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          ", serverIndicesSortedByRegionCount="+<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.931"></a>
+<span class="sourceLineNo">932</span>          ", regionsPerServer=[";<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>          for (int[]r:regionsPerServer) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>            desc += Arrays.toString(r);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          desc += "]" +<a name="line.937"></a>
+<span class="sourceLineNo">938</span>          ", numMaxRegionsPerTable=" +<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          ", numRegions=" +<a name="line.940"></a>
+<span class="sourceLineNo">941</span>          numRegions +<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          ", numServers=" +<a name="line.942"></a>
+<span class="sourceLineNo">943</span>          numServers +<a name="line.943"></a>
+<span class="sourceLineNo">944</span>          ", numTables=" +<a name="line.944"></a>
+<span class="sourceLineNo">945</span>          numTables +<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          ", numMovedRegions=" +<a name="line.946"></a>
+<span class="sourceLineNo">947</span>          numMovedRegions +<a name="line.947"></a>
+<span class="sourceLineNo">948</span>          '}';<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      return desc;<a name="line.949"></a>
+<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
+<span class="sourceLineNo">952</span><a name="line.952"></a>
+<span class="sourceLineNo">953</span>  // slop for regions<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  protected float slop;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>  protected Configuration config;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  protected RackManager rackManager;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.957"></a>
+<span class="sourceLineNo">958</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.958"></a>
+<span class="sourceLineNo">959</span><a name="line.959"></a>
+<span class="sourceLineNo">960</span>  // Regions of these tables are put on the master by default.<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  public static final String TABLES_ON_MASTER =<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    "hbase.balancer.tablesOnMaster";<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.970"></a>
+<span class="sourceLineNo">971</span>  protected ClusterStatus clusterStatus = null;<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  protected ServerName masterServerName;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>  protected MasterServices services;<a name="line.973"></a>
+<span class="sourceLineNo">974</span><a name="line.974"></a>
+<span class="sourceLineNo">975</span>  /**<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * By default, regions of some small system tables such as meta,<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * want to assign any region to the active master, you need to<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.979"></a>
+<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
+<span class="sourceLineNo">981</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    if (valueString == null) {<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.984"></a>
 <span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    return StringUtils.getStrings(valueString);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
-<span class="sourceLineNo">990</span>   * Check if configured to put any tables on the active master<a name="line.990"></a>
-<span class="sourceLineNo">991</span>   */<a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    String[] tables = getTablesOnMaster(conf);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  public void setConf(Configuration conf) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    setSlop(conf);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    if (slop &lt; 0) slop = 0;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    else if (slop &gt; 1) slop = 1;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span><a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    this.config = conf;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    this.rackManager = new RackManager(getConf());<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    regionFinder.setConf(conf);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  }<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  protected void setSlop(Configuration conf) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1013"></a>
+<span class="sourceLineNo">986</span>    valueString = valueString.trim();<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      return null;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    return StringUtils.getStrings(valueString);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>  }<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>  /**<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * Check if configured to put any tables on the active master<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   */<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    String[] tables = getTablesOnMaster(conf);<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.998"></a>
+<span class="sourceLineNo">999</span>  }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span><a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>  @Override<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  public void setConf(Configuration conf) {<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    setSlop(conf);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    if (slop &lt; 0) slop = 0;<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    else if (slop &gt; 1) slop = 1;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    this.config = conf;<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.rackManager = new RackManager(getConf());<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    regionFinder.setConf(conf);<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  }<a name="line.1014"></a>
 <span class="sourceLineNo">1015</span><a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  /**<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * Check if a region belongs to some small system table.<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   */<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Balance the regions that should be on master regionserver.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    if (masterServerName == null<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (regions != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      for (HRegionInfo region: regions) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        // Find a non-master regionserver to host the region<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>        ServerName dest = keyIt.next();<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (masterServerName.equals(dest)) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          if (!keyIt.hasNext()) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>          dest = keyIt.next();<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        // Move this region away from the master regionserver<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (plans == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>        plans.add(plan);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        // Move this region to the master regionserver<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        if (plans == null) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        plans.add(plan);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    return plans;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>  }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span><a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>  /**<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>   * Assign the regions that should be on master regionserver.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>   */<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      return null;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      for (HRegionInfo region: regions) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        if (shouldBeOnMaster(region)) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          assignments.get(masterServerName).add(region);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    return assignments;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>  }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>  @Override<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public Configuration getConf() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    return this.config;<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  @Override<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    this.clusterStatus = st;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    regionFinder.setClusterStatus(st);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @Override<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    masterServerName = masterServices.getServerName();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    this.services = masterServices;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    this.regionFinder.setServices(masterServices);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  public void setRackManager(RackManager rackManager) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    this.rackManager = rackManager;<a name="line.1115"></a>
+<span class="sourceLineNo">1016</span>  protected void setSlop(Configuration conf) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>  }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span><a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>  /**<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * Check if a region belongs to some small system table.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   */<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  /**<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>   * Balance the regions that should be on master regionserver.<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>   */<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (masterServerName == null<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    if (regions != null) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      for (HRegionInfo region: regions) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        // Find a non-master regionserver to host the region<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>        ServerName dest = keyIt.next();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        if (masterServerName.equals(dest)) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          if (!keyIt.hasNext()) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          dest = keyIt.next();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span><a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>        // Move this region away from the master regionserver<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>        if (plans == null) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>        }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>        plans.add(plan);<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span><a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        // Move this region to the master regionserver<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (plans == null) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        plans.add(plan);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    return plans;<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>  }<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>  /**<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>   * Assign the regions that should be on master regionserver.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>   */<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      return null;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>    }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      for (HRegionInfo region: regions) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (shouldBeOnMaster(region)) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          assignments.get(masterServerName).add(region);<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    return assignments;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  @Override<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  public Configuration getConf() {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    return this.config;<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  @Override<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    this.clusterStatus = st;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    regionFinder.setClusterStatus(st);<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span><a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    masterServerName = masterServices.getServerName();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    this.services = masterServices;<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    this.regionFinder.setServices(masterServices);<a name="line.1115"></a>
 <span class="sourceLineNo">1116</span>  }<a name="line.1116"></a>
 <span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>  protected boolean needsBalance(Cluster c) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      if (LOG.isDebugEnabled()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            + " active regionserver(s)");<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      return false;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    // Check if we even need to do any load balancing<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    // HBASE-3681 check sloppiness first<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      if (LOG.isTraceEnabled()) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          "servers=" + cs.getNumServers() +<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      return false;<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    return true;<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  /**<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * rack hosts replicas of the same region<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   * @param c Cluster information<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   * @return whether region replicas are currently co-located<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return false;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  /**<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>   * simple round-robin assignment.<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * &lt;p&gt;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>   * &lt;p&gt;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   *<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   *<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * @param regions all regions<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * @param servers all servers<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   * @return map of server to the regions it should take, or null if no<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   */<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  @Override<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      List&lt;ServerName&gt; servers) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    metricsBalancer.incrMiscInvocations();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Guarantee not to put other regions on master<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      servers.remove(masterServerName);<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>      if (!masterRegions.isEmpty()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>        for (HRegionInfo region: masterRegions) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          regions.remove(region);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (regions == null || regions.isEmpty()) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return assignments;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (numServers == 0) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      return null;<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      ServerName server = servers.get(0);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      return assignments;<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      servers, assignments);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      boolean assigned = false;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>          if (serverRegions == null) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>            assignments.put(serverName, serverRegions);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          serverRegions.add(region);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cluster.doAssignRegion(region, serverName);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          assigned = true;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          break;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!assigned) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        lastFewRegions.add(region);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    for (HRegionInfo region : lastFewRegions) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      int i = RANDOM.nextInt(numServers);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      ServerName server = servers.get(i);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      List&lt;HRegionInfo&gt; serverRegions = assignments.get(server);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (serverRegions == null) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>        assignments.put(server, serverRegions);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      serverRegions.add(region);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      cluster.doAssignRegion(region, server);<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    return assignments;<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      Collection&lt;HRegionInfo&gt; regions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // replicas of the regions that are passed (for performance).<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    for (ServerName server : servers) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      if (!clusterState.containsKey(server)) {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      rackManager);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * regions in transition that do not have an already known destination.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   *<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * assigned to.<a name="line.1283"></a>
+<span class="sourceLineNo">1118</span>  public void setRackManager(RackManager rackManager) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    this.rackManager = rackManager;<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span><a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  protected boolean needsBalance(Cluster c) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      if (LOG.isDebugEnabled()) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            + " active regionserver(s)");<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    // Check if we even need to do any load balancing<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    // HBASE-3681 check sloppiness first<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (LOG.isTraceEnabled()) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>          "servers=" + cs.getNumServers() +<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      return false;<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    return true;<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>  /**<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   * rack hosts replicas of the same region<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * @param c Cluster information<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>   * @return whether region replicas are currently co-located<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>   */<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    return false;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  /**<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * simple round-robin assignment.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * &lt;p&gt;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   * &lt;p&gt;<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>   *<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>   *<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   * @param regions all regions<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * @param servers all servers<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @return map of server to the regions it should take, or null if no<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      List&lt;ServerName&gt; servers) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    metricsBalancer.incrMiscInvocations();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      // Guarantee not to put other regions on master<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      servers.remove(masterServerName);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      if (!masterRegions.isEmpty()) {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        for (HRegionInfo region: masterRegions) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          regions.remove(region);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regions == null || regions.isEmpty()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return assignments;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    if (numServers == 0) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return null;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      ServerName server = servers.get(0);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      return assignments;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>      servers, assignments);<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span><a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      boolean assigned = false;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          if (serverRegions == null) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>            assignments.put(serverName, serverRegions);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>          serverRegions.add(region);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          cluster.doAssignRegion(region, serverName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          assigned = true;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>          break;<a name="line.1241"

<TRUNCATED>

[43/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html b/devapidocs/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html
index 83b8202..8a459bb 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html
@@ -104,7 +104,7 @@
 <hr>
 <br>
 <pre><a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Private</a>
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.72">AnnotationReadingPriorityFunction</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.71">AnnotationReadingPriorityFunction</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.html" title="interface in org.apache.hadoop.hbase.ipc">PriorityFunction</a></pre>
 <div class="block">Reads special method annotations and table names to figure a priority for use by QoS facility in
@@ -268,7 +268,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.73">LOG</a></pre>
+<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.72">LOG</a></pre>
 </li>
 </ul>
 <a name="SCAN_VTIME_WEIGHT_CONF_KEY">
@@ -277,7 +277,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>SCAN_VTIME_WEIGHT_CONF_KEY</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.77">SCAN_VTIME_WEIGHT_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.76">SCAN_VTIME_WEIGHT_CONF_KEY</a></pre>
 <div class="block">Used to control the scan delay, currently sqrt(numNextCall * weight)</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.AnnotationReadingPriorityFunction.SCAN_VTIME_WEIGHT_CONF_KEY">Constant Field Values</a></dd></dl>
 </li>
@@ -288,7 +288,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>annotatedQos</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.79">annotatedQos</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.78">annotatedQos</a></pre>
 </li>
 </ul>
 <a name="rpcServices">
@@ -297,7 +297,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcServices</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.82">rpcServices</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.81">rpcServices</a></pre>
 </li>
 </ul>
 <a name="knownArgumentClasses">
@@ -306,7 +306,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>knownArgumentClasses</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends com.google.protobuf.Message&gt;[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.84">knownArgumentClasses</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends com.google.protobuf.Message&gt;[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.83">knownArgumentClasses</a></pre>
 </li>
 </ul>
 <a name="argumentToClassMap">
@@ -315,7 +315,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>argumentToClassMap</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends com.google.protobuf.Message&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.97">argumentToClassMap</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends com.google.protobuf.Message&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.96">argumentToClassMap</a></pre>
 </li>
 </ul>
 <a name="methodMap">
@@ -324,7 +324,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>methodMap</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends com.google.protobuf.Message&gt;,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.99">methodMap</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends com.google.protobuf.Message&gt;,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.98">methodMap</a></pre>
 </li>
 </ul>
 <a name="scanVirtualTimeWeight">
@@ -333,7 +333,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>scanVirtualTimeWeight</h4>
-<pre>private final&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.102">scanVirtualTimeWeight</a></pre>
+<pre>private final&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.101">scanVirtualTimeWeight</a></pre>
 </li>
 </ul>
 </li>
@@ -350,7 +350,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>AnnotationReadingPriorityFunction</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.111">AnnotationReadingPriorityFunction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&nbsp;rpcServices)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.110">AnnotationReadingPriorityFunction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&nbsp;rpcServices)</pre>
 <div class="block">Calls <a href="../../../../../org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#AnnotationReadingPriorityFunction(org.apache.hadoop.hbase.regionserver.RSRpcServices,%20java.lang.Class)"><code>AnnotationReadingPriorityFunction(RSRpcServices, Class)</code></a> using the result of
  <code>rpcServices#getClass()</code></div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>rpcServices</code> - The RPC server implementation</dd></dl>
@@ -362,7 +362,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AnnotationReadingPriorityFunction</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.124">AnnotationReadingPriorityFunction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&nbsp;rpcServices,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.123">AnnotationReadingPriorityFunction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&nbsp;rpcServices,
                                  <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&gt;&nbsp;clz)</pre>
 <div class="block">Constructs the priority function given the RPC server implementation and the annotations on the
  methods in the provided <code>clz</code>.</div>
@@ -383,7 +383,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>capitalize</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.159">capitalize</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;s)</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.158">capitalize</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;s)</pre>
 </li>
 </ul>
 <a name="getPriority(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader, com.google.protobuf.Message, org.apache.hadoop.hbase.security.User)">
@@ -392,7 +392,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>getPriority</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.174">getPriority</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.173">getPriority</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
               com.google.protobuf.Message&nbsp;param,
               <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</pre>
 <div class="block">Returns a 'priority' based on the request type.
@@ -413,7 +413,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>getAnnotatedPriority</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.202">getAnnotatedPriority</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.201">getAnnotatedPriority</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header)</pre>
 <div class="block">See if the method has an annotation.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>header</code> - </dd>
 <dt><span class="strong">Returns:</span></dt><dd>Return the priority from the annotation. If there isn't
@@ -426,7 +426,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>getBasePriority</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.216">getBasePriority</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.215">getBasePriority</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
                   com.google.protobuf.Message&nbsp;param)</pre>
 <div class="block">Get the priority for a given request from the header and the param
  This doesn't consider which user is sending the request at all.
@@ -439,7 +439,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockList">
 <li class="blockList">
 <h4>getDeadline</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.281">getDeadline</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.280">getDeadline</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
                com.google.protobuf.Message&nbsp;param)</pre>
 <div class="block">Based on the request content, returns the deadline of the request.</div>
 <dl>
@@ -455,7 +455,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setRegionServer</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.298">setRegionServer</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;hrs)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.html#line.297">setRegionServer</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;hrs)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
index 1520bd0..d66598c 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5525">HRegion.RegionScannerImpl</a>
+<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5526">HRegion.RegionScannerImpl</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallback</a></pre>
 <div class="block">RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).</div>
@@ -411,7 +411,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>storeHeap</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5527">storeHeap</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5528">storeHeap</a></pre>
 </li>
 </ul>
 <a name="joinedHeap">
@@ -420,7 +420,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedHeap</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5530">joinedHeap</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5531">joinedHeap</a></pre>
 <div class="block">Heap of key-values that are not essential for the provided filters and are thus read
  on demand, if on-demand column family loading is enabled.</div>
 </li>
@@ -431,7 +431,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedContinuationRow</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5534">joinedContinuationRow</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5535">joinedContinuationRow</a></pre>
 <div class="block">If the joined heap data gathering is interrupted due to scan limits, this will
  contain the row for which we are populating the values.</div>
 </li>
@@ -442,7 +442,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterClosed</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5535">filterClosed</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5536">filterClosed</a></pre>
 </li>
 </ul>
 <a name="isScan">
@@ -451,7 +451,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isScan</h4>
-<pre>protected final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5537">isScan</a></pre>
+<pre>protected final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5538">isScan</a></pre>
 </li>
 </ul>
 <a name="stopRow">
@@ -460,7 +460,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>stopRow</h4>
-<pre>protected final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5538">stopRow</a></pre>
+<pre>protected final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5539">stopRow</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -469,7 +469,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5539">region</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5540">region</a></pre>
 </li>
 </ul>
 <a name="comparator">
@@ -478,7 +478,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>comparator</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5540">comparator</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5541">comparator</a></pre>
 </li>
 </ul>
 <a name="copyCellsFromSharedMem">
@@ -487,7 +487,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>copyCellsFromSharedMem</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5541">copyCellsFromSharedMem</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5542">copyCellsFromSharedMem</a></pre>
 </li>
 </ul>
 <a name="readPt">
@@ -496,7 +496,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>readPt</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5543">readPt</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5544">readPt</a></pre>
 </li>
 </ul>
 <a name="maxResultSize">
@@ -505,7 +505,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>maxResultSize</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5544">maxResultSize</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5545">maxResultSize</a></pre>
 </li>
 </ul>
 <a name="defaultScannerContext">
@@ -514,7 +514,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>defaultScannerContext</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5545">defaultScannerContext</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5546">defaultScannerContext</a></pre>
 </li>
 </ul>
 <a name="filter">
@@ -523,7 +523,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>filter</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter">FilterWrapper</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5546">filter</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter">FilterWrapper</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5547">filter</a></pre>
 </li>
 </ul>
 </li>
@@ -540,7 +540,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegion.RegionScannerImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5557">HRegion.RegionScannerImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5558">HRegion.RegionScannerImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                          <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;additionalScanners,
                          <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                          boolean&nbsp;copyCellsFromSharedMem)
@@ -563,7 +563,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5549">getRegionInfo</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5550">getRegionInfo</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getRegionInfo()">getRegionInfo</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -576,7 +576,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>setCopyCellsFromSharedMem</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5553">setCopyCellsFromSharedMem</a>(boolean&nbsp;copyCells)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5554">setCopyCellsFromSharedMem</a>(boolean&nbsp;copyCells)</pre>
 </li>
 </ul>
 <a name="initializeKVHeap(java.util.List, java.util.List, org.apache.hadoop.hbase.regionserver.HRegion)">
@@ -585,7 +585,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeKVHeap</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5620">initializeKVHeap</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;scanners,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5622">initializeKVHeap</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;scanners,
                     <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;joinedScanners,
                     <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)
                          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -599,7 +599,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxResultSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5630">getMaxResultSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5632">getMaxResultSize</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getMaxResultSize()">getMaxResultSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -613,7 +613,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getMvccReadPoint</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5635">getMvccReadPoint</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5637">getMvccReadPoint</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getMvccReadPoint()">getMvccReadPoint</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -626,7 +626,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getBatch</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5640">getBatch</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5642">getBatch</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getBatch()">getBatch</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -640,7 +640,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>resetFilters</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5649">resetFilters</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5651">resetFilters</a>()
                      throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Reset both the filter and the old filter.</div>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -653,7 +653,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5656">next</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5658">next</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html#next(java.util.List)">InternalScanner</a></code></strong></div>
 <div class="block">Grab the next row's worth of values.</div>
@@ -672,7 +672,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5663">next</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5665">next</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
            <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html#next(java.util.List,%20org.apache.hadoop.hbase.regionserver.ScannerContext)">InternalScanner</a></code></strong></div>
@@ -692,7 +692,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRaw</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5680">nextRaw</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5682">nextRaw</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#nextRaw(java.util.List)">RegionScanner</a></code></strong></div>
 <div class="block">Grab the next row's worth of values. This is a special internal method to be called from
@@ -714,7 +714,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRaw</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5686">nextRaw</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5688">nextRaw</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
               <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#nextRaw(java.util.List,%20org.apache.hadoop.hbase.regionserver.ScannerContext)">RegionScanner</a></code></strong></div>
@@ -756,7 +756,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>populateFromJoinedHeap</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5741">populateFromJoinedHeap</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5743">populateFromJoinedHeap</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                              <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>true if more cells exist after this batch, false if scanner is done</dd>
@@ -770,7 +770,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>populateResult</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5765">populateResult</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5767">populateResult</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;heap,
                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
                      <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
@@ -789,7 +789,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>moreCellsInRow</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5810">moreCellsInRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextKv,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5812">moreCellsInRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextKv,
                      <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
 <div class="block">Based on the nextKv in the heap, and the current row, decide whether or not there are more
  cells to be read in the heap. If the row of the nextKv in the heap matches the current row
@@ -804,7 +804,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isFilterDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5818">isFilterDone</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5820">isFilterDone</a>()
                      throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -820,7 +820,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isFilterDoneInternal</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5822">isFilterDoneInternal</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5824">isFilterDoneInternal</a>()
                               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -832,7 +832,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextInternal</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5826">nextInternal</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5828">nextInternal</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                    <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -845,7 +845,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementCountOfRowsFilteredMetric</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6025">incrementCountOfRowsFilteredMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6027">incrementCountOfRowsFilteredMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
 </li>
 </ul>
 <a name="incrementCountOfRowsScannedMetric(org.apache.hadoop.hbase.regionserver.ScannerContext)">
@@ -854,7 +854,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementCountOfRowsScannedMetric</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6031">incrementCountOfRowsScannedMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6033">incrementCountOfRowsScannedMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
 </li>
 </ul>
 <a name="joinedHeapMayHaveData(org.apache.hadoop.hbase.Cell)">
@@ -863,7 +863,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedHeapMayHaveData</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6042">joinedHeapMayHaveData</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6044">joinedHeapMayHaveData</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
                                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>currentRowCell</code> - </dd>
 <dt><span class="strong">Returns:</span></dt><dd>true when the joined heap may have data for the current row</dd>
@@ -877,7 +877,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRow</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6069">filterRow</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6071">filterRow</a>()
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This function is to maintain backward compatibility for 0.94 filters. HBASE-6429 combines
  both filterRow & filterRow(<code>List&lt;KeyValue&gt; kvs</code>) functions. While 0.94 code or older,
@@ -894,7 +894,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRowKey</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6076">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;current)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6078">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;current)
                       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -906,7 +906,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRow</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6080">nextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6082">nextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
               <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;curRowCell)
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -919,7 +919,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isStopRow</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6095">isStopRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6097">isStopRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
 </li>
 </ul>
 <a name="close()">
@@ -928,7 +928,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6101">close</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6103">close</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html#close()">InternalScanner</a></code></strong></div>
 <div class="block">Closes the scanner and releases any resources it has allocated</div>
 <dl>
@@ -947,7 +947,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreHeapForTesting</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6115">getStoreHeapForTesting</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6117">getStoreHeapForTesting</a>()</pre>
 </li>
 </ul>
 <a name="reseek(byte[])">
@@ -956,7 +956,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>reseek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6120">reseek</a>(byte[]&nbsp;row)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6122">reseek</a>(byte[]&nbsp;row)
                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#reseek(byte[])">RegionScanner</a></code></strong></div>
 <div class="block">Do a reseek to the required row. Should not be used to seek to a key which
@@ -975,7 +975,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>handleFileNotFound</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6141">handleFileNotFound</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/FileNotFoundException.html?is-external=true" title="class or interface in java.io">FileNotFoundException</a>&nbsp;fnfe)
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6143">handleFileNotFound</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/FileNotFoundException.html?is-external=true" title="class or interface in java.io">FileNotFoundException</a>&nbsp;fnfe)
                                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -987,7 +987,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>abortRegionServer</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6156">abortRegionServer</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6158">abortRegionServer</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)
                         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -999,7 +999,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>shipped</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6164">shipped</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6166">shipped</a>()
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.html#shipped()">Shipper</a></code></strong></div>
 <div class="block">Called after a batch of rows scanned and set to be returned to client. Any in between cleanup
@@ -1017,7 +1017,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6174">run</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6176">run</a>()
          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html#run()">RpcCallback</a></code></strong></div>
 <div class="block">Called at the end of an Rpc Call <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc"><code>RpcCallContext</code></a></div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
index cc15335..5f43f48 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5257">HRegion.RowLockContext</a>
+<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5258">HRegion.RowLockContext</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -219,7 +219,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>row</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5258">row</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5259">row</a></pre>
 </li>
 </ul>
 <a name="readWriteLock">
@@ -228,7 +228,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>readWriteLock</h4>
-<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5259">readWriteLock</a></pre>
+<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5260">readWriteLock</a></pre>
 </li>
 </ul>
 <a name="usable">
@@ -237,7 +237,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>usable</h4>
-<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5260">usable</a></pre>
+<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5261">usable</a></pre>
 </li>
 </ul>
 <a name="count">
@@ -246,7 +246,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>count</h4>
-<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5261">count</a></pre>
+<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5262">count</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -255,7 +255,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>lock</h4>
-<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5262">lock</a></pre>
+<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5263">lock</a></pre>
 </li>
 </ul>
 </li>
@@ -272,7 +272,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegion.RowLockContext</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5264">HRegion.RowLockContext</a>(<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>&nbsp;row)</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5265">HRegion.RowLockContext</a>(<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>&nbsp;row)</pre>
 </li>
 </ul>
 </li>
@@ -289,7 +289,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>newWriteLock</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5268">newWriteLock</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5269">newWriteLock</a>()</pre>
 </li>
 </ul>
 <a name="newReadLock()">
@@ -298,7 +298,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>newReadLock</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5272">newReadLock</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5273">newReadLock</a>()</pre>
 </li>
 </ul>
 <a name="getRowLock(java.util.concurrent.locks.Lock)">
@@ -307,7 +307,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowLock</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5277">getRowLock</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;l)</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5278">getRowLock</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;l)</pre>
 </li>
 </ul>
 <a name="cleanUp()">
@@ -316,7 +316,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanUp</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5288">cleanUp</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5289">cleanUp</a>()</pre>
 </li>
 </ul>
 <a name="toString()">
@@ -325,7 +325,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5302">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5303">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
index c7aa4eb..177d663 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5314">HRegion.RowLockImpl</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5315">HRegion.RowLockImpl</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a></pre>
 <div class="block">Class used to represent a lock on a row.</div>
@@ -212,7 +212,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>context</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5315">context</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5316">context</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -221,7 +221,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>lock</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5316">lock</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5317">lock</a></pre>
 </li>
 </ul>
 </li>
@@ -238,7 +238,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegion.RowLockImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5318">HRegion.RowLockImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;context,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5319">HRegion.RowLockImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;context,
                    <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;lock)</pre>
 </li>
 </ul>
@@ -256,7 +256,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>getLock</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5323">getLock</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5324">getLock</a>()</pre>
 </li>
 </ul>
 <a name="getContext()">
@@ -265,7 +265,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>getContext</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5328">getContext</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5329">getContext</a>()</pre>
 </li>
 </ul>
 <a name="release()">
@@ -274,7 +274,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>release</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5333">release</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5334">release</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html#release()">Region.RowLock</a></code></strong></div>
 <div class="block">Release the given lock.  If there are no remaining locks held by the current thread
  then unlock the row and allow other threads to acquire the lock.</div>
@@ -290,7 +290,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5339">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5340">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>


[22/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
index 8fc3dbd..efdc708 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
@@ -824,743 +824,747 @@
 <span class="sourceLineNo">816</span>          i++;<a name="line.816"></a>
 <span class="sourceLineNo">817</span>          lowestLocalityServerIndex = serverIndicesSortedByLocality[i];<a name="line.817"></a>
 <span class="sourceLineNo">818</span>        }<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        LOG.debug("Lowest locality region server with non zero regions is "<a name="line.819"></a>
-<span class="sourceLineNo">820</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        return lowestLocalityServerIndex;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      }<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    }<a name="line.824"></a>
-<span class="sourceLineNo">825</span><a name="line.825"></a>
-<span class="sourceLineNo">826</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      if (regionFinder != null) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        float lowestLocality = 1.0f;<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        int lowestLocalityRegionIndex = 0;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          // No regions on that region server<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          return -1;<a name="line.832"></a>
-<span class="sourceLineNo">833</span>        }<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.836"></a>
-<span class="sourceLineNo">837</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          if (locality &lt; lowestLocality) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>            lowestLocality = locality;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>            lowestLocalityRegionIndex = j;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>          }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.844"></a>
-<span class="sourceLineNo">845</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            + " regions");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      } else {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        return -1;<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      }<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    }<a name="line.851"></a>
-<span class="sourceLineNo">852</span><a name="line.852"></a>
-<span class="sourceLineNo">853</span>    float getLocalityOfRegion(int region, int server) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      if (regionFinder != null) {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      } else {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        return 0f;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      }<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      if (regionFinder != null) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        int leastLoadedServerIndex = -1;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        int load = Integer.MAX_VALUE;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        for (ServerName sn : topLocalServers) {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            continue;<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          }<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          if (regionsPerServer[index] == null) {<a name="line.872"></a>
+<span class="sourceLineNo">819</span>        if (LOG.isTraceEnabled()) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>          LOG.trace("Lowest locality region server with non zero regions is "<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            + servers[lowestLocalityServerIndex].getHostname() + " with locality "<a name="line.821"></a>
+<span class="sourceLineNo">822</span>            + localityPerServer[lowestLocalityServerIndex]);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        return lowestLocalityServerIndex;<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>    int getLowestLocalityRegionOnServer(int serverIndex) {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (regionFinder != null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        float lowestLocality = 1.0f;<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        int lowestLocalityRegionIndex = 0;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>        if (regionsPerServer[serverIndex].length == 0) {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>          // No regions on that region server<a name="line.833"></a>
+<span class="sourceLineNo">834</span>          return -1;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>        }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        for (int j = 0; j &lt; regionsPerServer[serverIndex].length; j++) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          int regionIndex = regionsPerServer[serverIndex][j];<a name="line.837"></a>
+<span class="sourceLineNo">838</span>          HDFSBlocksDistribution distribution = regionFinder<a name="line.838"></a>
+<span class="sourceLineNo">839</span>              .getBlockDistribution(regions[regionIndex]);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          float locality = distribution.getBlockLocalityIndex(servers[serverIndex].getHostname());<a name="line.840"></a>
+<span class="sourceLineNo">841</span>          if (locality &lt; lowestLocality) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            lowestLocality = locality;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>            lowestLocalityRegionIndex = j;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>          }<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>        if (LOG.isTraceEnabled()) {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          LOG.debug(" Lowest locality region index is " + lowestLocalityRegionIndex<a name="line.847"></a>
+<span class="sourceLineNo">848</span>            + " and its region server contains " + regionsPerServer[serverIndex].length<a name="line.848"></a>
+<span class="sourceLineNo">849</span>            + " regions");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        }<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        return regionsPerServer[serverIndex][lowestLocalityRegionIndex];<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      } else {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        return -1;<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      }<a name="line.854"></a>
+<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
+<span class="sourceLineNo">856</span><a name="line.856"></a>
+<span class="sourceLineNo">857</span>    float getLocalityOfRegion(int region, int server) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>      if (regionFinder != null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        HDFSBlocksDistribution distribution = regionFinder.getBlockDistribution(regions[region]);<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        return distribution.getBlockLocalityIndex(servers[server].getHostname());<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      } else {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        return 0f;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      }<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    }<a name="line.864"></a>
+<span class="sourceLineNo">865</span><a name="line.865"></a>
+<span class="sourceLineNo">866</span>    int getLeastLoadedTopServerForRegion(int region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>      if (regionFinder != null) {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        List&lt;ServerName&gt; topLocalServers = regionFinder.getTopBlockLocations(regions[region]);<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        int leastLoadedServerIndex = -1;<a name="line.869"></a>
+<span class="sourceLineNo">870</span>        int load = Integer.MAX_VALUE;<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        for (ServerName sn : topLocalServers) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          if (!serversToIndex.containsKey(sn.getHostAndPort())) {<a name="line.872"></a>
 <span class="sourceLineNo">873</span>            continue;<a name="line.873"></a>
 <span class="sourceLineNo">874</span>          }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>          int tempLoad = regionsPerServer[index].length;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          if (tempLoad &lt;= load) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>            leastLoadedServerIndex = index;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>            load = tempLoad;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>        }<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        return leastLoadedServerIndex;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        return -1;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      }<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>    void calculateRegionServerLocalities() {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      if (regionFinder == null) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        return;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            int regionIndex = regionsPerServer[i][j];<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          }<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        } else {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>    @VisibleForTesting<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    protected void setNumRegions(int numRegions) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      this.numRegions = numRegions;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    @VisibleForTesting<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      this.numMovedRegions = numMovedRegions;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        justification="Not important but should be fixed")<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    @Override<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    public String toString() {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      String desc = "Cluster{" +<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          "servers=[";<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          for(ServerName sn:servers) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>             desc += sn.getHostAndPort() + ", ";<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          }<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          desc +=<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          ", serverIndicesSortedByRegionCount="+<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.927"></a>
-<span class="sourceLineNo">928</span>          ", regionsPerServer=[";<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>          for (int[]r:regionsPerServer) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>            desc += Arrays.toString(r);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>          }<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          desc += "]" +<a name="line.933"></a>
-<span class="sourceLineNo">934</span>          ", numMaxRegionsPerTable=" +<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          ", numRegions=" +<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          numRegions +<a name="line.937"></a>
-<span class="sourceLineNo">938</span>          ", numServers=" +<a name="line.938"></a>
-<span class="sourceLineNo">939</span>          numServers +<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          ", numTables=" +<a name="line.940"></a>
-<span class="sourceLineNo">941</span>          numTables +<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          ", numMovedRegions=" +<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          numMovedRegions +<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          '}';<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      return desc;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span>  }<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>  // slop for regions<a name="line.949"></a>
-<span class="sourceLineNo">950</span>  protected float slop;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  protected Configuration config;<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  protected RackManager rackManager;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  // Regions of these tables are put on the master by default.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static final String TABLES_ON_MASTER =<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    "hbase.balancer.tablesOnMaster";<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  protected ClusterStatus clusterStatus = null;<a name="line.967"></a>
-<span class="sourceLineNo">968</span>  protected ServerName masterServerName;<a name="line.968"></a>
-<span class="sourceLineNo">969</span>  protected MasterServices services;<a name="line.969"></a>
-<span class="sourceLineNo">970</span><a name="line.970"></a>
-<span class="sourceLineNo">971</span>  /**<a name="line.971"></a>
-<span class="sourceLineNo">972</span>   * By default, regions of some small system tables such as meta,<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * want to assign any region to the active master, you need to<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   */<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    if (valueString == null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    valueString = valueString.trim();<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return null;<a name="line.984"></a>
+<span class="sourceLineNo">875</span>          int index = serversToIndex.get(sn.getHostAndPort());<a name="line.875"></a>
+<span class="sourceLineNo">876</span>          if (regionsPerServer[index] == null) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>            continue;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          }<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          int tempLoad = regionsPerServer[index].length;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          if (tempLoad &lt;= load) {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>            leastLoadedServerIndex = index;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>            load = tempLoad;<a name="line.882"></a>
+<span class="sourceLineNo">883</span>          }<a name="line.883"></a>
+<span class="sourceLineNo">884</span>        }<a name="line.884"></a>
+<span class="sourceLineNo">885</span>        return leastLoadedServerIndex;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      } else {<a name="line.886"></a>
+<span class="sourceLineNo">887</span>        return -1;<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      }<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
+<span class="sourceLineNo">890</span><a name="line.890"></a>
+<span class="sourceLineNo">891</span>    void calculateRegionServerLocalities() {<a name="line.891"></a>
+<span class="sourceLineNo">892</span>      if (regionFinder == null) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>        LOG.warn("Region location finder found null, skipping locality calculations.");<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        return;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      for (int i = 0; i &lt; regionsPerServer.length; i++) {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>        HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();<a name="line.897"></a>
+<span class="sourceLineNo">898</span>        if (regionsPerServer[i].length &gt; 0) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          for (int j = 0; j &lt; regionsPerServer[i].length; j++) {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>            int regionIndex = regionsPerServer[i][j];<a name="line.900"></a>
+<span class="sourceLineNo">901</span>            distribution.add(regionFinder.getBlockDistribution(regions[regionIndex]));<a name="line.901"></a>
+<span class="sourceLineNo">902</span>          }<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        } else {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>          LOG.debug("Server " + servers[i].getHostname() + " had 0 regions.");<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>        localityPerServer[i] = distribution.getBlockLocalityIndex(servers[i].getHostname());<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    @VisibleForTesting<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected void setNumRegions(int numRegions) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      this.numRegions = numRegions;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>    @VisibleForTesting<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    protected void setNumMovedRegions(int numMovedRegions) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      this.numMovedRegions = numMovedRegions;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SBSC_USE_STRINGBUFFER_CONCATENATION",<a name="line.920"></a>
+<span class="sourceLineNo">921</span>        justification="Not important but should be fixed")<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    @Override<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public String toString() {<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      String desc = "Cluster{" +<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          "servers=[";<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          for(ServerName sn:servers) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>             desc += sn.getHostAndPort() + ", ";<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          }<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          desc +=<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          ", serverIndicesSortedByRegionCount="+<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          Arrays.toString(serverIndicesSortedByRegionCount) +<a name="line.931"></a>
+<span class="sourceLineNo">932</span>          ", regionsPerServer=[";<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>          for (int[]r:regionsPerServer) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>            desc += Arrays.toString(r);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          desc += "]" +<a name="line.937"></a>
+<span class="sourceLineNo">938</span>          ", numMaxRegionsPerTable=" +<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          Arrays.toString(numMaxRegionsPerTable) +<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          ", numRegions=" +<a name="line.940"></a>
+<span class="sourceLineNo">941</span>          numRegions +<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          ", numServers=" +<a name="line.942"></a>
+<span class="sourceLineNo">943</span>          numServers +<a name="line.943"></a>
+<span class="sourceLineNo">944</span>          ", numTables=" +<a name="line.944"></a>
+<span class="sourceLineNo">945</span>          numTables +<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          ", numMovedRegions=" +<a name="line.946"></a>
+<span class="sourceLineNo">947</span>          numMovedRegions +<a name="line.947"></a>
+<span class="sourceLineNo">948</span>          '}';<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      return desc;<a name="line.949"></a>
+<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
+<span class="sourceLineNo">952</span><a name="line.952"></a>
+<span class="sourceLineNo">953</span>  // slop for regions<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  protected float slop;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>  protected Configuration config;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  protected RackManager rackManager;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.957"></a>
+<span class="sourceLineNo">958</span>  private static final Log LOG = LogFactory.getLog(BaseLoadBalancer.class);<a name="line.958"></a>
+<span class="sourceLineNo">959</span><a name="line.959"></a>
+<span class="sourceLineNo">960</span>  // Regions of these tables are put on the master by default.<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  private static final String[] DEFAULT_TABLES_ON_MASTER =<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    new String[] {AccessControlLists.ACL_TABLE_NAME.getNameAsString(),<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      TableName.NAMESPACE_TABLE_NAME.getNameAsString(),<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      TableName.META_TABLE_NAME.getNameAsString()};<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  public static final String TABLES_ON_MASTER =<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    "hbase.balancer.tablesOnMaster";<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>  protected final Set&lt;String&gt; tablesOnMaster = new HashSet&lt;String&gt;();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>  protected MetricsBalancer metricsBalancer = null;<a name="line.970"></a>
+<span class="sourceLineNo">971</span>  protected ClusterStatus clusterStatus = null;<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  protected ServerName masterServerName;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>  protected MasterServices services;<a name="line.973"></a>
+<span class="sourceLineNo">974</span><a name="line.974"></a>
+<span class="sourceLineNo">975</span>  /**<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * By default, regions of some small system tables such as meta,<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * namespace, and acl are assigned to the active master. If you don't<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * want to assign any region to the active master, you need to<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   * configure "hbase.balancer.tablesOnMaster" to "none".<a name="line.979"></a>
+<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
+<span class="sourceLineNo">981</span>  protected static String[] getTablesOnMaster(Configuration conf) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    String valueString = conf.get(TABLES_ON_MASTER);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    if (valueString == null) {<a name="line.983"></a>
+<span class="sourceLineNo">984</span>      return DEFAULT_TABLES_ON_MASTER;<a name="line.984"></a>
 <span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    return StringUtils.getStrings(valueString);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
-<span class="sourceLineNo">990</span>   * Check if configured to put any tables on the active master<a name="line.990"></a>
-<span class="sourceLineNo">991</span>   */<a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    String[] tables = getTablesOnMaster(conf);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  @Override<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  public void setConf(Configuration conf) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    setSlop(conf);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    if (slop &lt; 0) slop = 0;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    else if (slop &gt; 1) slop = 1;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span><a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    this.config = conf;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    this.rackManager = new RackManager(getConf());<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    regionFinder.setConf(conf);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  }<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  protected void setSlop(Configuration conf) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1013"></a>
+<span class="sourceLineNo">986</span>    valueString = valueString.trim();<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    if (valueString.equalsIgnoreCase("none")) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      return null;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    return StringUtils.getStrings(valueString);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>  }<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>  /**<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * Check if configured to put any tables on the active master<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   */<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  public static boolean tablesOnMaster(Configuration conf) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    String[] tables = getTablesOnMaster(conf);<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    return tables != null &amp;&amp; tables.length &gt; 0;<a name="line.998"></a>
+<span class="sourceLineNo">999</span>  }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span><a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>  @Override<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>  public void setConf(Configuration conf) {<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    setSlop(conf);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    if (slop &lt; 0) slop = 0;<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    else if (slop &gt; 1) slop = 1;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span><a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    this.config = conf;<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    String[] tables = getTablesOnMaster(conf);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    if (tables != null &amp;&amp; tables.length &gt; 0) {<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      Collections.addAll(tablesOnMaster, tables);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    this.rackManager = new RackManager(getConf());<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    regionFinder.setConf(conf);<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>  }<a name="line.1014"></a>
 <span class="sourceLineNo">1015</span><a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  /**<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * Check if a region belongs to some small system table.<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   */<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>  }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * Balance the regions that should be on master regionserver.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   */<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    if (masterServerName == null<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    if (regions != null) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      for (HRegionInfo region: regions) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        // Find a non-master regionserver to host the region<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>        ServerName dest = keyIt.next();<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (masterServerName.equals(dest)) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          if (!keyIt.hasNext()) {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>          dest = keyIt.next();<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        // Move this region away from the master regionserver<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        if (plans == null) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>        plans.add(plan);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        // Move this region to the master regionserver<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        if (plans == null) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        plans.add(plan);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    return plans;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>  }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span><a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>  /**<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>   * Assign the regions that should be on master regionserver.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>   */<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      return null;<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      for (HRegionInfo region: regions) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        if (shouldBeOnMaster(region)) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          assignments.get(masterServerName).add(region);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    return assignments;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>  }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>  @Override<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  public Configuration getConf() {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    return this.config;<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>  }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  @Override<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    this.clusterStatus = st;<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    regionFinder.setClusterStatus(st);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @Override<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    masterServerName = masterServices.getServerName();<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    this.services = masterServices;<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    this.regionFinder.setServices(masterServices);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  public void setRackManager(RackManager rackManager) {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    this.rackManager = rackManager;<a name="line.1115"></a>
+<span class="sourceLineNo">1016</span>  protected void setSlop(Configuration conf) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    this.slop = conf.getFloat("hbase.regions.slop", (float) 0.2);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>  }<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span><a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>  /**<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>   * Check if a region belongs to some small system table.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>   * If so, the primary replica may be expected to be put on the master regionserver.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>   */<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  public boolean shouldBeOnMaster(HRegionInfo region) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    return tablesOnMaster.contains(region.getTable().getNameAsString())<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>        &amp;&amp; region.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID;<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  /**<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>   * Balance the regions that should be on master regionserver.<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>   */<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  protected List&lt;RegionPlan&gt; balanceMasterRegions(<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    if (masterServerName == null<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        || clusterMap == null || clusterMap.size() &lt;= 1) return null;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    List&lt;RegionPlan&gt; plans = null;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    List&lt;HRegionInfo&gt; regions = clusterMap.get(masterServerName);<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    if (regions != null) {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      Iterator&lt;ServerName&gt; keyIt = null;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>      for (HRegionInfo region: regions) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>        if (shouldBeOnMaster(region)) continue;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span><a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>        // Find a non-master regionserver to host the region<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        if (keyIt == null || !keyIt.hasNext()) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          keyIt = clusterMap.keySet().iterator();<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        }<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>        ServerName dest = keyIt.next();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        if (masterServerName.equals(dest)) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          if (!keyIt.hasNext()) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>            keyIt = clusterMap.keySet().iterator();<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          dest = keyIt.next();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span><a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>        // Move this region away from the master regionserver<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>        RegionPlan plan = new RegionPlan(region, masterServerName, dest);<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>        if (plans == null) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>        }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>        plans.add(plan);<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; server: clusterMap.entrySet()) {<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      if (masterServerName.equals(server.getKey())) continue;<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      for (HRegionInfo region: server.getValue()) {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        if (!shouldBeOnMaster(region)) continue;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span><a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        // Move this region to the master regionserver<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        RegionPlan plan = new RegionPlan(region, server.getKey(), masterServerName);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>        if (plans == null) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          plans = new ArrayList&lt;RegionPlan&gt;();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        }<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        plans.add(plan);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    return plans;<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>  }<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>  /**<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>   * Assign the regions that should be on master regionserver.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>   */<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignMasterRegions(<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      Collection&lt;HRegionInfo&gt; regions, List&lt;ServerName&gt; servers) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    if (servers == null || regions == null || regions.isEmpty()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      return null;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>    }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      = new TreeMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>    if (masterServerName != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      assignments.put(masterServerName, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      for (HRegionInfo region: regions) {<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        if (shouldBeOnMaster(region)) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          assignments.get(masterServerName).add(region);<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>        }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    return assignments;<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  @Override<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  public Configuration getConf() {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    return this.config;<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>  }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span><a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  @Override<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>  public synchronized void setClusterStatus(ClusterStatus st) {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    this.clusterStatus = st;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    regionFinder.setClusterStatus(st);<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span><a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    masterServerName = masterServices.getServerName();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    this.services = masterServices;<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>    this.regionFinder.setServices(masterServices);<a name="line.1115"></a>
 <span class="sourceLineNo">1116</span>  }<a name="line.1116"></a>
 <span class="sourceLineNo">1117</span><a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>  protected boolean needsBalance(Cluster c) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      if (LOG.isDebugEnabled()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            + " active regionserver(s)");<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>      return false;<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    // Check if we even need to do any load balancing<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    // HBASE-3681 check sloppiness first<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      if (LOG.isTraceEnabled()) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          "servers=" + cs.getNumServers() +<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      return false;<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>    return true;<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  /**<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>   * rack hosts replicas of the same region<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>   * @param c Cluster information<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   * @return whether region replicas are currently co-located<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    return false;<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>  }<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>  /**<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>   * simple round-robin assignment.<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>   * &lt;p&gt;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>   * &lt;p&gt;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   *<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>   *<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * @param regions all regions<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * @param servers all servers<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   * @return map of server to the regions it should take, or null if no<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>   */<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>  @Override<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      List&lt;ServerName&gt; servers) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    metricsBalancer.incrMiscInvocations();<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Guarantee not to put other regions on master<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      servers.remove(masterServerName);<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>      if (!masterRegions.isEmpty()) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>        for (HRegionInfo region: masterRegions) {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>          regions.remove(region);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>        }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    if (regions == null || regions.isEmpty()) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      return assignments;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    if (numServers == 0) {<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      return null;<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span><a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      ServerName server = servers.get(0);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>      return assignments;<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      servers, assignments);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>      boolean assigned = false;<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>          if (serverRegions == null) {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>            assignments.put(serverName, serverRegions);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>          }<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          serverRegions.add(region);<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          cluster.doAssignRegion(region, serverName);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          assigned = true;<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          break;<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        }<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>      }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      if (!assigned) {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>        lastFewRegions.add(region);<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    // just sprinkle the rest of the regions on random regionservers. The balanceCluster will<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    // make it optimal later. we can end up with this if numReplicas &gt; numServers.<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    for (HRegionInfo region : lastFewRegions) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      int i = RANDOM.nextInt(numServers);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      ServerName server = servers.get(i);<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      List&lt;HRegionInfo&gt; serverRegions = assignments.get(server);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (serverRegions == null) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>        assignments.put(server, serverRegions);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      serverRegions.add(region);<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      cluster.doAssignRegion(region, server);<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    return assignments;<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span><a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>  protected Cluster createCluster(List&lt;ServerName&gt; servers,<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      Collection&lt;HRegionInfo&gt; regions) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    // Get the snapshot of the current assignments for the regions in question, and then create<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // a cluster out of it. Note that we might have replicas already assigned to some servers<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    // earlier. So we want to get the snapshot to see those assignments, but this will only contain<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // replicas of the regions that are passed (for performance).<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState = getRegionAssignmentsByServer(regions);<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    for (ServerName server : servers) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      if (!clusterState.containsKey(server)) {<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>        clusterState.put(server, EMPTY_REGION_LIST);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      }<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    }<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    return new Cluster(regions, clusterState, null, this.regionFinder,<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      rackManager);<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>  }<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span><a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>  /**<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>   * regions in transition that do not have an already known destination.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   *<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * assigned to.<a name="line.1283"></a>
+<span class="sourceLineNo">1118</span>  public void setRackManager(RackManager rackManager) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    this.rackManager = rackManager;<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span><a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  protected boolean needsBalance(Cluster c) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    ClusterLoadState cs = new ClusterLoadState(c.clusterState);<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    if (cs.getNumServers() &lt; MIN_SERVER_BALANCE) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      if (LOG.isDebugEnabled()) {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>        LOG.debug("Not running balancer because only " + cs.getNumServers()<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            + " active regionserver(s)");<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>      }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    if(areSomeRegionReplicasColocated(c)) return true;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    // Check if we even need to do any load balancing<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    // HBASE-3681 check sloppiness first<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    float average = cs.getLoadAverage(); // for logging<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    int floor = (int) Math.floor(average * (1 - slop));<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    int ceiling = (int) Math.ceil(average * (1 + slop));<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    if (!(cs.getMaxLoad() &gt; ceiling || cs.getMinLoad() &lt; floor)) {<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      if (LOG.isTraceEnabled()) {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>        // If nothing to balance, then don't say anything unless trace-level logging.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        LOG.trace("Skipping load balancing because balanced cluster; " +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>          "servers=" + cs.getNumServers() +<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>          " regions=" + cs.getNumRegions() + " average=" + average +<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>          " mostloaded=" + serversByLoad.lastKey().getLoad() +<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>          " leastloaded=" + serversByLoad.firstKey().getLoad());<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      }<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>      return false;<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    return true;<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>  /**<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>   * Subclasses should implement this to return true if the cluster has nodes that hosts<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>   * multiple replicas for the same region, or, if there are multiple racks and the same<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>   * rack hosts replicas of the same region<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * @param c Cluster information<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>   * @return whether region replicas are currently co-located<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>   */<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>  protected boolean areSomeRegionReplicasColocated(Cluster c) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    return false;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>  }<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span><a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>  /**<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   * Generates a bulk assignment plan to be used on cluster startup using a<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   * simple round-robin assignment.<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>   * &lt;p&gt;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>   * Takes a list of all the regions and all the servers in the cluster and<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>   * returns a map of each server to the regions that it should be assigned.<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   * &lt;p&gt;<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>   * Currently implemented as a round-robin assignment. Same invariant as load<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   * balancing, all servers holding floor(avg) or ceiling(avg).<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>   *<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>   * TODO: Use block locations from HDFS to place regions with their blocks<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>   *<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>   * @param regions all regions<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>   * @param servers all servers<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>   * @return map of server to the regions it should take, or null if no<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   *         assignment is possible (ie. no regions or no servers)<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>  @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      List&lt;ServerName&gt; servers) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    metricsBalancer.incrMiscInvocations();<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments = assignMasterRegions(regions, servers);<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>      // Guarantee not to put other regions on master<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>      servers.remove(masterServerName);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      if (!masterRegions.isEmpty()) {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        regions = new ArrayList&lt;HRegionInfo&gt;(regions);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>        for (HRegionInfo region: masterRegions) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>          regions.remove(region);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    if (regions == null || regions.isEmpty()) {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>      return assignments;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    if (numServers == 0) {<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>      LOG.warn("Wanted to do round robin assignment but no servers to assign to");<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      return null;<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span><a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    // TODO: instead of retainAssignment() and roundRobinAssignment(), we should just run the<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    // normal LB.balancerCluster() with unassignedRegions. We only need to have a candidate<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    // generator for AssignRegionAction. The LB will ensure the regions are mostly local<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    // and balanced. This should also run fast with fewer number of iterations.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span><a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      ServerName server = servers.get(0);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions));<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      return assignments;<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    }<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    List&lt;HRegionInfo&gt; unassignedRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span><a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    roundRobinAssignment(cluster, regions, unassignedRegions,<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>      servers, assignments);<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span><a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    List&lt;HRegionInfo&gt; lastFewRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    // assign the remaining by going through the list and try to assign to servers one-by-one<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    int serverIdx = RANDOM.nextInt(numServers);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    for (HRegionInfo region : unassignedRegions) {<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>      boolean assigned = false;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      for (int j = 0; j &lt; numServers; j++) { // try all servers one by one<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>        ServerName serverName = servers.get((j + serverIdx) % numServers);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        if (!cluster.wouldLowerAvailability(region, serverName)) {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          List&lt;HRegionInfo&gt; serverRegions = assignments.get(serverName);<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          if (serverRegions == null) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            serverRegions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>            assignments.put(serverName, serverRegions);<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          }<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>          serverRegions.add(region);<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          cluster.doAssignRegion(region, serverName);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          serverIdx = (j + serverIdx + 1) % numServers; //remain from next server<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          assigned = true;<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>          break;<a name="

<TRUNCATED>

[28/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html
index 704e192..e5d9af6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Responder.html
@@ -92,2526 +92,2571 @@
 <span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.conf.ConfigurationObserver;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.exceptions.RegionMovedException;<a name="line.85"></a>
 <span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.User;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.io.BytesWritable;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.io.IntWritable;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.io.Writable;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.io.WritableUtils;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.util.StringUtils;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.htrace.TraceInfo;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import com.google.protobuf.BlockingService;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import com.google.protobuf.CodedInputStream;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import com.google.protobuf.Message;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import com.google.protobuf.ServiceException;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.140"></a>
-<span class="sourceLineNo">141</span> *<a name="line.141"></a>
-<span class="sourceLineNo">142</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.142"></a>
-<span class="sourceLineNo">143</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.143"></a>
-<span class="sourceLineNo">144</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.144"></a>
-<span class="sourceLineNo">145</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.145"></a>
-<span class="sourceLineNo">146</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.146"></a>
-<span class="sourceLineNo">147</span> * and loops till done.<a name="line.147"></a>
-<span class="sourceLineNo">148</span> *<a name="line.148"></a>
-<span class="sourceLineNo">149</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.149"></a>
-<span class="sourceLineNo">150</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.150"></a>
-<span class="sourceLineNo">151</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.151"></a>
-<span class="sourceLineNo">152</span> * and keep taking while the server is up.<a name="line.152"></a>
-<span class="sourceLineNo">153</span> *<a name="line.153"></a>
-<span class="sourceLineNo">154</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.154"></a>
-<span class="sourceLineNo">155</span> * queue for Responder to pull from and return result to client.<a name="line.155"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferInputStream;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.User;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.io.BytesWritable;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.io.IntWritable;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.io.Writable;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.io.WritableUtils;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.util.StringUtils;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.htrace.TraceInfo;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import com.google.protobuf.BlockingService;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import com.google.protobuf.CodedInputStream;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import com.google.protobuf.CodedOutputStream;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import com.google.protobuf.Message;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import com.google.protobuf.ServiceException;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.143"></a>
+<span class="sourceLineNo">144</span> *<a name="line.144"></a>
+<span class="sourceLineNo">145</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.145"></a>
+<span class="sourceLineNo">146</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.146"></a>
+<span class="sourceLineNo">147</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.147"></a>
+<span class="sourceLineNo">148</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.148"></a>
+<span class="sourceLineNo">149</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.149"></a>
+<span class="sourceLineNo">150</span> * and loops till done.<a name="line.150"></a>
+<span class="sourceLineNo">151</span> *<a name="line.151"></a>
+<span class="sourceLineNo">152</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.152"></a>
+<span class="sourceLineNo">153</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.153"></a>
+<span class="sourceLineNo">154</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.154"></a>
+<span class="sourceLineNo">155</span> * and keep taking while the server is up.<a name="line.155"></a>
 <span class="sourceLineNo">156</span> *<a name="line.156"></a>
-<span class="sourceLineNo">157</span> * @see RpcClientImpl<a name="line.157"></a>
-<span class="sourceLineNo">158</span> */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.159"></a>
-<span class="sourceLineNo">160</span>@InterfaceStability.Evolving<a name="line.160"></a>
-<span class="sourceLineNo">161</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      = new CallQueueTooBigException();<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final boolean authorize;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private boolean isSecurityEnabled;<a name="line.168"></a>
+<span class="sourceLineNo">157</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.157"></a>
+<span class="sourceLineNo">158</span> * queue for Responder to pull from and return result to client.<a name="line.158"></a>
+<span class="sourceLineNo">159</span> *<a name="line.159"></a>
+<span class="sourceLineNo">160</span> * @see RpcClientImpl<a name="line.160"></a>
+<span class="sourceLineNo">161</span> */<a name="line.161"></a>
+<span class="sourceLineNo">162</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.162"></a>
+<span class="sourceLineNo">163</span>@InterfaceStability.Evolving<a name="line.163"></a>
+<span class="sourceLineNo">164</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      = new CallQueueTooBigException();<a name="line.168"></a>
 <span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public static final byte CURRENT_VERSION = 0;<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<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>   * How many calls/handler are allowed in the queue.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * The maximum size that we can hold in the RPC queue<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private final IPCUtil ipcUtil;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    Server.class.getName());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  protected ServiceAuthorizationManager authManager;<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * after the call returns.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   */<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  protected final InetSocketAddress bindAddress;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  protected int port;                             // port we listen on<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private int readThreads;                        // number of read threads<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.210"></a>
-<span class="sourceLineNo">211</span>                                                  // which a client may be<a name="line.211"></a>
-<span class="sourceLineNo">212</span>                                                  // disconnected<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.213"></a>
-<span class="sourceLineNo">214</span>                                                  // connections after which we<a name="line.214"></a>
-<span class="sourceLineNo">215</span>                                                  // will start cleaning up idle<a name="line.215"></a>
-<span class="sourceLineNo">216</span>                                                  // connections<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.217"></a>
-<span class="sourceLineNo">218</span>                                                  // connections to nuke<a name="line.218"></a>
-<span class="sourceLineNo">219</span>                                                  // during a cleanup<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  protected MetricsHBaseServer metrics;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  protected final Configuration conf;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private int maxQueueSize;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  protected int socketSendBufferSize;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  volatile boolean running = true;<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>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * for business by the call to {@link #start()}.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  volatile boolean started = false;<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>   * This is a running count of the size of all outstanding calls by size.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  protected final Counter callQueueSize = new Counter();<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  //maintain a list<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  //of client connections<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private Listener listener = null;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  protected Responder responder = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  protected int numConnections = 0;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.261"></a>
+<span class="sourceLineNo">170</span>  private final boolean authorize;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private boolean isSecurityEnabled;<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public static final byte CURRENT_VERSION = 0;<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * How many calls/handler are allowed in the queue.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * The maximum size that we can hold in the RPC queue<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private final IPCUtil ipcUtil;<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    Server.class.getName());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  protected ServiceAuthorizationManager authManager;<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * after the call returns.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   */<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected final InetSocketAddress bindAddress;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected int port;                             // port we listen on<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  private int readThreads;                        // number of read threads<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.213"></a>
+<span class="sourceLineNo">214</span>                                                  // which a client may be<a name="line.214"></a>
+<span class="sourceLineNo">215</span>                                                  // disconnected<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.216"></a>
+<span class="sourceLineNo">217</span>                                                  // connections after which we<a name="line.217"></a>
+<span class="sourceLineNo">218</span>                                                  // will start cleaning up idle<a name="line.218"></a>
+<span class="sourceLineNo">219</span>                                                  // connections<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.220"></a>
+<span class="sourceLineNo">221</span>                                                  // connections to nuke<a name="line.221"></a>
+<span class="sourceLineNo">222</span>                                                  // during a cleanup<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected MetricsHBaseServer metrics;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  protected final Configuration conf;<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private int maxQueueSize;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  protected int socketSendBufferSize;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  volatile boolean running = true;<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * for business by the call to {@link #start()}.<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  volatile boolean started = false;<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  /**<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * This is a running count of the size of all outstanding calls by size.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  protected final Counter callQueueSize = new Counter();<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  //maintain a list<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  //of client connections<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private Listener listener = null;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  protected Responder responder = null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  protected int numConnections = 0;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  /** Default value for above params */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  private final int warnResponseTime;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private final int warnResponseSize;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  private final Server server;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  private final RpcScheduler scheduler;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>  private UserProvider userProvider;<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  private final BoundedByteBufferPool reservoir;<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * the result.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  class Call implements RpcCallContext {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    protected int id;                             // the client's call id<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    protected BlockingService service;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    protected MethodDescriptor md;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    protected RequestHeader header;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    protected Message param;                      // the parameter passed<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    // Optional cell data passed outside of protobufs.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    protected CellScanner cellScanner;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    protected Connection connection;              // connection to client<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    protected long timestamp;      // the time received when response is null<a name="line.295"></a>
-<span class="sourceLineNo">296</span>                                   // the time served when response is not null<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
-<span class="sourceLineNo">298</span>     * Chain of buffers to send as response.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>     */<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    protected BufferChain response;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    protected Responder responder;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    protected long size;                          // size of current call<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    protected boolean isError;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    protected TraceInfo tinfo;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    private ByteBuffer cellBlock = null;<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private User user;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private InetAddress remoteAddress;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RpcCallback callback;<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private long responseCellSize = 0;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private long responseBlockSize = 0;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private boolean retryImmediatelySupported;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.318"></a>
-<span class="sourceLineNo">319</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.id = id;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.service = service;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.md = md;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.header = header;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      this.param = param;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      this.cellScanner = cellScanner;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      this.connection = connection;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      this.timestamp = System.currentTimeMillis();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      this.response = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      this.responder = responder;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      this.isError = false;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.size = size;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.tinfo = tinfo;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.remoteAddress = remoteAddress;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.retryImmediatelySupported =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    /**<a name="line.340"></a>
-<span class="sourceLineNo">341</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.341"></a>
-<span class="sourceLineNo">342</span>     * cleanup.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>     */<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    void done() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        // Return buffer to reservoir now we are done with it.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        reservoir.putBuffer(this.cellBlock);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        this.cellBlock = null;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>    @Override<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    public String toString() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      return toShortString() + " param: " +<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        " connection: " + connection.toString();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>    protected RequestHeader getHeader() {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      return this.header;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    /*<a name="line.366"></a>
-<span class="sourceLineNo">367</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.367"></a>
-<span class="sourceLineNo">368</span>     * the payload of a command<a name="line.368"></a>
-<span class="sourceLineNo">369</span>     */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    String toShortString() {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      String serviceName = this.connection.service != null ?<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          " connection: " + connection.toString();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    String toTraceString() {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      String serviceName = this.connection.service != null ?<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return serviceName + "." + methodName;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      this.response = new BufferChain(response);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        Throwable t, String errorMsg) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      if (this.isError) return;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (t != null) this.isError = true;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      BufferChain bc = null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      try {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        // Presume it a pb Message.  Could be null.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        Message result = (Message)m;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        // Call id.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        headerBuilder.setCallId(this.id);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (t != null) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (t instanceof RegionMovedException) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.408"></a>
-<span class="sourceLineNo">409</span>            // any kind of payload.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          // Set the exception as the result of the method invocation.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        if (this.cellBlock != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        Message header = headerBuilder.build();<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>        // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        // one big byte array; save on allocations.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        ByteBuffer bbHeader = IPCUtil.getDelimitedMessageAsByteBuffer(header);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        ByteBuffer bbResult = IPCUtil.getDelimitedMessageAsByteBuffer(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        int totalSize = bbHeader.capacity() + (bbResult == null? 0: bbResult.limit()) +<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (this.cellBlock == null? 0: this.cellBlock.limit());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        ByteBuffer bbTotalSize = ByteBuffer.wrap(Bytes.toBytes(totalSize));<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        bc = new BufferChain(bbTotalSize, bbHeader, bbResult, this.cellBlock);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        if (connection.useWrap) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          bc = wrapWithSasl(bc);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      } catch (IOException e) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        LOG.warn("Exception while creating response " + e);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      this.response = bc;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (this.callback != null) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          this.callback.run();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        } catch (Exception e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          // Don't allow any exception here to kill this handler thread.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private BufferChain wrapWithSasl(BufferChain bc)<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        throws IOException {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      if (!this.connection.useSasl) return bc;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // Looks like no way around this; saslserver wants a byte array.  I have to make it one.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // THIS IS A BIG UGLY COPY.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      byte [] responseBytes = bc.getBytes();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      byte [] token;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // synchronization may be needed since there can be multiple Handler<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      // threads using saslServer to wrap responses.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      synchronized (connection.saslServer) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        token = connection.saslServer.wrap(responseBytes, 0, responseBytes.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      if (LOG.isTraceEnabled()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        LOG.trace("Adding saslServer wrapped token of size " + token.length<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            + " as call response.");<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>      ByteBuffer bbTokenLength = ByteBuffer.wrap(Bytes.toBytes(token.length));<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      ByteBuffer bbTokenBytes = ByteBuffer.wrap(token);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return new BufferChain(bbTokenLength, bbTokenBytes);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public boolean isClientCellBlockSupported() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      return this.connection != null &amp;&amp; this.connection.codec != null;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>    @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    public long disconnectSince() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (!connection.channel.isOpen()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        return System.currentTimeMillis() - timestamp;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      } else {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        return -1L;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>    public long getSize() {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      return this.size;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>    public long getResponseCellSize() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return responseCellSize;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    public void incrementResponseCellSize(long cellSize) {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      responseCellSize += cellSize;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    @Override<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    public long getResponseBlockSize() {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return responseBlockSize;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    @Override<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    public void incrementResponseBlockSize(long blockSize) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      responseBlockSize += blockSize;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    public synchronized void sendResponseIfReady() throws IOException {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.responder.doRespond(this);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    public UserGroupInformation getRemoteUser() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      return connection.ugi;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    @Override<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    public User getRequestUser() {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      return user;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    @Override<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    public String getRequestUserName() {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      User user = getRequestUser();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return user == null? null: user.getShortName();<a name="line.531"></a>
+<span class="sourceLineNo">263</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  /** Default value for above params */<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  private final int warnResponseTime;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  private final int warnResponseSize;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  private final Server server;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  private final RpcScheduler scheduler;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  private UserProvider userProvider;<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>  private final BoundedByteBufferPool reservoir;<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * the result.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  class Call implements RpcCallContext {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int id;                             // the client's call id<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    protected BlockingService service;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    protected MethodDescriptor md;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    protected RequestHeader header;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    protected Message param;                      // the parameter passed<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // Optional cell data passed outside of protobufs.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    protected CellScanner cellScanner;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    protected Connection connection;              // connection to client<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    protected long timestamp;      // the time received when response is null<a name="line.298"></a>
+<span class="sourceLineNo">299</span>                                   // the time served when response is not null<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    /**<a name="line.300"></a>
+<span class="sourceLineNo">301</span>     * Chain of buffers to send as response.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>     */<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    protected BufferChain response;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    protected Responder responder;<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    protected long size;                          // size of current call<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    protected boolean isError;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    protected TraceInfo tinfo;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    private ByteBuffer cellBlock = null;<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    private User user;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    private InetAddress remoteAddress;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    private RpcCallback callback;<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private long responseCellSize = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private long responseBlockSize = 0;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    private boolean retryImmediatelySupported;<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.321"></a>
+<span class="sourceLineNo">322</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.322"></a>
+<span class="sourceLineNo">323</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      this.id = id;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      this.service = service;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      this.md = md;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      this.header = header;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      this.param = param;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      this.cellScanner = cellScanner;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      this.connection = connection;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.timestamp = System.currentTimeMillis();<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.response = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      this.responder = responder;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      this.isError = false;<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      this.size = size;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.tinfo = tinfo;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.remoteAddress = remoteAddress;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.retryImmediatelySupported =<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    /**<a name="line.343"></a>
+<span class="sourceLineNo">344</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.344"></a>
+<span class="sourceLineNo">345</span>     * cleanup.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>     */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    void done() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        // Return buffer to reservoir now we are done with it.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        reservoir.putBuffer(this.cellBlock);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        this.cellBlock = null;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    @Override<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    public String toString() {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      return toShortString() + " param: " +<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        " connection: " + connection.toString();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    protected RequestHeader getHeader() {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      return this.header;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>    /*<a name="line.369"></a>
+<span class="sourceLineNo">370</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.370"></a>
+<span class="sourceLineNo">371</span>     * the payload of a command<a name="line.371"></a>
+<span class="sourceLineNo">372</span>     */<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    String toShortString() {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      String serviceName = this.connection.service != null ?<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          " connection: " + connection.toString();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    String toTraceString() {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      String serviceName = this.connection.service != null ?<a name="line.383"></a>
+<span class="sourceLineNo">384</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return serviceName + "." + methodName;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      this.response = new BufferChain(response);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        Throwable t, String errorMsg) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      if (this.isError) return;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      if (t != null) this.isError = true;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      BufferChain bc = null;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      try {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        // Presume it a pb Message.  Could be null.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        Message result = (Message)m;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        // Call id.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        headerBuilder.setCallId(this.id);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (t != null) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (t instanceof RegionMovedException) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            // any kind of payload.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          // Set the exception as the result of the method invocation.<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        if (this.cellBlock != null) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        Message header = headerBuilder.build();<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>        byte[] b = createHeaderAndMessageBytes(result, header);<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>        bc = new BufferChain(ByteBuffer.wrap(b), this.cellBlock);<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>        if (connection.useWrap) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          bc = wrapWithSasl(bc);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      } catch (IOException e) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        LOG.warn("Exception while creating response " + e);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      this.response = bc;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      if (this.callback != null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          this.callback.run();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        } catch (Exception e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          // Don't allow any exception here to kill this handler thread.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>    private byte[] createHeaderAndMessageBytes(Message result, Message header)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // one big byte array; save on allocations.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      int headerSerializedSize = 0, resultSerializedSize = 0, headerVintSize = 0,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          resultVintSize = 0;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (header != null) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        headerSerializedSize = header.getSerializedSize();<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        headerVintSize = CodedOutputStream.computeRawVarint32Size(headerSerializedSize);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (result != null) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        resultSerializedSize = result.getSerializedSize();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        resultVintSize = CodedOutputStream.computeRawVarint32Size(resultSerializedSize);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      // calculate the total size<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      int totalSize = headerSerializedSize + headerVintSize<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          + (resultSerializedSize + resultVintSize)<a name="line.472"></a>
+<span class="sourceLineNo">473</span>          + (this.cellBlock == null ? 0 : this.cellBlock.limit());<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // The byte[] should also hold the totalSize of the header, message and the cellblock<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      byte[] b = new byte[headerSerializedSize + headerVintSize + resultSerializedSize<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          + resultVintSize + Bytes.SIZEOF_INT];<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      // The RpcClient expects the int to be in a format that code be decoded by<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // the DataInputStream#readInt(). Hence going with the Bytes.toBytes(int)<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // form of writing int.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Bytes.putInt(b, 0, totalSize);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      CodedOutputStream cos = CodedOutputStream.newInstance(b, Bytes.SIZEOF_INT,<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          b.length - Bytes.SIZEOF_INT);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (header != null) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        cos.writeMessageNoTag(header);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      if (result != null) {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        cos.writeMessag

<TRUNCATED>

[31/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html
index 704e192..e5d9af6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcServer.Connection.html
@@ -92,2526 +92,2571 @@
 <span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.conf.ConfigurationObserver;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.exceptions.RegionMovedException;<a name="line.85"></a>
 <span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.User;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.io.BytesWritable;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.io.IntWritable;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.io.Writable;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.io.WritableUtils;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.util.StringUtils;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.htrace.TraceInfo;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import com.google.protobuf.BlockingService;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import com.google.protobuf.CodedInputStream;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import com.google.protobuf.Message;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import com.google.protobuf.ServiceException;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.140"></a>
-<span class="sourceLineNo">141</span> *<a name="line.141"></a>
-<span class="sourceLineNo">142</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.142"></a>
-<span class="sourceLineNo">143</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.143"></a>
-<span class="sourceLineNo">144</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.144"></a>
-<span class="sourceLineNo">145</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.145"></a>
-<span class="sourceLineNo">146</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.146"></a>
-<span class="sourceLineNo">147</span> * and loops till done.<a name="line.147"></a>
-<span class="sourceLineNo">148</span> *<a name="line.148"></a>
-<span class="sourceLineNo">149</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.149"></a>
-<span class="sourceLineNo">150</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.150"></a>
-<span class="sourceLineNo">151</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.151"></a>
-<span class="sourceLineNo">152</span> * and keep taking while the server is up.<a name="line.152"></a>
-<span class="sourceLineNo">153</span> *<a name="line.153"></a>
-<span class="sourceLineNo">154</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.154"></a>
-<span class="sourceLineNo">155</span> * queue for Responder to pull from and return result to client.<a name="line.155"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.io.ByteBufferInputStream;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.VersionInfo;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.CellBlockMeta;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ConnectionHeader;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ResponseHeader;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.security.HBasePolicyProvider;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslDigestCallbackHandler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.security.HBaseSaslRpcServer.SaslGssCallbackHandler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.security.SaslStatus;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.security.User;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.util.Counter;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.io.BytesWritable;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.io.IntWritable;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.io.Writable;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.io.WritableUtils;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.io.compress.CompressionCodec;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.security.authorize.AuthorizationException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.security.authorize.PolicyProvider;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.security.authorize.ProxyUsers;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.security.authorize.ServiceAuthorizationManager;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.security.token.SecretManager;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.security.token.SecretManager.InvalidToken;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.util.StringUtils;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.htrace.TraceInfo;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.codehaus.jackson.map.ObjectMapper;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>import com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import com.google.protobuf.BlockingService;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import com.google.protobuf.CodedInputStream;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import com.google.protobuf.CodedOutputStream;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import com.google.protobuf.Message;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import com.google.protobuf.ServiceException;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import com.google.protobuf.TextFormat;<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> * An RPC server that hosts protobuf described Services.<a name="line.143"></a>
+<span class="sourceLineNo">144</span> *<a name="line.144"></a>
+<span class="sourceLineNo">145</span> * An RpcServer instance has a Listener that hosts the socket.  Listener has fixed number<a name="line.145"></a>
+<span class="sourceLineNo">146</span> * of Readers in an ExecutorPool, 10 by default.  The Listener does an accept and then<a name="line.146"></a>
+<span class="sourceLineNo">147</span> * round robin a Reader is chosen to do the read.  The reader is registered on Selector.  Read does<a name="line.147"></a>
+<span class="sourceLineNo">148</span> * total read off the channel and the parse from which it makes a Call.  The call is wrapped in a<a name="line.148"></a>
+<span class="sourceLineNo">149</span> * CallRunner and passed to the scheduler to be run.  Reader goes back to see if more to be done<a name="line.149"></a>
+<span class="sourceLineNo">150</span> * and loops till done.<a name="line.150"></a>
+<span class="sourceLineNo">151</span> *<a name="line.151"></a>
+<span class="sourceLineNo">152</span> * &lt;p&gt;Scheduler can be variously implemented but default simple scheduler has handlers to which it<a name="line.152"></a>
+<span class="sourceLineNo">153</span> * has given the queues into which calls (i.e. CallRunner instances) are inserted.  Handlers run<a name="line.153"></a>
+<span class="sourceLineNo">154</span> * taking from the queue.  They run the CallRunner#run method on each item gotten from queue<a name="line.154"></a>
+<span class="sourceLineNo">155</span> * and keep taking while the server is up.<a name="line.155"></a>
 <span class="sourceLineNo">156</span> *<a name="line.156"></a>
-<span class="sourceLineNo">157</span> * @see RpcClientImpl<a name="line.157"></a>
-<span class="sourceLineNo">158</span> */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.159"></a>
-<span class="sourceLineNo">160</span>@InterfaceStability.Evolving<a name="line.160"></a>
-<span class="sourceLineNo">161</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      = new CallQueueTooBigException();<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final boolean authorize;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private boolean isSecurityEnabled;<a name="line.168"></a>
+<span class="sourceLineNo">157</span> * CallRunner#run executes the call.  When done, asks the included Call to put itself on new<a name="line.157"></a>
+<span class="sourceLineNo">158</span> * queue for Responder to pull from and return result to client.<a name="line.158"></a>
+<span class="sourceLineNo">159</span> *<a name="line.159"></a>
+<span class="sourceLineNo">160</span> * @see RpcClientImpl<a name="line.160"></a>
+<span class="sourceLineNo">161</span> */<a name="line.161"></a>
+<span class="sourceLineNo">162</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.COPROC, HBaseInterfaceAudience.PHOENIX})<a name="line.162"></a>
+<span class="sourceLineNo">163</span>@InterfaceStability.Evolving<a name="line.163"></a>
+<span class="sourceLineNo">164</span>public class RpcServer implements RpcServerInterface, ConfigurationObserver {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  // LOG is being used in CallRunner and the log level is being changed in tests<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static final Log LOG = LogFactory.getLog(RpcServer.class);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private static final CallQueueTooBigException CALL_QUEUE_TOO_BIG_EXCEPTION<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      = new CallQueueTooBigException();<a name="line.168"></a>
 <span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public static final byte CURRENT_VERSION = 0;<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<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>   * How many calls/handler are allowed in the queue.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * The maximum size that we can hold in the RPC queue<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private final IPCUtil ipcUtil;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    Server.class.getName());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  protected ServiceAuthorizationManager authManager;<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * after the call returns.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   */<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  protected final InetSocketAddress bindAddress;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  protected int port;                             // port we listen on<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private int readThreads;                        // number of read threads<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.210"></a>
-<span class="sourceLineNo">211</span>                                                  // which a client may be<a name="line.211"></a>
-<span class="sourceLineNo">212</span>                                                  // disconnected<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.213"></a>
-<span class="sourceLineNo">214</span>                                                  // connections after which we<a name="line.214"></a>
-<span class="sourceLineNo">215</span>                                                  // will start cleaning up idle<a name="line.215"></a>
-<span class="sourceLineNo">216</span>                                                  // connections<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.217"></a>
-<span class="sourceLineNo">218</span>                                                  // connections to nuke<a name="line.218"></a>
-<span class="sourceLineNo">219</span>                                                  // during a cleanup<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  protected MetricsHBaseServer metrics;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  protected final Configuration conf;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private int maxQueueSize;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  protected int socketSendBufferSize;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  volatile boolean running = true;<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>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * for business by the call to {@link #start()}.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  volatile boolean started = false;<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>   * This is a running count of the size of all outstanding calls by size.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  protected final Counter callQueueSize = new Counter();<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  //maintain a list<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  //of client connections<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private Listener listener = null;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  protected Responder responder = null;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  protected int numConnections = 0;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.261"></a>
+<span class="sourceLineNo">170</span>  private final boolean authorize;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private boolean isSecurityEnabled;<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public static final byte CURRENT_VERSION = 0;<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Whether we allow a fallback to SIMPLE auth for insecure clients when security is enabled.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public static final String FALLBACK_TO_INSECURE_CLIENT_AUTH =<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          "hbase.ipc.server.fallback-to-simple-auth-allowed";<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * How many calls/handler are allowed in the queue.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  static final int DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER = 10;<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * The maximum size that we can hold in the RPC queue<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private static final int DEFAULT_MAX_CALLQUEUE_SIZE = 1024 * 1024 * 1024;<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private final IPCUtil ipcUtil;<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private static final String AUTH_FAILED_FOR = "Auth failed for ";<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private static final String AUTH_SUCCESSFUL_FOR = "Auth successful for ";<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private static final Log AUDITLOG = LogFactory.getLog("SecurityLogger." +<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    Server.class.getName());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  protected SecretManager&lt;TokenIdentifier&gt; secretManager;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  protected ServiceAuthorizationManager authManager;<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  /** This is set to Call object before Handler invokes an RPC and ybdie<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * after the call returns.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   */<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected static final ThreadLocal&lt;Call&gt; CurCall = new ThreadLocal&lt;Call&gt;();<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /** Keeps MonitoredRPCHandler per handler thread. */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  static final ThreadLocal&lt;MonitoredRPCHandler&gt; MONITORED_RPC<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      = new ThreadLocal&lt;MonitoredRPCHandler&gt;();<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected final InetSocketAddress bindAddress;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected int port;                             // port we listen on<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected InetSocketAddress address;            // inet address we listen on<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  private int readThreads;                        // number of read threads<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  protected int maxIdleTime;                      // the maximum idle time after<a name="line.213"></a>
+<span class="sourceLineNo">214</span>                                                  // which a client may be<a name="line.214"></a>
+<span class="sourceLineNo">215</span>                                                  // disconnected<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  protected int thresholdIdleConnections;         // the number of idle<a name="line.216"></a>
+<span class="sourceLineNo">217</span>                                                  // connections after which we<a name="line.217"></a>
+<span class="sourceLineNo">218</span>                                                  // will start cleaning up idle<a name="line.218"></a>
+<span class="sourceLineNo">219</span>                                                  // connections<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  int maxConnectionsToNuke;                       // the max number of<a name="line.220"></a>
+<span class="sourceLineNo">221</span>                                                  // connections to nuke<a name="line.221"></a>
+<span class="sourceLineNo">222</span>                                                  // during a cleanup<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected MetricsHBaseServer metrics;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  protected final Configuration conf;<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private int maxQueueSize;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  protected int socketSendBufferSize;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  protected final boolean tcpNoDelay;   // if T then disable Nagle's Algorithm<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  protected final boolean tcpKeepAlive; // if T then use keepalives<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  protected final long purgeTimeout;    // in milliseconds<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  /**<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * This flag is used to indicate to sub threads when they should go down.  When we call<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * {@link #start()}, all threads started will consult this flag on whether they should<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * keep going.  It is set to false when {@link #stop()} is called.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  volatile boolean running = true;<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * This flag is set to true after all threads are up and 'running' and the server is then opened<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * for business by the call to {@link #start()}.<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  volatile boolean started = false;<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  /**<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * This is a running count of the size of all outstanding calls by size.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  protected final Counter callQueueSize = new Counter();<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  protected final List&lt;Connection&gt; connectionList =<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    Collections.synchronizedList(new LinkedList&lt;Connection&gt;());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  //maintain a list<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  //of client connections<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private Listener listener = null;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  protected Responder responder = null;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  protected AuthenticationTokenSecretManager authTokenSecretMgr = null;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  protected int numConnections = 0;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  protected HBaseRPCErrorHandler errorHandler = null;<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  /** Default value for above params */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  private final int warnResponseTime;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private final int warnResponseSize;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  private final Server server;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  private final RpcScheduler scheduler;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>  private UserProvider userProvider;<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  private final BoundedByteBufferPool reservoir;<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * the result.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  class Call implements RpcCallContext {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    protected int id;                             // the client's call id<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    protected BlockingService service;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    protected MethodDescriptor md;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    protected RequestHeader header;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    protected Message param;                      // the parameter passed<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    // Optional cell data passed outside of protobufs.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    protected CellScanner cellScanner;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    protected Connection connection;              // connection to client<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    protected long timestamp;      // the time received when response is null<a name="line.295"></a>
-<span class="sourceLineNo">296</span>                                   // the time served when response is not null<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
-<span class="sourceLineNo">298</span>     * Chain of buffers to send as response.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>     */<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    protected BufferChain response;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    protected Responder responder;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    protected long size;                          // size of current call<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    protected boolean isError;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    protected TraceInfo tinfo;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    private ByteBuffer cellBlock = null;<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private User user;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private InetAddress remoteAddress;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RpcCallback callback;<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private long responseCellSize = 0;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private long responseBlockSize = 0;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private boolean retryImmediatelySupported;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.318"></a>
-<span class="sourceLineNo">319</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.id = id;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.service = service;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.md = md;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.header = header;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      this.param = param;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      this.cellScanner = cellScanner;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      this.connection = connection;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      this.timestamp = System.currentTimeMillis();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      this.response = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      this.responder = responder;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      this.isError = false;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      this.size = size;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      this.tinfo = tinfo;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      this.remoteAddress = remoteAddress;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      this.retryImmediatelySupported =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    /**<a name="line.340"></a>
-<span class="sourceLineNo">341</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.341"></a>
-<span class="sourceLineNo">342</span>     * cleanup.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>     */<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    void done() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        // Return buffer to reservoir now we are done with it.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        reservoir.putBuffer(this.cellBlock);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        this.cellBlock = null;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>    @Override<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    public String toString() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      return toShortString() + " param: " +<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        " connection: " + connection.toString();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>    protected RequestHeader getHeader() {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      return this.header;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    /*<a name="line.366"></a>
-<span class="sourceLineNo">367</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.367"></a>
-<span class="sourceLineNo">368</span>     * the payload of a command<a name="line.368"></a>
-<span class="sourceLineNo">369</span>     */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    String toShortString() {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      String serviceName = this.connection.service != null ?<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          " connection: " + connection.toString();<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    String toTraceString() {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      String serviceName = this.connection.service != null ?<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return serviceName + "." + methodName;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      this.response = new BufferChain(response);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        Throwable t, String errorMsg) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      if (this.isError) return;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      if (t != null) this.isError = true;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      BufferChain bc = null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      try {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        // Presume it a pb Message.  Could be null.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        Message result = (Message)m;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        // Call id.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        headerBuilder.setCallId(this.id);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (t != null) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (t instanceof RegionMovedException) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.408"></a>
-<span class="sourceLineNo">409</span>            // any kind of payload.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.410"></a>
-<span class="sourceLineNo">411</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          // Set the exception as the result of the method invocation.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        if (this.cellBlock != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        Message header = headerBuilder.build();<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>        // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        // one big byte array; save on allocations.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        ByteBuffer bbHeader = IPCUtil.getDelimitedMessageAsByteBuffer(header);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        ByteBuffer bbResult = IPCUtil.getDelimitedMessageAsByteBuffer(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        int totalSize = bbHeader.capacity() + (bbResult == null? 0: bbResult.limit()) +<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          (this.cellBlock == null? 0: this.cellBlock.limit());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        ByteBuffer bbTotalSize = ByteBuffer.wrap(Bytes.toBytes(totalSize));<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        bc = new BufferChain(bbTotalSize, bbHeader, bbResult, this.cellBlock);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        if (connection.useWrap) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          bc = wrapWithSasl(bc);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      } catch (IOException e) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        LOG.warn("Exception while creating response " + e);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      }<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      this.response = bc;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (this.callback != null) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        try {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          this.callback.run();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        } catch (Exception e) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          // Don't allow any exception here to kill this handler thread.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private BufferChain wrapWithSasl(BufferChain bc)<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        throws IOException {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      if (!this.connection.useSasl) return bc;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // Looks like no way around this; saslserver wants a byte array.  I have to make it one.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // THIS IS A BIG UGLY COPY.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      byte [] responseBytes = bc.getBytes();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      byte [] token;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // synchronization may be needed since there can be multiple Handler<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      // threads using saslServer to wrap responses.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      synchronized (connection.saslServer) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        token = connection.saslServer.wrap(responseBytes, 0, responseBytes.length);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      if (LOG.isTraceEnabled()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        LOG.trace("Adding saslServer wrapped token of size " + token.length<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            + " as call response.");<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>      ByteBuffer bbTokenLength = ByteBuffer.wrap(Bytes.toBytes(token.length));<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      ByteBuffer bbTokenBytes = ByteBuffer.wrap(token);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return new BufferChain(bbTokenLength, bbTokenBytes);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    public boolean isClientCellBlockSupported() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      return this.connection != null &amp;&amp; this.connection.codec != null;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>    @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    public long disconnectSince() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (!connection.channel.isOpen()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        return System.currentTimeMillis() - timestamp;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      } else {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        return -1L;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>    public long getSize() {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      return this.size;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>    public long getResponseCellSize() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      return responseCellSize;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    public void incrementResponseCellSize(long cellSize) {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      responseCellSize += cellSize;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    @Override<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    public long getResponseBlockSize() {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return responseBlockSize;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    @Override<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    public void incrementResponseBlockSize(long blockSize) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      responseBlockSize += blockSize;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    public synchronized void sendResponseIfReady() throws IOException {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.responder.doRespond(this);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    public UserGroupInformation getRemoteUser() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      return connection.ugi;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    @Override<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    public User getRequestUser() {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      return user;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    @Override<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    public String getRequestUserName() {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      User user = getRequestUser();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return user == null? null: user.getShortName();<a name="line.531"></a>
+<span class="sourceLineNo">263</span>  private static final String WARN_RESPONSE_TIME = "hbase.ipc.warn.response.time";<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  private static final String WARN_RESPONSE_SIZE = "hbase.ipc.warn.response.size";<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  /** Default value for above params */<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  private static final int DEFAULT_WARN_RESPONSE_TIME = 10000; // milliseconds<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private static final int DEFAULT_WARN_RESPONSE_SIZE = 100 * 1024 * 1024;<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  private final int warnResponseTime;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  private final int warnResponseSize;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  private final Server server;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  private final List&lt;BlockingServiceAndInterface&gt; services;<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  private final RpcScheduler scheduler;<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  private UserProvider userProvider;<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>  private final BoundedByteBufferPool reservoir;<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>  private volatile boolean allowFallbackToSimpleAuth;<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Datastructure that holds all necessary to a method invocation and then afterward, carries<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * the result.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  class Call implements RpcCallContext {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    protected int id;                             // the client's call id<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    protected BlockingService service;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    protected MethodDescriptor md;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    protected RequestHeader header;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    protected Message param;                      // the parameter passed<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    // Optional cell data passed outside of protobufs.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    protected CellScanner cellScanner;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    protected Connection connection;              // connection to client<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    protected long timestamp;      // the time received when response is null<a name="line.298"></a>
+<span class="sourceLineNo">299</span>                                   // the time served when response is not null<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    /**<a name="line.300"></a>
+<span class="sourceLineNo">301</span>     * Chain of buffers to send as response.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>     */<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    protected BufferChain response;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    protected Responder responder;<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    protected long size;                          // size of current call<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    protected boolean isError;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    protected TraceInfo tinfo;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    private ByteBuffer cellBlock = null;<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>    private User user;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    private InetAddress remoteAddress;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    private RpcCallback callback;<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private long responseCellSize = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private long responseBlockSize = 0;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    private boolean retryImmediatelySupported;<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NP_NULL_ON_SOME_PATH",<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        justification="Can't figure why this complaint is happening... see below")<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    Call(int id, final BlockingService service, final MethodDescriptor md, RequestHeader header,<a name="line.321"></a>
+<span class="sourceLineNo">322</span>         Message param, CellScanner cellScanner, Connection connection, Responder responder,<a name="line.322"></a>
+<span class="sourceLineNo">323</span>         long size, TraceInfo tinfo, final InetAddress remoteAddress) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      this.id = id;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      this.service = service;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      this.md = md;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      this.header = header;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      this.param = param;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      this.cellScanner = cellScanner;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      this.connection = connection;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.timestamp = System.currentTimeMillis();<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.response = null;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      this.responder = responder;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      this.isError = false;<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      this.size = size;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.tinfo = tinfo;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.user = connection == null? null: connection.user; // FindBugs: NP_NULL_ON_SOME_PATH<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.remoteAddress = remoteAddress;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.retryImmediatelySupported =<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          connection == null? null: connection.retryImmediatelySupported;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    /**<a name="line.343"></a>
+<span class="sourceLineNo">344</span>     * Call is done. Execution happened and we returned results to client. It is now safe to<a name="line.344"></a>
+<span class="sourceLineNo">345</span>     * cleanup.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>     */<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="IS2_INCONSISTENT_SYNC",<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        justification="Presume the lock on processing request held by caller is protection enough")<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    void done() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      if (this.cellBlock != null &amp;&amp; reservoir != null) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        // Return buffer to reservoir now we are done with it.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        reservoir.putBuffer(this.cellBlock);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        this.cellBlock = null;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      this.connection.decRpcCount();  // Say that we're done with this call.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    @Override<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    public String toString() {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      return toShortString() + " param: " +<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        (this.param != null? ProtobufUtil.getShortTextFormat(this.param): "") +<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        " connection: " + connection.toString();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    protected RequestHeader getHeader() {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      return this.header;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>    /*<a name="line.369"></a>
+<span class="sourceLineNo">370</span>     * Short string representation without param info because param itself could be huge depends on<a name="line.370"></a>
+<span class="sourceLineNo">371</span>     * the payload of a command<a name="line.371"></a>
+<span class="sourceLineNo">372</span>     */<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    String toShortString() {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      String serviceName = this.connection.service != null ?<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          this.connection.service.getDescriptorForType().getName() : "null";<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      return "callId: " + this.id + " service: " + serviceName +<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          " methodName: " + ((this.md != null) ? this.md.getName() : "n/a") +<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          " size: " + StringUtils.TraditionalBinaryPrefix.long2String(this.size, "", 1) +<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          " connection: " + connection.toString();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    String toTraceString() {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      String serviceName = this.connection.service != null ?<a name="line.383"></a>
+<span class="sourceLineNo">384</span>                           this.connection.service.getDescriptorForType().getName() : "";<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      String methodName = (this.md != null) ? this.md.getName() : "";<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return serviceName + "." + methodName;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    protected synchronized void setSaslTokenResponse(ByteBuffer response) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      this.response = new BufferChain(response);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>    protected synchronized void setResponse(Object m, final CellScanner cells,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        Throwable t, String errorMsg) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      if (this.isError) return;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      if (t != null) this.isError = true;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      BufferChain bc = null;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      try {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        ResponseHeader.Builder headerBuilder = ResponseHeader.newBuilder();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        // Presume it a pb Message.  Could be null.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        Message result = (Message)m;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        // Call id.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        headerBuilder.setCallId(this.id);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        if (t != null) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ExceptionResponse.Builder exceptionBuilder = ExceptionResponse.newBuilder();<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          exceptionBuilder.setExceptionClassName(t.getClass().getName());<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          exceptionBuilder.setStackTrace(errorMsg);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          exceptionBuilder.setDoNotRetry(t instanceof DoNotRetryIOException);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (t instanceof RegionMovedException) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            // Special casing for this exception.  This is only one carrying a payload.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            // Do this instead of build a generic system for allowing exceptions carry<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            // any kind of payload.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>            RegionMovedException rme = (RegionMovedException)t;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            exceptionBuilder.setHostname(rme.getHostname());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            exceptionBuilder.setPort(rme.getPort());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          // Set the exception as the result of the method invocation.<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          headerBuilder.setException(exceptionBuilder.build());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        // Pass reservoir to buildCellBlock. Keep reference to returne so can add it back to the<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // reservoir when finished. This is hacky and the hack is not contained but benefits are<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        // high when we can avoid a big buffer allocation on each rpc.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        this.cellBlock = ipcUtil.buildCellBlock(this.connection.codec,<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          this.connection.compressionCodec, cells, reservoir);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        if (this.cellBlock != null) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          CellBlockMeta.Builder cellBlockBuilder = CellBlockMeta.newBuilder();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          // Presumes the cellBlock bytebuffer has been flipped so limit has total size in it.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          cellBlockBuilder.setLength(this.cellBlock.limit());<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          headerBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        Message header = headerBuilder.build();<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>        byte[] b = createHeaderAndMessageBytes(result, header);<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>        bc = new BufferChain(ByteBuffer.wrap(b), this.cellBlock);<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>        if (connection.useWrap) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          bc = wrapWithSasl(bc);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      } catch (IOException e) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        LOG.warn("Exception while creating response " + e);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      this.response = bc;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      // Once a response message is created and set to this.response, this Call can be treated as<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      // done. The Responder thread will do the n/w write of this message back to client.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      if (this.callback != null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          this.callback.run();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        } catch (Exception e) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          // Don't allow any exception here to kill this handler thread.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          LOG.warn("Exception while running the Rpc Callback.", e);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>    private byte[] createHeaderAndMessageBytes(Message result, Message header)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      // Organize the response as a set of bytebuffers rather than collect it all together inside<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // one big byte array; save on allocations.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      int headerSerializedSize = 0, resultSerializedSize = 0, headerVintSize = 0,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          resultVintSize = 0;<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      if (header != null) {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        headerSerializedSize = header.getSerializedSize();<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        headerVintSize = CodedOutputStream.computeRawVarint32Size(headerSerializedSize);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (result != null) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        resultSerializedSize = result.getSerializedSize();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        resultVintSize = CodedOutputStream.computeRawVarint32Size(resultSerializedSize);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      // calculate the total size<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      int totalSize = headerSerializedSize + headerVintSize<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          + (resultSerializedSize + resultVintSize)<a name="line.472"></a>
+<span class="sourceLineNo">473</span>          + (this.cellBlock == null ? 0 : this.cellBlock.limit());<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // The byte[] should also hold the totalSize of the header, message and the cellblock<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      byte[] b = new byte[headerSerializedSize + headerVintSize + resultSerializedSize<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          + resultVintSize + Bytes.SIZEOF_INT];<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      // The RpcClient expects the int to be in a format that code be decoded by<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      // the DataInputStream#readInt(). Hence going with the Bytes.toBytes(int)<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      // form of writing int.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Bytes.putInt(b, 0, totalSize);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      CodedOutputStream cos = CodedOutputStream.newInstance(b, Bytes.SIZEOF_INT,<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          b.length - Bytes.SIZEOF_INT);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      if (header != null) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        cos.writeMessageNoTag(header);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      if (result != null) {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        cos.writeM

<TRUNCATED>

[41/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/RSRpcServices.html b/devapidocs/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
index 1247277..2e1fbaa 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/RSRpcServices.html
@@ -1226,7 +1226,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getPriority</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.html" title="interface in org.apache.hadoop.hbase.ipc">PriorityFunction</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1155">getPriority</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.html" title="interface in org.apache.hadoop.hbase.ipc">PriorityFunction</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1166">getPriority</a>()</pre>
 </li>
 </ul>
 <a name="getConfiguration()">
@@ -1235,7 +1235,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getConfiguration</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1160">getConfiguration</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1171">getConfiguration</a>()</pre>
 </li>
 </ul>
 <a name="getQuotaManager()">
@@ -1244,7 +1244,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getQuotaManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/RegionServerQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">RegionServerQuotaManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1164">getQuotaManager</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/RegionServerQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">RegionServerQuotaManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1175">getQuotaManager</a>()</pre>
 </li>
 </ul>
 <a name="start()">
@@ -1253,7 +1253,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1168">start</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1179">start</a>()</pre>
 </li>
 </ul>
 <a name="stop()">
@@ -1262,7 +1262,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1172">stop</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1183">stop</a>()</pre>
 </li>
 </ul>
 <a name="checkOpen()">
@@ -1271,7 +1271,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>checkOpen</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1182">checkOpen</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1193">checkOpen</a>()
                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Called to verify that this server is up and running.</div>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -1284,7 +1284,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getServices</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1200">getServices</a>()</pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ipc/RpcServer.BlockingServiceAndInterface.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer.BlockingServiceAndInterface</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1211">getServices</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>list of blocking services and their security info classes that this server supports</dd></dl>
 </li>
 </ul>
@@ -1294,7 +1294,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getSocketAddress</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1211">getSocketAddress</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1222">getSocketAddress</a>()</pre>
 </li>
 </ul>
 <a name="getPriority(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader, com.google.protobuf.Message, org.apache.hadoop.hbase.security.User)">
@@ -1303,7 +1303,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getPriority</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1216">getPriority</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1227">getPriority</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
               com.google.protobuf.Message&nbsp;param,
               <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.html#getPriority(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader,%20com.google.protobuf.Message,%20org.apache.hadoop.hbase.security.User)">PriorityFunction</a></code></strong></div>
@@ -1321,7 +1321,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getDeadline</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1221">getDeadline</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1232">getDeadline</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader&nbsp;header,
                com.google.protobuf.Message&nbsp;param)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/PriorityFunction.html#getDeadline(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.RequestHeader,%20com.google.protobuf.Message)">PriorityFunction</a></code></strong></div>
 <div class="block">Returns the deadline of the specified request.
@@ -1338,7 +1338,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>checkOOME</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1233">checkOOME</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1244">checkOOME</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHandler.html#checkOOME(java.lang.Throwable)">HBaseRPCErrorHandler</a></code></strong></div>
 <div class="block">Take actions on the event of an OutOfMemoryError.</div>
 <dl>
@@ -1354,7 +1354,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CloseRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1261">closeRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CloseRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1272">closeRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                      org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CloseRegionRequest&nbsp;request)
                                                                                        throws com.google.protobuf.ServiceException</pre>
 <div class="block">Close a region on the region server.</div>
@@ -1372,7 +1372,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>compactRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CompactRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1304">compactRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CompactRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1315">compactRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                          org.apache.hadoop.hbase.protobuf.generated.AdminProtos.CompactRegionRequest&nbsp;request)
                                                                                            throws com.google.protobuf.ServiceException</pre>
 <div class="block">Compact a region on the region server.</div>
@@ -1390,7 +1390,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>flushRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.FlushRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1362">flushRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.FlushRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1373">flushRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                      org.apache.hadoop.hbase.protobuf.generated.AdminProtos.FlushRegionRequest&nbsp;request)
                                                                                        throws com.google.protobuf.ServiceException</pre>
 <div class="block">Flush a region on the region server.</div>
@@ -1408,7 +1408,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getOnlineRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetOnlineRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1409">getOnlineRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetOnlineRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1420">getOnlineRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                              org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetOnlineRegionRequest&nbsp;request)
                                                                                                throws com.google.protobuf.ServiceException</pre>
 <dl>
@@ -1424,7 +1424,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetRegionInfoResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1428">getRegionInfo</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetRegionInfoResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1439">getRegionInfo</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                          org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetRegionInfoRequest&nbsp;request)
                                                                                            throws com.google.protobuf.ServiceException</pre>
 <dl>
@@ -1440,7 +1440,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerInfo</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetServerInfoResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1456">getServerInfo</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetServerInfoResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1467">getServerInfo</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                          org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetServerInfoRequest&nbsp;request)
                                                                                            throws com.google.protobuf.ServiceException</pre>
 <div class="block">Get some information of the region server.</div>
@@ -1458,7 +1458,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFile</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetStoreFileResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1470">getStoreFile</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetStoreFileResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1481">getStoreFile</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                        org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetStoreFileRequest&nbsp;request)
                                                                                          throws com.google.protobuf.ServiceException</pre>
 <dl>
@@ -1474,7 +1474,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>mergeRegions</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.MergeRegionsResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1506">mergeRegions</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.MergeRegionsResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1517">mergeRegions</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                        org.apache.hadoop.hbase.protobuf.generated.AdminProtos.MergeRegionsRequest&nbsp;request)
                                                                                          throws com.google.protobuf.ServiceException</pre>
 <div class="block">Merge regions on the region server.</div>
@@ -1493,7 +1493,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>openRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.OpenRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1571">openRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.OpenRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1582">openRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                    org.apache.hadoop.hbase.protobuf.generated.AdminProtos.OpenRegionRequest&nbsp;request)
                                                                                      throws com.google.protobuf.ServiceException</pre>
 <div class="block">Open asynchronously a region or a set of regions on the region server.
@@ -1528,7 +1528,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>warmupRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.WarmupRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1730">warmupRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.WarmupRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1741">warmupRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                        org.apache.hadoop.hbase.protobuf.generated.AdminProtos.WarmupRegionRequest&nbsp;request)
                                                                                          throws com.google.protobuf.ServiceException</pre>
 <div class="block">Wamrmup a region on this server.
@@ -1550,7 +1550,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>replay</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ReplicateWALEntryResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1781">replay</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ReplicateWALEntryResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1792">replay</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                       org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ReplicateWALEntryRequest&nbsp;request)
                                                                                         throws com.google.protobuf.ServiceException</pre>
 <div class="block">Replay the given changes when distributedLogReplay WAL edits from a failed RS. The guarantee is
@@ -1570,7 +1570,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1869">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1880">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
 </li>
 </ul>
 <a name="replicateWALEntry(com.google.protobuf.RpcController, org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ReplicateWALEntryRequest)">
@@ -1579,7 +1579,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>replicateWALEntry</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ReplicateWALEntryResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1882">replicateWALEntry</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ReplicateWALEntryResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1893">replicateWALEntry</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                                  org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ReplicateWALEntryRequest&nbsp;request)
                                                                                                    throws com.google.protobuf.ServiceException</pre>
 <div class="block">Replicate WAL entries on the region server.</div>
@@ -1597,7 +1597,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>rollWALWriter</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.RollWALWriterResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1911">rollWALWriter</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.RollWALWriterResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1922">rollWALWriter</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                          org.apache.hadoop.hbase.protobuf.generated.AdminProtos.RollWALWriterRequest&nbsp;request)
                                                                                            throws com.google.protobuf.ServiceException</pre>
 <div class="block">Roll the WAL writer of the region server.</div>
@@ -1615,7 +1615,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>splitRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.SplitRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1935">splitRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.SplitRegionResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1946">splitRegion</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                      org.apache.hadoop.hbase.protobuf.generated.AdminProtos.SplitRegionRequest&nbsp;request)
                                                                                        throws com.google.protobuf.ServiceException</pre>
 <div class="block">Split a region on the region server.</div>
@@ -1633,7 +1633,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>stopServer</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.StopServerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1978">stopServer</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.StopServerResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1989">stopServer</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                    org.apache.hadoop.hbase.protobuf.generated.AdminProtos.StopServerRequest&nbsp;request)
                                                                                      throws com.google.protobuf.ServiceException</pre>
 <div class="block">Stop the region server.</div>
@@ -1651,7 +1651,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>updateFavoredNodes</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.UpdateFavoredNodesResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1987">updateFavoredNodes</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.UpdateFavoredNodesResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.1998">updateFavoredNodes</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                                    org.apache.hadoop.hbase.protobuf.generated.AdminProtos.UpdateFavoredNodesRequest&nbsp;request)
                                                                                                      throws com.google.protobuf.ServiceException</pre>
 <dl>
@@ -1667,7 +1667,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkLoadHFile</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.BulkLoadHFileResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2006">bulkLoadHFile</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.BulkLoadHFileResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2017">bulkLoadHFile</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                           org.apache.hadoop.hbase.protobuf.generated.ClientProtos.BulkLoadHFileRequest&nbsp;request)
                                                                                             throws com.google.protobuf.ServiceException</pre>
 <div class="block">Atomically bulk load several HFiles into an open region</div>
@@ -1685,7 +1685,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>execService</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2037">execService</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2048">execService</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                              org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceRequest&nbsp;request)
                                                                                                throws com.google.protobuf.ServiceException</pre>
 <dl>
@@ -1701,7 +1701,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>execServiceOnRegion</h4>
-<pre>private&nbsp;com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2057">execServiceOnRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region,
+<pre>private&nbsp;com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2068">execServiceOnRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region,
                                               org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall&nbsp;serviceCall)
                                                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -1714,7 +1714,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2072">get</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2083">get</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                       org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetRequest&nbsp;request)
                                                                         throws com.google.protobuf.ServiceException</pre>
 <div class="block">Get data from a table.</div>
@@ -1732,7 +1732,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2140">get</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2151">get</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get,
          <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
          <a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannersCloseCallBack.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices.RegionScannersCloseCallBack</a>&nbsp;closeCallBack,
          <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallContext</a>&nbsp;context)
@@ -1747,7 +1747,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>multi</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2194">multi</a>(com.google.protobuf.RpcController&nbsp;rpcc,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2205">multi</a>(com.google.protobuf.RpcController&nbsp;rpcc,
                                                                           org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiRequest&nbsp;request)
                                                                             throws com.google.protobuf.ServiceException</pre>
 <div class="block">Execute multiple actions on a table: get, mutate, and/or execCoprocessor</div>
@@ -1765,7 +1765,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>mutate</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutateResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2296">mutate</a>(com.google.protobuf.RpcController&nbsp;rpcc,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutateResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2307">mutate</a>(com.google.protobuf.RpcController&nbsp;rpcc,
                                                                             org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutateRequest&nbsp;request)
                                                                               throws com.google.protobuf.ServiceException</pre>
 <div class="block">Mutate data in a table.</div>
@@ -1783,7 +1783,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>scan</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2417">scan</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2428">scan</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                         org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest&nbsp;request)
                                                                           throws com.google.protobuf.ServiceException</pre>
 <div class="block">Scan data in a table.</div>
@@ -1801,7 +1801,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockList">
 <li class="blockList">
 <h4>execRegionServerService</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2833">execRegionServerService</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2844">execRegionServerService</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                                          org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceRequest&nbsp;request)
                                                                                                            throws com.google.protobuf.ServiceException</pre>
 <dl>
@@ -1817,7 +1817,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/HBaseRPCErrorHand
 <ul class="blockListLast">
 <li class="blockList">
 <h4>updateConfiguration</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.UpdateConfigurationResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2839">updateConfiguration</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;org.apache.hadoop.hbase.protobuf.generated.AdminProtos.UpdateConfigurationResponse&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.html#line.2850">updateConfiguration</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                                                                      org.apache.hadoop.hbase.protobuf.generated.AdminProtos.UpdateConfigurationRequest&nbsp;request)
                                                                                                        throws com.google.protobuf.ServiceException</pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 0ba3d38..4694eca 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -605,23 +605,23 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionOpeningState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">StoreScanner.StoreScannerCompactionRace</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionMergeTransaction.RegionMergeTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionMergeTransaction.RegionMergeTransactionPhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteCompare.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteCompare</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">ScanQueryMatcher.MatchCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitTransaction.SplitTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">SplitTransaction.SplitTransactionPhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">BloomType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">Region.FlushResult.Result</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">ScannerContext.NextState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">SplitLogWorker.TaskExecutor.Status</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionMergeTransaction.RegionMergeTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionMergeTransaction.RegionMergeTransactionPhase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">Region.FlushResult.Result</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">ScanType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">ScannerContext.LimitScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">StoreScanner.StoreScannerCompactionRace</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">ScanQueryMatcher.MatchCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionOpeningState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteResult</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteCompare.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteCompare</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index 86e9213..bdae472 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -140,9 +140,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="strong">AccessControlFilter.Strategy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="strong">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="strong">Permission.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="strong">AccessControlFilter.Strategy</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 6816e64..b720014 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -159,9 +159,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="strong">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="strong">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="strong">ThriftServerRunner.ImplType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="strong">ThriftMetrics.ThriftServerType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
index f6d0938..cf0dc17 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
@@ -379,112 +379,112 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.110">m_master</a></pre>
 </li>
 </ul>
-<a name="m_deadServers">
+<a name="m_metaLocation">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_deadServers</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.122">m_deadServers</a></pre>
+<h4>m_metaLocation</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.122">m_metaLocation</a></pre>
 </li>
 </ul>
-<a name="m_deadServers__IsNotDefault">
+<a name="m_metaLocation__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_deadServers__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.127">m_deadServers__IsNotDefault</a></pre>
+<h4>m_metaLocation__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.127">m_metaLocation__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_servers">
+<a name="m_format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_servers</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.139">m_servers</a></pre>
+<h4>m_format</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.139">m_format</a></pre>
 </li>
 </ul>
-<a name="m_servers__IsNotDefault">
+<a name="m_format__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_servers__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.144">m_servers__IsNotDefault</a></pre>
+<h4>m_format__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.144">m_format__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_metaLocation">
+<a name="m_filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_metaLocation</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.156">m_metaLocation</a></pre>
+<h4>m_filter</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.156">m_filter</a></pre>
 </li>
 </ul>
-<a name="m_metaLocation__IsNotDefault">
+<a name="m_filter__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_metaLocation__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.161">m_metaLocation__IsNotDefault</a></pre>
+<h4>m_filter__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.161">m_filter__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_frags">
+<a name="m_serverManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_frags</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.173">m_frags</a></pre>
+<h4>m_serverManager</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.173">m_serverManager</a></pre>
 </li>
 </ul>
-<a name="m_frags__IsNotDefault">
+<a name="m_serverManager__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_frags__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.178">m_frags__IsNotDefault</a></pre>
+<h4>m_serverManager__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.178">m_serverManager__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_serverManager">
+<a name="m_frags">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_serverManager</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.190">m_serverManager</a></pre>
+<h4>m_frags</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.190">m_frags</a></pre>
 </li>
 </ul>
-<a name="m_serverManager__IsNotDefault">
+<a name="m_frags__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_serverManager__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.195">m_serverManager__IsNotDefault</a></pre>
+<h4>m_frags__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.195">m_frags__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_format">
+<a name="m_assignmentManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.207">m_format</a></pre>
+<h4>m_assignmentManager</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.207">m_assignmentManager</a></pre>
 </li>
 </ul>
-<a name="m_format__IsNotDefault">
+<a name="m_assignmentManager__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.212">m_format__IsNotDefault</a></pre>
+<h4>m_assignmentManager__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.212">m_assignmentManager__IsNotDefault</a></pre>
 </li>
 </ul>
 <a name="m_catalogJanitorEnabled">
@@ -505,40 +505,40 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.229">m_catalogJanitorEnabled__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_filter">
+<a name="m_deadServers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_filter</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.241">m_filter</a></pre>
+<h4>m_deadServers</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.241">m_deadServers</a></pre>
 </li>
 </ul>
-<a name="m_filter__IsNotDefault">
+<a name="m_deadServers__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_filter__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.246">m_filter__IsNotDefault</a></pre>
+<h4>m_deadServers__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.246">m_deadServers__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_assignmentManager">
+<a name="m_servers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_assignmentManager</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.258">m_assignmentManager</a></pre>
+<h4>m_servers</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.258">m_servers</a></pre>
 </li>
 </ul>
-<a name="m_assignmentManager__IsNotDefault">
+<a name="m_servers__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>m_assignmentManager__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.263">m_assignmentManager__IsNotDefault</a></pre>
+<h4>m_servers__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.263">m_servers__IsNotDefault</a></pre>
 </li>
 </ul>
 </li>
@@ -584,166 +584,166 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.106">getMaster</a>()</pre>
 </li>
 </ul>
-<a name="setDeadServers(java.util.Set)">
+<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setDeadServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.112">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;deadServers)</pre>
+<h4>setMetaLocation</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.112">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;metaLocation)</pre>
 </li>
 </ul>
-<a name="getDeadServers()">
+<a name="getMetaLocation()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getDeadServers</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.118">getDeadServers</a>()</pre>
+<h4>getMetaLocation</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.118">getMetaLocation</a>()</pre>
 </li>
 </ul>
-<a name="getDeadServers__IsNotDefault()">
+<a name="getMetaLocation__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getDeadServers__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.123">getDeadServers__IsNotDefault</a>()</pre>
+<h4>getMetaLocation__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.123">getMetaLocation__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setServers(java.util.List)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.129">setServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
+<h4>setFormat</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.129">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
 </li>
 </ul>
-<a name="getServers()">
+<a name="getFormat()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServers</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.135">getServers</a>()</pre>
+<h4>getFormat</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.135">getFormat</a>()</pre>
 </li>
 </ul>
-<a name="getServers__IsNotDefault()">
+<a name="getFormat__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServers__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.140">getServers__IsNotDefault</a>()</pre>
+<h4>getFormat__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.140">getFormat__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setMetaLocation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.146">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;metaLocation)</pre>
+<h4>setFilter</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.146">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
 </li>
 </ul>
-<a name="getMetaLocation()">
+<a name="getFilter()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getMetaLocation</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.152">getMetaLocation</a>()</pre>
+<h4>getFilter</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.152">getFilter</a>()</pre>
 </li>
 </ul>
-<a name="getMetaLocation__IsNotDefault()">
+<a name="getFilter__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getMetaLocation__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.157">getMetaLocation__IsNotDefault</a>()</pre>
+<h4>getFilter__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.157">getFilter__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFrags(java.util.Map)">
+<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFrags</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.163">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;frags)</pre>
+<h4>setServerManager</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.163">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;serverManager)</pre>
 </li>
 </ul>
-<a name="getFrags()">
+<a name="getServerManager()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFrags</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.169">getFrags</a>()</pre>
+<h4>getServerManager</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.169">getServerManager</a>()</pre>
 </li>
 </ul>
-<a name="getFrags__IsNotDefault()">
+<a name="getServerManager__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFrags__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.174">getFrags__IsNotDefault</a>()</pre>
+<h4>getServerManager__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.174">getServerManager__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
+<a name="setFrags(java.util.Map)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServerManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.180">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;serverManager)</pre>
+<h4>setFrags</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.180">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;frags)</pre>
 </li>
 </ul>
-<a name="getServerManager()">
+<a name="getFrags()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServerManager</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.186">getServerManager</a>()</pre>
+<h4>getFrags</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.186">getFrags</a>()</pre>
 </li>
 </ul>
-<a name="getServerManager__IsNotDefault()">
+<a name="getFrags__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServerManager__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.191">getServerManager__IsNotDefault</a>()</pre>
+<h4>getFrags__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.191">getFrags__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.197">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
+<h4>setAssignmentManager</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.197">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;assignmentManager)</pre>
 </li>
 </ul>
-<a name="getFormat()">
+<a name="getAssignmentManager()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.203">getFormat</a>()</pre>
+<h4>getAssignmentManager</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.203">getAssignmentManager</a>()</pre>
 </li>
 </ul>
-<a name="getFormat__IsNotDefault()">
+<a name="getAssignmentManager__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.208">getFormat__IsNotDefault</a>()</pre>
+<h4>getAssignmentManager__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.208">getAssignmentManager__IsNotDefault</a>()</pre>
 </li>
 </ul>
 <a name="setCatalogJanitorEnabled(boolean)">
@@ -773,58 +773,58 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.225">getCatalogJanitorEnabled__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setDeadServers(java.util.Set)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.231">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
+<h4>setDeadServers</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.231">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;deadServers)</pre>
 </li>
 </ul>
-<a name="getFilter()">
+<a name="getDeadServers()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFilter</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.237">getFilter</a>()</pre>
+<h4>getDeadServers</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.237">getDeadServers</a>()</pre>
 </li>
 </ul>
-<a name="getFilter__IsNotDefault()">
+<a name="getDeadServers__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFilter__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.242">getFilter__IsNotDefault</a>()</pre>
+<h4>getDeadServers__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.242">getDeadServers__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
+<a name="setServers(java.util.List)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setAssignmentManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.248">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;assignmentManager)</pre>
+<h4>setServers</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.248">setServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 </li>
 </ul>
-<a name="getAssignmentManager()">
+<a name="getServers()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getAssignmentManager</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.254">getAssignmentManager</a>()</pre>
+<h4>getServers</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.254">getServers</a>()</pre>
 </li>
 </ul>
-<a name="getAssignmentManager__IsNotDefault()">
+<a name="getServers__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>getAssignmentManager__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.259">getAssignmentManager__IsNotDefault</a>()</pre>
+<h4>getServers__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.259">getServers__IsNotDefault</a>()</pre>
 </li>
 </ul>
 </li>


[38/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
index 86ba709..f4bddcd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
@@ -420,7 +420,7 @@
 <span class="sourceLineNo">412</span>        requestHeaderBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.412"></a>
 <span class="sourceLineNo">413</span>      }<a name="line.413"></a>
 <span class="sourceLineNo">414</span>      // Only pass priority if there one.  Let zero be same as no priority.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      if (call.controller.getPriority() != 0) {<a name="line.415"></a>
+<span class="sourceLineNo">415</span>      if (call.controller.getPriority() != PayloadCarryingRpcController.PRIORITY_UNSET) {<a name="line.415"></a>
 <span class="sourceLineNo">416</span>        requestHeaderBuilder.setPriority(call.controller.getPriority());<a name="line.416"></a>
 <span class="sourceLineNo">417</span>      }<a name="line.417"></a>
 <span class="sourceLineNo">418</span><a name="line.418"></a>
@@ -668,96 +668,97 @@
 <span class="sourceLineNo">660</span>  private void handleSaslConnectionFailure(final int currRetries, final Throwable ex,<a name="line.660"></a>
 <span class="sourceLineNo">661</span>      final UserGroupInformation user) throws IOException, InterruptedException {<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    user.doAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      public Void run() throws IOException, InterruptedException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        if (shouldAuthenticateOverKrb()) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          if (currRetries &lt; MAX_SASL_RETRIES) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>            LOG.debug("Exception encountered while connecting to the server : " + ex);<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            //try re-login<a name="line.667"></a>
-<span class="sourceLineNo">668</span>            if (UserGroupInformation.isLoginKeytabBased()) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>              UserGroupInformation.getLoginUser().reloginFromKeytab();<a name="line.669"></a>
-<span class="sourceLineNo">670</span>            } else {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>              UserGroupInformation.getLoginUser().reloginFromTicketCache();<a name="line.671"></a>
-<span class="sourceLineNo">672</span>            }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>            // Should reconnect<a name="line.674"></a>
-<span class="sourceLineNo">675</span>            return null;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>          } else {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>            String msg = "Couldn't setup connection for " +<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                UserGroupInformation.getLoginUser().getUserName() +<a name="line.678"></a>
-<span class="sourceLineNo">679</span>                " to " + serverPrincipal;<a name="line.679"></a>
-<span class="sourceLineNo">680</span>            LOG.warn(msg);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>            throw (IOException) new IOException(msg).initCause(ex);<a name="line.681"></a>
-<span class="sourceLineNo">682</span>          }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        } else {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>          LOG.warn("Exception encountered while connecting to " +<a name="line.684"></a>
-<span class="sourceLineNo">685</span>              "the server : " + ex);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        if (ex instanceof RemoteException) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          throw (RemoteException) ex;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        }<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        if (ex instanceof SaslException) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>          String msg = "SASL authentication failed." +<a name="line.691"></a>
-<span class="sourceLineNo">692</span>              " The most likely cause is missing or invalid credentials." +<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              " Consider 'kinit'.";<a name="line.693"></a>
-<span class="sourceLineNo">694</span>          LOG.fatal(msg, ex);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>          throw new RuntimeException(msg, ex);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        }<a name="line.696"></a>
-<span class="sourceLineNo">697</span>        throw new IOException(ex);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      }<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    });<a name="line.699"></a>
-<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>  public int getConnectionHashCode() {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return ConnectionId.hashCode(ticket, serviceName, address);<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span>  <a name="line.705"></a>
-<span class="sourceLineNo">706</span>  @Override<a name="line.706"></a>
-<span class="sourceLineNo">707</span>  public int hashCode() {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    return getConnectionHashCode();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>     <a name="line.710"></a>
-<span class="sourceLineNo">711</span>  @Override<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  public boolean equals(Object obj) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    if (obj instanceof AsyncRpcChannel) {<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      AsyncRpcChannel channel = (AsyncRpcChannel) obj;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      return channel.hashCode() == obj.hashCode();<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    }<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    return false;<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
-<span class="sourceLineNo">719</span><a name="line.719"></a>
+<span class="sourceLineNo">663</span>      @Override<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      public Void run() throws IOException, InterruptedException {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>        if (shouldAuthenticateOverKrb()) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          if (currRetries &lt; MAX_SASL_RETRIES) {<a name="line.666"></a>
+<span class="sourceLineNo">667</span>            LOG.debug("Exception encountered while connecting to the server : " + ex);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>            //try re-login<a name="line.668"></a>
+<span class="sourceLineNo">669</span>            if (UserGroupInformation.isLoginKeytabBased()) {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>              UserGroupInformation.getLoginUser().reloginFromKeytab();<a name="line.670"></a>
+<span class="sourceLineNo">671</span>            } else {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>              UserGroupInformation.getLoginUser().reloginFromTicketCache();<a name="line.672"></a>
+<span class="sourceLineNo">673</span>            }<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>            // Should reconnect<a name="line.675"></a>
+<span class="sourceLineNo">676</span>            return null;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>          } else {<a name="line.677"></a>
+<span class="sourceLineNo">678</span>            String msg = "Couldn't setup connection for " +<a name="line.678"></a>
+<span class="sourceLineNo">679</span>                UserGroupInformation.getLoginUser().getUserName() +<a name="line.679"></a>
+<span class="sourceLineNo">680</span>                " to " + serverPrincipal;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>            LOG.warn(msg);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>            throw (IOException) new IOException(msg).initCause(ex);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>          }<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        } else {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          LOG.warn("Exception encountered while connecting to " +<a name="line.685"></a>
+<span class="sourceLineNo">686</span>              "the server : " + ex);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        }<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (ex instanceof RemoteException) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw (RemoteException) ex;<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        if (ex instanceof SaslException) {<a name="line.691"></a>
+<span class="sourceLineNo">692</span>          String msg = "SASL authentication failed." +<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              " The most likely cause is missing or invalid credentials." +<a name="line.693"></a>
+<span class="sourceLineNo">694</span>              " Consider 'kinit'.";<a name="line.694"></a>
+<span class="sourceLineNo">695</span>          LOG.fatal(msg, ex);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          throw new RuntimeException(msg, ex);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>        }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>        throw new IOException(ex);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    });<a name="line.700"></a>
+<span class="sourceLineNo">701</span>  }<a name="line.701"></a>
+<span class="sourceLineNo">702</span><a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public int getConnectionHashCode() {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    return ConnectionId.hashCode(ticket, serviceName, address);<a name="line.704"></a>
+<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
+<span class="sourceLineNo">706</span><a name="line.706"></a>
+<span class="sourceLineNo">707</span>  @Override<a name="line.707"></a>
+<span class="sourceLineNo">708</span>  public int hashCode() {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    return getConnectionHashCode();<a name="line.709"></a>
+<span class="sourceLineNo">710</span>  }<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>  @Override<a name="line.712"></a>
+<span class="sourceLineNo">713</span>  public boolean equals(Object obj) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    if (obj instanceof AsyncRpcChannel) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      AsyncRpcChannel channel = (AsyncRpcChannel) obj;<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      return channel.hashCode() == obj.hashCode();<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    return false;<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
 <span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>  @Override<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  public String toString() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    return this.address.toString() + "/" + this.serviceName + "/" + this.ticket;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>  /**<a name="line.726"></a>
-<span class="sourceLineNo">727</span>   * Listens to call writes and fails if write failed<a name="line.727"></a>
-<span class="sourceLineNo">728</span>   */<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  private static final class CallWriteListener implements ChannelFutureListener {<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    private final AsyncRpcChannel rpcChannel;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    private final int id;<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>    public CallWriteListener(AsyncRpcChannel asyncRpcChannel, int id) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      this.rpcChannel = asyncRpcChannel;<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      this.id = id;<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
-<span class="sourceLineNo">737</span><a name="line.737"></a>
-<span class="sourceLineNo">738</span>    @Override<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    public void operationComplete(ChannelFuture future) throws Exception {<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      if (!future.isSuccess()) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>        AsyncCall call = rpcChannel.removePendingCall(id);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>        if (call != null) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>          if (future.cause() instanceof IOException) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>            call.setFailed((IOException) future.cause());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>          } else {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>            call.setFailed(new IOException(future.cause()));<a name="line.746"></a>
-<span class="sourceLineNo">747</span>          }<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        }<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      }<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>  }<a name="line.751"></a>
-<span class="sourceLineNo">752</span>}<a name="line.752"></a>
+<span class="sourceLineNo">721</span><a name="line.721"></a>
+<span class="sourceLineNo">722</span>  @Override<a name="line.722"></a>
+<span class="sourceLineNo">723</span>  public String toString() {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    return this.address.toString() + "/" + this.serviceName + "/" + this.ticket;<a name="line.724"></a>
+<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
+<span class="sourceLineNo">726</span><a name="line.726"></a>
+<span class="sourceLineNo">727</span>  /**<a name="line.727"></a>
+<span class="sourceLineNo">728</span>   * Listens to call writes and fails if write failed<a name="line.728"></a>
+<span class="sourceLineNo">729</span>   */<a name="line.729"></a>
+<span class="sourceLineNo">730</span>  private static final class CallWriteListener implements ChannelFutureListener {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    private final AsyncRpcChannel rpcChannel;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    private final int id;<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public CallWriteListener(AsyncRpcChannel asyncRpcChannel, int id) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      this.rpcChannel = asyncRpcChannel;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      this.id = id;<a name="line.736"></a>
+<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
+<span class="sourceLineNo">738</span><a name="line.738"></a>
+<span class="sourceLineNo">739</span>    @Override<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    public void operationComplete(ChannelFuture future) throws Exception {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      if (!future.isSuccess()) {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>        AsyncCall call = rpcChannel.removePendingCall(id);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        if (call != null) {<a name="line.743"></a>
+<span class="sourceLineNo">744</span>          if (future.cause() instanceof IOException) {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>            call.setFailed((IOException) future.cause());<a name="line.745"></a>
+<span class="sourceLineNo">746</span>          } else {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>            call.setFailed(new IOException(future.cause()));<a name="line.747"></a>
+<span class="sourceLineNo">748</span>          }<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        }<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
+<span class="sourceLineNo">753</span>}<a name="line.753"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/IPCUtil.CellScannerButNoCodecException.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/IPCUtil.CellScannerButNoCodecException.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/IPCUtil.CellScannerButNoCodecException.html
index 1b5adb7..8f9e5a8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/IPCUtil.CellScannerButNoCodecException.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/IPCUtil.CellScannerButNoCodecException.html
@@ -25,25 +25,25 @@
 <span class="sourceLineNo">017</span> */<a name="line.17"></a>
 <span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.ipc;<a name="line.18"></a>
 <span class="sourceLineNo">019</span><a name="line.19"></a>
-<span class="sourceLineNo">020</span>import java.io.ByteArrayInputStream;<a name="line.20"></a>
-<span class="sourceLineNo">021</span>import java.io.DataInput;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.io.IOException;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import java.io.InputStream;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.io.OutputStream;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.nio.BufferOverflowException;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.nio.ByteBuffer;<a name="line.26"></a>
-<span class="sourceLineNo">027</span><a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.commons.io.IOUtils;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.commons.logging.Log;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.commons.logging.LogFactory;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configurable;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.conf.Configuration;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.codec.Codec;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.38"></a>
+<span class="sourceLineNo">020</span>import java.io.DataInput;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.io.IOException;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.io.InputStream;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.io.OutputStream;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.nio.BufferOverflowException;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.nio.ByteBuffer;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.commons.io.IOUtils;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.commons.logging.Log;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.commons.logging.LogFactory;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configurable;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.codec.Codec;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.io.ByteBufferInputStream;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.40"></a>
 <span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.41"></a>
@@ -188,136 +188,134 @@
 <span class="sourceLineNo">180</span>  public CellScanner createCellScanner(final Codec codec, final CompressionCodec compressor,<a name="line.180"></a>
 <span class="sourceLineNo">181</span>      final byte [] cellBlock)<a name="line.181"></a>
 <span class="sourceLineNo">182</span>  throws IOException {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    return createCellScanner(codec, compressor, cellBlock, 0, cellBlock.length);<a name="line.183"></a>
+<span class="sourceLineNo">183</span>    return createCellScanner(codec, compressor, ByteBuffer.wrap(cellBlock));<a name="line.183"></a>
 <span class="sourceLineNo">184</span>  }<a name="line.184"></a>
 <span class="sourceLineNo">185</span><a name="line.185"></a>
 <span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
 <span class="sourceLineNo">187</span>   * @param codec<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * @param cellBlock<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * @param offset<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * @param length<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @return CellScanner to work against the content of &lt;code&gt;cellBlock&lt;/code&gt;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * @throws IOException<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public CellScanner createCellScanner(final Codec codec, final CompressionCodec compressor,<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      final byte [] cellBlock, final int offset, final int length)<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  throws IOException {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // If compressed, decompress it first before passing it on else we will leak compression<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    // resources if the stream is not closed properly after we let it out.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    InputStream is = null;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    if (compressor != null) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      // GZIPCodec fails w/ NPE if no configuration.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      if (compressor instanceof Configurable) ((Configurable)compressor).setConf(this.conf);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      Decompressor poolDecompressor = CodecPool.getDecompressor(compressor);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      CompressionInputStream cis =<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        compressor.createInputStream(new ByteArrayInputStream(cellBlock, offset, length),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        poolDecompressor);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      ByteBufferOutputStream bbos = null;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        // TODO: This is ugly.  The buffer will be resized on us if we guess wrong.<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        // TODO: Reuse buffers.<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        bbos = new ByteBufferOutputStream((length - offset) *<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          this.cellBlockDecompressionMultiplier);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        IOUtils.copy(cis, bbos);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        bbos.close();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        ByteBuffer bb = bbos.getByteBuffer();<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        is = new ByteArrayInputStream(bb.array(), 0, bb.limit());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      } finally {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        if (is != null) is.close();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        if (bbos != null) bbos.close();<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CodecPool.returnDecompressor(poolDecompressor);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    } else {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      is = new ByteArrayInputStream(cellBlock, offset, length);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    }<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return codec.getDecoder(is);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * @param m Message to serialize delimited; i.e. w/ a vint of its size preceeding its<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * serialization.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @return The passed in Message serialized with delimiter.  Return null if &lt;code&gt;m&lt;/code&gt; is null<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @throws IOException<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   */<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static ByteBuffer getDelimitedMessageAsByteBuffer(final Message m) throws IOException {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    if (m == null) return null;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    int serializedSize = m.getSerializedSize();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    int vintSize = CodedOutputStream.computeRawVarint32Size(serializedSize);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    byte [] buffer = new byte[serializedSize + vintSize];<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    // Passing in a byte array saves COS creating a buffer which it does when using streams.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    CodedOutputStream cos = CodedOutputStream.newInstance(buffer);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    // This will write out the vint preamble and the message serialized.<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    cos.writeMessageNoTag(m);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    cos.flush();<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    cos.checkNoSpaceLeft();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    return ByteBuffer.wrap(buffer);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Write out header, param, and cell block if there is one.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * @param dos<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * @param header<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * @param param<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @param cellBlock<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @return Total number of bytes written.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  public static int write(final OutputStream dos, final Message header, final Message param,<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      final ByteBuffer cellBlock)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // Must calculate total size and write that first so other side can read it all in in one<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    // swoop.  This is dictated by how the server is currently written.  Server needs to change<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    // if we are to be able to write without the length prefixing.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(header, param);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    if (cellBlock != null) totalSize += cellBlock.remaining();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    return write(dos, header, param, cellBlock, totalSize);<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>  private static int write(final OutputStream dos, final Message header, final Message param,<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    final ByteBuffer cellBlock, final int totalSize)<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  throws IOException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // I confirmed toBytes does same as DataOutputStream#writeInt.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    dos.write(Bytes.toBytes(totalSize));<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    // This allocates a buffer that is the size of the message internally.<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    header.writeDelimitedTo(dos);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    if (param != null) param.writeDelimitedTo(dos);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    if (cellBlock != null) dos.write(cellBlock.array(), 0, cellBlock.remaining());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    dos.flush();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return totalSize;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Read in chunks of 8K (HBASE-7239)<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param in<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * @param dest<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   * @param offset<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * @param len<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * @throws IOException<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   */<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public static void readChunked(final DataInput in, byte[] dest, int offset, int len)<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      throws IOException {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    int maxRead = 8192;<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>    for (; offset &lt; len; offset += maxRead) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      in.readFully(dest, offset, Math.min(len - offset, maxRead));<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @return Size on the wire when the two messages are written with writeDelimitedTo<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public static int getTotalSizeWhenWrittenDelimited(Message ... messages) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    int totalSize = 0;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    for (Message m: messages) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      if (m == null) continue;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      totalSize += m.getSerializedSize();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      totalSize += CodedOutputStream.computeRawVarint32Size(m.getSerializedSize());<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    Preconditions.checkArgument(totalSize &lt; Integer.MAX_VALUE);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    return totalSize;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
-<span class="sourceLineNo">312</span>}<a name="line.312"></a>
+<span class="sourceLineNo">188</span>   * @param cellBlock ByteBuffer containing the cells written by the Codec. The buffer should be<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * position()'ed at the start of the cell block and limit()'ed at the end.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * @return CellScanner to work against the content of &lt;code&gt;cellBlock&lt;/code&gt;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * @throws IOException<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public CellScanner createCellScanner(final Codec codec, final CompressionCodec compressor,<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      final ByteBuffer cellBlock)<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  throws IOException {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // If compressed, decompress it first before passing it on else we will leak compression<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // resources if the stream is not closed properly after we let it out.<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    InputStream is = null;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (compressor != null) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      // GZIPCodec fails w/ NPE if no configuration.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      if (compressor instanceof Configurable) ((Configurable)compressor).setConf(this.conf);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      Decompressor poolDecompressor = CodecPool.getDecompressor(compressor);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      CompressionInputStream cis =<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        compressor.createInputStream(new ByteBufferInputStream(cellBlock), poolDecompressor);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      ByteBufferOutputStream bbos = null;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        // TODO: This is ugly.  The buffer will be resized on us if we guess wrong.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        // TODO: Reuse buffers.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        bbos = new ByteBufferOutputStream(cellBlock.remaining() *<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          this.cellBlockDecompressionMultiplier);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        IOUtils.copy(cis, bbos);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        bbos.close();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        ByteBuffer bb = bbos.getByteBuffer();<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        is = new ByteBufferInputStream(bb);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      } finally {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (is != null) is.close();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        if (bbos != null) bbos.close();<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>        CodecPool.returnDecompressor(poolDecompressor);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    } else {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      is = new ByteBufferInputStream(cellBlock);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    return codec.getDecoder(is);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>  /**<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @param m Message to serialize delimited; i.e. w/ a vint of its size preceeding its<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   * serialization.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * @return The passed in Message serialized with delimiter.  Return null if &lt;code&gt;m&lt;/code&gt; is null<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * @throws IOException<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public static ByteBuffer getDelimitedMessageAsByteBuffer(final Message m) throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    if (m == null) return null;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    int serializedSize = m.getSerializedSize();<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    int vintSize = CodedOutputStream.computeRawVarint32Size(serializedSize);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    byte [] buffer = new byte[serializedSize + vintSize];<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    // Passing in a byte array saves COS creating a buffer which it does when using streams.<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    CodedOutputStream cos = CodedOutputStream.newInstance(buffer);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // This will write out the vint preamble and the message serialized.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    cos.writeMessageNoTag(m);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    cos.flush();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    cos.checkNoSpaceLeft();<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    return ByteBuffer.wrap(buffer);<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>  /**<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * Write out header, param, and cell block if there is one.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @param dos<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * @param header<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * @param param<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * @param cellBlock<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   * @return Total number of bytes written.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   * @throws IOException<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  public static int write(final OutputStream dos, final Message header, final Message param,<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      final ByteBuffer cellBlock)<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  throws IOException {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    // Must calculate total size and write that first so other side can read it all in in one<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    // swoop.  This is dictated by how the server is currently written.  Server needs to change<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // if we are to be able to write without the length prefixing.<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(header, param);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    if (cellBlock != null) totalSize += cellBlock.remaining();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    return write(dos, header, param, cellBlock, totalSize);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  private static int write(final OutputStream dos, final Message header, final Message param,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    final ByteBuffer cellBlock, final int totalSize)<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // I confirmed toBytes does same as DataOutputStream#writeInt.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    dos.write(Bytes.toBytes(totalSize));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    // This allocates a buffer that is the size of the message internally.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    header.writeDelimitedTo(dos);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    if (param != null) param.writeDelimitedTo(dos);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    if (cellBlock != null) dos.write(cellBlock.array(), 0, cellBlock.remaining());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    dos.flush();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    return totalSize;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * Read in chunks of 8K (HBASE-7239)<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * @param in<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * @param dest<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   * @param offset<a name="line.284"></a>
+<span class="sourceLineNo">285</span>   * @param len<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * @throws IOException<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   */<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  public static void readChunked(final DataInput in, byte[] dest, int offset, int len)<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      throws IOException {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    int maxRead = 8192;<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    for (; offset &lt; len; offset += maxRead) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      in.readFully(dest, offset, Math.min(len - offset, maxRead));<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>  /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @return Size on the wire when the two messages are written with writeDelimitedTo<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public static int getTotalSizeWhenWrittenDelimited(Message ... messages) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    int totalSize = 0;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    for (Message m: messages) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      if (m == null) continue;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      totalSize += m.getSerializedSize();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      totalSize += CodedOutputStream.computeRawVarint32Size(m.getSerializedSize());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    Preconditions.checkArgument(totalSize &lt; Integer.MAX_VALUE);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    return totalSize;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>}<a name="line.310"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html
index 1b5adb7..8f9e5a8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/IPCUtil.html
@@ -25,25 +25,25 @@
 <span class="sourceLineNo">017</span> */<a name="line.17"></a>
 <span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.ipc;<a name="line.18"></a>
 <span class="sourceLineNo">019</span><a name="line.19"></a>
-<span class="sourceLineNo">020</span>import java.io.ByteArrayInputStream;<a name="line.20"></a>
-<span class="sourceLineNo">021</span>import java.io.DataInput;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.io.IOException;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import java.io.InputStream;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.io.OutputStream;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.nio.BufferOverflowException;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.nio.ByteBuffer;<a name="line.26"></a>
-<span class="sourceLineNo">027</span><a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.commons.io.IOUtils;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.commons.logging.Log;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.commons.logging.LogFactory;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configurable;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.conf.Configuration;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.codec.Codec;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.38"></a>
+<span class="sourceLineNo">020</span>import java.io.DataInput;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.io.IOException;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.io.InputStream;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.io.OutputStream;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.nio.BufferOverflowException;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.nio.ByteBuffer;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.commons.io.IOUtils;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.commons.logging.Log;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.commons.logging.LogFactory;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configurable;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.codec.Codec;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.io.BoundedByteBufferPool;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.io.ByteBufferInputStream;<a name="line.38"></a>
 <span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.io.ByteBufferOutputStream;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.40"></a>
 <span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.41"></a>
@@ -188,136 +188,134 @@
 <span class="sourceLineNo">180</span>  public CellScanner createCellScanner(final Codec codec, final CompressionCodec compressor,<a name="line.180"></a>
 <span class="sourceLineNo">181</span>      final byte [] cellBlock)<a name="line.181"></a>
 <span class="sourceLineNo">182</span>  throws IOException {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    return createCellScanner(codec, compressor, cellBlock, 0, cellBlock.length);<a name="line.183"></a>
+<span class="sourceLineNo">183</span>    return createCellScanner(codec, compressor, ByteBuffer.wrap(cellBlock));<a name="line.183"></a>
 <span class="sourceLineNo">184</span>  }<a name="line.184"></a>
 <span class="sourceLineNo">185</span><a name="line.185"></a>
 <span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
 <span class="sourceLineNo">187</span>   * @param codec<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * @param cellBlock<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * @param offset<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * @param length<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @return CellScanner to work against the content of &lt;code&gt;cellBlock&lt;/code&gt;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * @throws IOException<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public CellScanner createCellScanner(final Codec codec, final CompressionCodec compressor,<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      final byte [] cellBlock, final int offset, final int length)<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  throws IOException {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // If compressed, decompress it first before passing it on else we will leak compression<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    // resources if the stream is not closed properly after we let it out.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    InputStream is = null;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    if (compressor != null) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      // GZIPCodec fails w/ NPE if no configuration.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      if (compressor instanceof Configurable) ((Configurable)compressor).setConf(this.conf);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      Decompressor poolDecompressor = CodecPool.getDecompressor(compressor);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      CompressionInputStream cis =<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        compressor.createInputStream(new ByteArrayInputStream(cellBlock, offset, length),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        poolDecompressor);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      ByteBufferOutputStream bbos = null;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      try {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        // TODO: This is ugly.  The buffer will be resized on us if we guess wrong.<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        // TODO: Reuse buffers.<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        bbos = new ByteBufferOutputStream((length - offset) *<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          this.cellBlockDecompressionMultiplier);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        IOUtils.copy(cis, bbos);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        bbos.close();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        ByteBuffer bb = bbos.getByteBuffer();<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        is = new ByteArrayInputStream(bb.array(), 0, bb.limit());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      } finally {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        if (is != null) is.close();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        if (bbos != null) bbos.close();<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CodecPool.returnDecompressor(poolDecompressor);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    } else {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      is = new ByteArrayInputStream(cellBlock, offset, length);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    }<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return codec.getDecoder(is);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * @param m Message to serialize delimited; i.e. w/ a vint of its size preceeding its<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * serialization.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @return The passed in Message serialized with delimiter.  Return null if &lt;code&gt;m&lt;/code&gt; is null<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @throws IOException<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   */<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static ByteBuffer getDelimitedMessageAsByteBuffer(final Message m) throws IOException {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    if (m == null) return null;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    int serializedSize = m.getSerializedSize();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    int vintSize = CodedOutputStream.computeRawVarint32Size(serializedSize);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    byte [] buffer = new byte[serializedSize + vintSize];<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    // Passing in a byte array saves COS creating a buffer which it does when using streams.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    CodedOutputStream cos = CodedOutputStream.newInstance(buffer);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    // This will write out the vint preamble and the message serialized.<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    cos.writeMessageNoTag(m);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    cos.flush();<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    cos.checkNoSpaceLeft();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    return ByteBuffer.wrap(buffer);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Write out header, param, and cell block if there is one.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * @param dos<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * @param header<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * @param param<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @param cellBlock<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @return Total number of bytes written.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  public static int write(final OutputStream dos, final Message header, final Message param,<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      final ByteBuffer cellBlock)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // Must calculate total size and write that first so other side can read it all in in one<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    // swoop.  This is dictated by how the server is currently written.  Server needs to change<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    // if we are to be able to write without the length prefixing.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(header, param);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    if (cellBlock != null) totalSize += cellBlock.remaining();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    return write(dos, header, param, cellBlock, totalSize);<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>  private static int write(final OutputStream dos, final Message header, final Message param,<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    final ByteBuffer cellBlock, final int totalSize)<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  throws IOException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // I confirmed toBytes does same as DataOutputStream#writeInt.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    dos.write(Bytes.toBytes(totalSize));<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    // This allocates a buffer that is the size of the message internally.<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    header.writeDelimitedTo(dos);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    if (param != null) param.writeDelimitedTo(dos);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    if (cellBlock != null) dos.write(cellBlock.array(), 0, cellBlock.remaining());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    dos.flush();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return totalSize;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Read in chunks of 8K (HBASE-7239)<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param in<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * @param dest<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   * @param offset<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * @param len<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * @throws IOException<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   */<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public static void readChunked(final DataInput in, byte[] dest, int offset, int len)<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      throws IOException {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    int maxRead = 8192;<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>    for (; offset &lt; len; offset += maxRead) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      in.readFully(dest, offset, Math.min(len - offset, maxRead));<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @return Size on the wire when the two messages are written with writeDelimitedTo<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public static int getTotalSizeWhenWrittenDelimited(Message ... messages) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    int totalSize = 0;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    for (Message m: messages) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      if (m == null) continue;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      totalSize += m.getSerializedSize();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      totalSize += CodedOutputStream.computeRawVarint32Size(m.getSerializedSize());<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    Preconditions.checkArgument(totalSize &lt; Integer.MAX_VALUE);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    return totalSize;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
-<span class="sourceLineNo">312</span>}<a name="line.312"></a>
+<span class="sourceLineNo">188</span>   * @param cellBlock ByteBuffer containing the cells written by the Codec. The buffer should be<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * position()'ed at the start of the cell block and limit()'ed at the end.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * @return CellScanner to work against the content of &lt;code&gt;cellBlock&lt;/code&gt;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * @throws IOException<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public CellScanner createCellScanner(final Codec codec, final CompressionCodec compressor,<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      final ByteBuffer cellBlock)<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  throws IOException {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // If compressed, decompress it first before passing it on else we will leak compression<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // resources if the stream is not closed properly after we let it out.<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    InputStream is = null;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (compressor != null) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      // GZIPCodec fails w/ NPE if no configuration.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      if (compressor instanceof Configurable) ((Configurable)compressor).setConf(this.conf);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      Decompressor poolDecompressor = CodecPool.getDecompressor(compressor);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      CompressionInputStream cis =<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        compressor.createInputStream(new ByteBufferInputStream(cellBlock), poolDecompressor);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      ByteBufferOutputStream bbos = null;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        // TODO: This is ugly.  The buffer will be resized on us if we guess wrong.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        // TODO: Reuse buffers.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        bbos = new ByteBufferOutputStream(cellBlock.remaining() *<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          this.cellBlockDecompressionMultiplier);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        IOUtils.copy(cis, bbos);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        bbos.close();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        ByteBuffer bb = bbos.getByteBuffer();<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        is = new ByteBufferInputStream(bb);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      } finally {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (is != null) is.close();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        if (bbos != null) bbos.close();<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>        CodecPool.returnDecompressor(poolDecompressor);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    } else {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      is = new ByteBufferInputStream(cellBlock);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    return codec.getDecoder(is);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>  /**<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @param m Message to serialize delimited; i.e. w/ a vint of its size preceeding its<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   * serialization.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * @return The passed in Message serialized with delimiter.  Return null if &lt;code&gt;m&lt;/code&gt; is null<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * @throws IOException<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public static ByteBuffer getDelimitedMessageAsByteBuffer(final Message m) throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    if (m == null) return null;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    int serializedSize = m.getSerializedSize();<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    int vintSize = CodedOutputStream.computeRawVarint32Size(serializedSize);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    byte [] buffer = new byte[serializedSize + vintSize];<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    // Passing in a byte array saves COS creating a buffer which it does when using streams.<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    CodedOutputStream cos = CodedOutputStream.newInstance(buffer);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // This will write out the vint preamble and the message serialized.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    cos.writeMessageNoTag(m);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    cos.flush();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    cos.checkNoSpaceLeft();<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    return ByteBuffer.wrap(buffer);<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>  /**<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * Write out header, param, and cell block if there is one.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @param dos<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * @param header<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * @param param<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * @param cellBlock<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   * @return Total number of bytes written.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   * @throws IOException<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  public static int write(final OutputStream dos, final Message header, final Message param,<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      final ByteBuffer cellBlock)<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  throws IOException {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    // Must calculate total size and write that first so other side can read it all in in one<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    // swoop.  This is dictated by how the server is currently written.  Server needs to change<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // if we are to be able to write without the length prefixing.<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(header, param);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    if (cellBlock != null) totalSize += cellBlock.remaining();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    return write(dos, header, param, cellBlock, totalSize);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  private static int write(final OutputStream dos, final Message header, final Message param,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    final ByteBuffer cellBlock, final int totalSize)<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // I confirmed toBytes does same as DataOutputStream#writeInt.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    dos.write(Bytes.toBytes(totalSize));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    // This allocates a buffer that is the size of the message internally.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    header.writeDelimitedTo(dos);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    if (param != null) param.writeDelimitedTo(dos);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    if (cellBlock != null) dos.write(cellBlock.array(), 0, cellBlock.remaining());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    dos.flush();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    return totalSize;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * Read in chunks of 8K (HBASE-7239)<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * @param in<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * @param dest<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   * @param offset<a name="line.284"></a>
+<span class="sourceLineNo">285</span>   * @param len<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * @throws IOException<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   */<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  public static void readChunked(final DataInput in, byte[] dest, int offset, int len)<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      throws IOException {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    int maxRead = 8192;<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    for (; offset &lt; len; offset += maxRead) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      in.readFully(dest, offset, Math.min(len - offset, maxRead));<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>  /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @return Size on the wire when the two messages are written with writeDelimitedTo<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public static int getTotalSizeWhenWrittenDelimited(Message ... messages) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    int totalSize = 0;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    for (Message m: messages) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      if (m == null) continue;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      totalSize += m.getSerializedSize();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      totalSize += CodedOutputStream.computeRawVarint32Size(m.getSerializedSize());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    Preconditions.checkArgument(totalSize &lt; Integer.MAX_VALUE);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    return totalSize;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>}<a name="line.310"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html
index 6dfcee3..d4aa690 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html
@@ -43,14 +43,14 @@
 <span class="sourceLineNo">035</span>@InterfaceAudience.Private<a name="line.35"></a>
 <span class="sourceLineNo">036</span>public class PayloadCarryingRpcController<a name="line.36"></a>
 <span class="sourceLineNo">037</span>    extends TimeLimitedRpcController implements CellScannable {<a name="line.37"></a>
-<span class="sourceLineNo">038</span>  /**<a name="line.38"></a>
-<span class="sourceLineNo">039</span>   * Priority to set on this request.  Set it here in controller so available composing the<a name="line.39"></a>
-<span class="sourceLineNo">040</span>   * request.  This is the ordained way of setting priorities going forward.  We will be<a name="line.40"></a>
-<span class="sourceLineNo">041</span>   * undoing the old annotation-based mechanism.<a name="line.41"></a>
-<span class="sourceLineNo">042</span>   */<a name="line.42"></a>
-<span class="sourceLineNo">043</span>  // Currently only multi call makes use of this.  Eventually this should be only way to set<a name="line.43"></a>
-<span class="sourceLineNo">044</span>  // priority.<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  private int priority = HConstants.NORMAL_QOS;<a name="line.45"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>  public static final int PRIORITY_UNSET = -1;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  /**<a name="line.40"></a>
+<span class="sourceLineNo">041</span>   * Priority to set on this request.  Set it here in controller so available composing the<a name="line.41"></a>
+<span class="sourceLineNo">042</span>   * request.  This is the ordained way of setting priorities going forward.  We will be<a name="line.42"></a>
+<span class="sourceLineNo">043</span>   * undoing the old annotation-based mechanism.<a name="line.43"></a>
+<span class="sourceLineNo">044</span>   */<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  private int priority = PRIORITY_UNSET;<a name="line.45"></a>
 <span class="sourceLineNo">046</span><a name="line.46"></a>
 <span class="sourceLineNo">047</span>  /**<a name="line.47"></a>
 <span class="sourceLineNo">048</span>   * They are optionally set on construction, cleared after we make the call, and then optionally<a name="line.48"></a>
@@ -75,43 +75,44 @@
 <span class="sourceLineNo">067</span>  /**<a name="line.67"></a>
 <span class="sourceLineNo">068</span>   * @return One-shot cell scanner (you cannot back it up and restart)<a name="line.68"></a>
 <span class="sourceLineNo">069</span>   */<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  public CellScanner cellScanner() {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    return cellScanner;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  }<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public void setCellScanner(final CellScanner cellScanner) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    this.cellScanner = cellScanner;<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>   * @param priority Priority for this request; should fall roughly in the range<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   * {@link HConstants#NORMAL_QOS} to {@link HConstants#HIGH_QOS}<a name="line.80"></a>
-<span class="sourceLineNo">081</span>   */<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public void setPriority(int priority) {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    this.priority = priority;<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>   * @param tn Set priority based off the table we are going against.<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   */<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public void setPriority(final TableName tn) {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    this.priority =<a name="line.90"></a>
-<span class="sourceLineNo">091</span>        (tn != null &amp;&amp; tn.isSystemTable())? HConstants.SYSTEMTABLE_QOS: HConstants.NORMAL_QOS;<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>  /**<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   * @return The priority of this request<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   */<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  public int getPriority() {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    return priority;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  @Override public void reset() {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    super.reset();<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    priority = 0;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    cellScanner = null;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
-<span class="sourceLineNo">106</span>}<a name="line.106"></a>
+<span class="sourceLineNo">070</span>  @Override<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  public CellScanner cellScanner() {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    return cellScanner;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  }<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  public void setCellScanner(final CellScanner cellScanner) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    this.cellScanner = cellScanner;<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>   * @param priority Priority for this request; should fall roughly in the range<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * {@link HConstants#NORMAL_QOS} to {@link HConstants#HIGH_QOS}<a name="line.81"></a>
+<span class="sourceLineNo">082</span>   */<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public void setPriority(int priority) {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    this.priority = priority;<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>  /**<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * @param tn Set priority based off the table we are going against.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   */<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public void setPriority(final TableName tn) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    this.priority =<a name="line.91"></a>
+<span class="sourceLineNo">092</span>        (tn != null &amp;&amp; tn.isSystemTable())? HConstants.SYSTEMTABLE_QOS: HConstants.NORMAL_QOS;<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>  /**<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @return The priority of this request<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  public int getPriority() {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    return priority;<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>  @Override public void reset() {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    super.reset();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    priority = 0;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    cellScanner = null;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>}<a name="line.107"></a>
 
 
 


[37/51] [partial] hbase-site git commit: Published site at 18eff3c1c337003b2a419490e621f931d16936fb.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a8725a46/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.CallFuture.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.CallFuture.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.CallFuture.html
index b59d17d..caf98ca 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.CallFuture.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClientImpl.CallFuture.html
@@ -907,428 +907,430 @@
 <span class="sourceLineNo">899</span>        cellBlockBuilder.setLength(cellBlock.limit());<a name="line.899"></a>
 <span class="sourceLineNo">900</span>        builder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.900"></a>
 <span class="sourceLineNo">901</span>      }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      // Only pass priority if there one.  Let zero be same as no priority.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      if (priority != 0) builder.setPriority(priority);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      RequestHeader header = builder.build();<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>      setupIOstreams();<a name="line.906"></a>
+<span class="sourceLineNo">902</span>      // Only pass priority if there is one set.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>      if (priority != PayloadCarryingRpcController.PRIORITY_UNSET) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        builder.setPriority(priority);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      RequestHeader header = builder.build();<a name="line.906"></a>
 <span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      // Now we're going to write the call. We take the lock, then check that the connection<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      //  is still valid, and, if so we do the write to the socket. If the write fails, we don't<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      //  know where we stand, we have to close the connection.<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      checkIsOpen();<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      IOException writeException = null;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      synchronized (this.outLock) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>        if (Thread.interrupted()) throw new InterruptedIOException();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>        calls.put(call.id, call); // We put first as we don't want the connection to become idle.<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        checkIsOpen(); // Now we're checking that it didn't became idle in between.<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>        try {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>          call.callStats.setRequestSizeBytes(IPCUtil.write(this.out, header, call.param,<a name="line.920"></a>
-<span class="sourceLineNo">921</span>              cellBlock));<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        } catch (IOException e) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          // We set the value inside the synchronized block, this way the next in line<a name="line.923"></a>
-<span class="sourceLineNo">924</span>          //  won't even try to write. Otherwise we might miss a call in the calls map?<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          shouldCloseConnection.set(true);<a name="line.925"></a>
-<span class="sourceLineNo">926</span>          writeException = e;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          interrupt();<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        }<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // call close outside of the synchronized (outLock) to prevent deadlock - HBASE-14474<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (writeException != null) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        markClosed(writeException);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        close();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>      // We added a call, and may be started the connection close. In both cases, we<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      //  need to notify the reader.<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      doNotify();<a name="line.939"></a>
-<span class="sourceLineNo">940</span><a name="line.940"></a>
-<span class="sourceLineNo">941</span>      // Now that we notified, we can rethrow the exception if any. Otherwise we're good.<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      if (writeException != null) throw writeException;<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    }<a name="line.943"></a>
-<span class="sourceLineNo">944</span><a name="line.944"></a>
-<span class="sourceLineNo">945</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NN_NAKED_NOTIFY",<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        justification="Presume notifyAll is because we are closing/shutting down")<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    private synchronized void doNotify() {<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      // Make a separate method so can do synchronize and add findbugs annotation; only one<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      // annotation at at time in source 1.7.<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      notifyAll(); // Findbugs: NN_NAKED_NOTIFY<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>    /* Receive a response.<a name="line.953"></a>
-<span class="sourceLineNo">954</span>     * Because only one receiver, so no synchronization on in.<a name="line.954"></a>
-<span class="sourceLineNo">955</span>     */<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    protected void readResponse() {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      if (shouldCloseConnection.get()) return;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      Call call = null;<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      boolean expectedCall = false;<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      try {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>        // See HBaseServer.Call.setResponse for where we write out the response.<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        // Total size of the response.  Unused.  But have to read it in anyways.<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        int totalSize = in.readInt();<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>        // Read the header<a name="line.965"></a>
-<span class="sourceLineNo">966</span>        ResponseHeader responseHeader = ResponseHeader.parseDelimitedFrom(in);<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        int id = responseHeader.getCallId();<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        call = calls.remove(id); // call.done have to be set before leaving this method<a name="line.968"></a>
-<span class="sourceLineNo">969</span>        expectedCall = (call != null &amp;&amp; !call.done);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        if (!expectedCall) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>          // So we got a response for which we have no corresponding 'call' here on the client-side.<a name="line.971"></a>
-<span class="sourceLineNo">972</span>          // We probably timed out waiting, cleaned up all references, and now the server decides<a name="line.972"></a>
-<span class="sourceLineNo">973</span>          // to return a response.  There is nothing we can do w/ the response at this stage. Clean<a name="line.973"></a>
-<span class="sourceLineNo">974</span>          // out the wire of the response so its out of the way and we can get other responses on<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          // this connection.<a name="line.975"></a>
-<span class="sourceLineNo">976</span>          int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>          int whatIsLeftToRead = totalSize - readSoFar;<a name="line.977"></a>
-<span class="sourceLineNo">978</span>          IOUtils.skipFully(in, whatIsLeftToRead);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>          if (call != null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            call.callStats.setResponseSizeBytes(totalSize);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>            call.callStats.setCallTimeMs(<a name="line.981"></a>
-<span class="sourceLineNo">982</span>                EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.982"></a>
-<span class="sourceLineNo">983</span>          }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>          return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        if (responseHeader.hasException()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>          ExceptionResponse exceptionResponse = responseHeader.getException();<a name="line.987"></a>
-<span class="sourceLineNo">988</span>          RemoteException re = createRemoteException(exceptionResponse);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          call.setException(re);<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.990"></a>
-<span class="sourceLineNo">991</span>          call.callStats.setCallTimeMs(<a name="line.991"></a>
-<span class="sourceLineNo">992</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          if (isFatalConnectionException(exceptionResponse)) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>            markClosed(re);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>          }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        } else {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>          Message value = null;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          if (call.responseDefaultType != null) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>            Builder builder = call.responseDefaultType.newBuilderForType();<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            ProtobufUtil.mergeDelimitedFrom(builder, in);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>            value = builder.build();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          }<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          CellScanner cellBlockScanner = null;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          if (responseHeader.hasCellBlockMeta()) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            int size = responseHeader.getCellBlockMeta().getLength();<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            byte [] cellBlock = new byte[size];<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            IOUtils.readFully(this.in, cellBlock, 0, cellBlock.length);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>            cellBlockScanner = ipcUtil.createCellScanner(this.codec, this.compressor, cellBlock);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>          call.setResponse(value, cellBlockScanner);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>          call.callStats.setCallTimeMs(<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        }<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      } catch (IOException e) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        if (expectedCall) call.setException(e);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        if (e instanceof SocketTimeoutException) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          // Clean up open calls but don't treat this as a fatal condition,<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          // since we expect certain responses to not make it by the specified<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          // {@link ConnectionId#rpcTimeout}.<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          if (LOG.isTraceEnabled()) LOG.trace("ignored", e);<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        } else {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>          // Treat this as a fatal condition and close this connection<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>          markClosed(e);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>        }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      } finally {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        cleanupCalls(false);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    }<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    /**<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * @return True if the exception is a fatal connection exception.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     */<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    private boolean isFatalConnectionException(final ExceptionResponse e) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      return e.getExceptionClassName().<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        equals(FatalConnectionException.class.getName());<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    /**<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>     * @param e exception to be wrapped<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>     * @return RemoteException made from passed &lt;code&gt;e&lt;/code&gt;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>     */<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    private RemoteException createRemoteException(final ExceptionResponse e) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      String innerExceptionClassName = e.getExceptionClassName();<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      boolean doNotRetry = e.getDoNotRetry();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      return e.hasHostname()?<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        // If a hostname then add it to the RemoteWithExtrasException<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          e.getStackTrace(), e.getHostname(), e.getPort(), doNotRetry):<a name="line.1049"></a>
+<span class="sourceLineNo">908</span>      setupIOstreams();<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>      // Now we're going to write the call. We take the lock, then check that the connection<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      //  is still valid, and, if so we do the write to the socket. If the write fails, we don't<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      //  know where we stand, we have to close the connection.<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      checkIsOpen();<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      IOException writeException = null;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      synchronized (this.outLock) {<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        if (Thread.interrupted()) throw new InterruptedIOException();<a name="line.916"></a>
+<span class="sourceLineNo">917</span><a name="line.917"></a>
+<span class="sourceLineNo">918</span>        calls.put(call.id, call); // We put first as we don't want the connection to become idle.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>        checkIsOpen(); // Now we're checking that it didn't became idle in between.<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>        try {<a name="line.921"></a>
+<span class="sourceLineNo">922</span>          call.callStats.setRequestSizeBytes(IPCUtil.write(this.out, header, call.param,<a name="line.922"></a>
+<span class="sourceLineNo">923</span>              cellBlock));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        } catch (IOException e) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>          // We set the value inside the synchronized block, this way the next in line<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          //  won't even try to write. Otherwise we might miss a call in the calls map?<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          shouldCloseConnection.set(true);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          writeException = e;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>          interrupt();<a name="line.929"></a>
+<span class="sourceLineNo">930</span>        }<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      // call close outside of the synchronized (outLock) to prevent deadlock - HBASE-14474<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (writeException != null) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        markClosed(writeException);<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        close();<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
+<span class="sourceLineNo">938</span><a name="line.938"></a>
+<span class="sourceLineNo">939</span>      // We added a call, and may be started the connection close. In both cases, we<a name="line.939"></a>
+<span class="sourceLineNo">940</span>      //  need to notify the reader.<a name="line.940"></a>
+<span class="sourceLineNo">941</span>      doNotify();<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>      // Now that we notified, we can rethrow the exception if any. Otherwise we're good.<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (writeException != null) throw writeException;<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="NN_NAKED_NOTIFY",<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        justification="Presume notifyAll is because we are closing/shutting down")<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    private synchronized void doNotify() {<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // Make a separate method so can do synchronize and add findbugs annotation; only one<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      // annotation at at time in source 1.7.<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      notifyAll(); // Findbugs: NN_NAKED_NOTIFY<a name="line.952"></a>
+<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
+<span class="sourceLineNo">954</span><a name="line.954"></a>
+<span class="sourceLineNo">955</span>    /* Receive a response.<a name="line.955"></a>
+<span class="sourceLineNo">956</span>     * Because only one receiver, so no synchronization on in.<a name="line.956"></a>
+<span class="sourceLineNo">957</span>     */<a name="line.957"></a>
+<span class="sourceLineNo">958</span>    protected void readResponse() {<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      if (shouldCloseConnection.get()) return;<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      Call call = null;<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      boolean expectedCall = false;<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      try {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>        // See HBaseServer.Call.setResponse for where we write out the response.<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        // Total size of the response.  Unused.  But have to read it in anyways.<a name="line.964"></a>
+<span class="sourceLineNo">965</span>        int totalSize = in.readInt();<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>        // Read the header<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        ResponseHeader responseHeader = ResponseHeader.parseDelimitedFrom(in);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        int id = responseHeader.getCallId();<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        call = calls.remove(id); // call.done have to be set before leaving this method<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        expectedCall = (call != null &amp;&amp; !call.done);<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        if (!expectedCall) {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          // So we got a response for which we have no corresponding 'call' here on the client-side.<a name="line.973"></a>
+<span class="sourceLineNo">974</span>          // We probably timed out waiting, cleaned up all references, and now the server decides<a name="line.974"></a>
+<span class="sourceLineNo">975</span>          // to return a response.  There is nothing we can do w/ the response at this stage. Clean<a name="line.975"></a>
+<span class="sourceLineNo">976</span>          // out the wire of the response so its out of the way and we can get other responses on<a name="line.976"></a>
+<span class="sourceLineNo">977</span>          // this connection.<a name="line.977"></a>
+<span class="sourceLineNo">978</span>          int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.978"></a>
+<span class="sourceLineNo">979</span>          int whatIsLeftToRead = totalSize - readSoFar;<a name="line.979"></a>
+<span class="sourceLineNo">980</span>          IOUtils.skipFully(in, whatIsLeftToRead);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>          if (call != null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>            call.callStats.setResponseSizeBytes(totalSize);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>            call.callStats.setCallTimeMs(<a name="line.983"></a>
+<span class="sourceLineNo">984</span>                EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.984"></a>
+<span class="sourceLineNo">985</span>          }<a name="line.985"></a>
+<span class="sourceLineNo">986</span>          return;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (responseHeader.hasException()) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          ExceptionResponse exceptionResponse = responseHeader.getException();<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          RemoteException re = createRemoteException(exceptionResponse);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          call.setException(re);<a name="line.991"></a>
+<span class="sourceLineNo">992</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>          call.callStats.setCallTimeMs(<a name="line.993"></a>
+<span class="sourceLineNo">994</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.994"></a>
+<span class="sourceLineNo">995</span>          if (isFatalConnectionException(exceptionResponse)) {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>            markClosed(re);<a name="line.996"></a>
+<span class="sourceLineNo">997</span>          }<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        } else {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>          Message value = null;<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>          if (call.responseDefaultType != null) {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>            Builder builder = call.responseDefaultType.newBuilderForType();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>            ProtobufUtil.mergeDelimitedFrom(builder, in);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>            value = builder.build();<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          }<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>          CellScanner cellBlockScanner = null;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          if (responseHeader.hasCellBlockMeta()) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>            int size = responseHeader.getCellBlockMeta().getLength();<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>            byte [] cellBlock = new byte[size];<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>            IOUtils.readFully(this.in, cellBlock, 0, cellBlock.length);<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>            cellBlockScanner = ipcUtil.createCellScanner(this.codec, this.compressor, cellBlock);<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>          }<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>          call.setResponse(value, cellBlockScanner);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          call.callStats.setResponseSizeBytes(totalSize);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>          call.callStats.setCallTimeMs(<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>              EnvironmentEdgeManager.currentTime() - call.callStats.getStartTime());<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        }<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>      } catch (IOException e) {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        if (expectedCall) call.setException(e);<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        if (e instanceof SocketTimeoutException) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>          // Clean up open calls but don't treat this as a fatal condition,<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>          // since we expect certain responses to not make it by the specified<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>          // {@link ConnectionId#rpcTimeout}.<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>          if (LOG.isTraceEnabled()) LOG.trace("ignored", e);<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>        } else {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>          // Treat this as a fatal condition and close this connection<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>          markClosed(e);<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      } finally {<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>        cleanupCalls(false);<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      }<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span><a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    /**<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>     * @return True if the exception is a fatal connection exception.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>     */<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    private boolean isFatalConnectionException(final ExceptionResponse e) {<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>      return e.getExceptionClassName().<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        equals(FatalConnectionException.class.getName());<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span><a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    /**<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>     * @param e exception to be wrapped<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>     * @return RemoteException made from passed &lt;code&gt;e&lt;/code&gt;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>     */<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    private RemoteException createRemoteException(final ExceptionResponse e) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>      String innerExceptionClassName = e.getExceptionClassName();<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>      boolean doNotRetry = e.getDoNotRetry();<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>      return e.hasHostname()?<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>        // If a hostname then add it to the RemoteWithExtrasException<a name="line.1049"></a>
 <span class="sourceLineNo">1050</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          e.getStackTrace(), doNotRetry);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    protected synchronized boolean markClosed(IOException e) {<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>      if (e == null) throw new NullPointerException();<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      boolean ret = shouldCloseConnection.compareAndSet(false, true);<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      if (ret) {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        if (LOG.isTraceEnabled()) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          LOG.trace(getName() + ": marking at should close, reason: " + e.getMessage());<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>        }<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        if (callSender != null) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          callSender.close();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        }<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        notifyAll();<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      return ret;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    /**<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>     * Cleanup the calls older than a given timeout, in milli seconds.<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>     * @param allCalls true for all calls, false for only the calls in timeout<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>     */<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    protected synchronized void cleanupCalls(boolean allCalls) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      Iterator&lt;Entry&lt;Integer, Call&gt;&gt; itor = calls.entrySet().iterator();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      while (itor.hasNext()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        Call c = itor.next().getValue();<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        if (c.done) {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>          // To catch the calls without timeout that were cancelled.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>          itor.remove();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>        } else if (allCalls) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>          long waitTime = EnvironmentEdgeManager.currentTime() - c.getStartTime();<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          IOException ie = new ConnectionClosingException("Connection to " + getRemoteAddress()<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>              + " is closing. Call id=" + c.id + ", waitTime=" + waitTime);<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          c.setException(ie);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          itor.remove();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        } else if (c.checkAndSetTimeout()) {<a name="line.1088"></a>
+<span class="sourceLineNo">1051</span>          e.getStackTrace(), e.getHostname(), e.getPort(), doNotRetry):<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>        new RemoteWithExtrasException(innerExceptionClassName,<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          e.getStackTrace(), doNotRetry);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    protected synchronized boolean markClosed(IOException e) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      if (e == null) throw new NullPointerException();<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span><a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      boolean ret = shouldCloseConnection.compareAndSet(false, true);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>      if (ret) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>        if (LOG.isTraceEnabled()) {<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          LOG.trace(getName() + ": marking at should close, reason: " + e.getMessage());<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>        if (callSender != null) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>          callSender.close();<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        notifyAll();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      }<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>      return ret;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span><a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    /**<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>     * Cleanup the calls older than a given timeout, in milli seconds.<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>     * @param allCalls true for all calls, false for only the calls in timeout<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>     */<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    protected synchronized void cleanupCalls(boolean allCalls) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>      Iterator&lt;Entry&lt;Integer, Call&gt;&gt; itor = calls.entrySet().iterator();<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      while (itor.hasNext()) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>        Call c = itor.next().getValue();<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        if (c.done) {<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>          // To catch the calls without timeout that were cancelled.<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>          itor.remove();<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        } else if (allCalls) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          long waitTime = EnvironmentEdgeManager.currentTime() - c.getStartTime();<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          IOException ie = new ConnectionClosingException("Connection to " + getRemoteAddress()<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>              + " is closing. Call id=" + c.id + ", waitTime=" + waitTime);<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>          c.setException(ie);<a name="line.1088"></a>
 <span class="sourceLineNo">1089</span>          itor.remove();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        } else {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>          // We expect the call to be ordered by timeout. It may not be the case, but stopping<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>          //  at the first valid call allows to be sure that we still have something to do without<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>          //  spending too much time by reading the full list.<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          break;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span><a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>  /**<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>   * Used in test only. Construct an IPC cluster client whose values are of the<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>   * {@link Message} class.<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>   * @param conf configuration<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>   * @param clusterId the cluster id<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>   * @param factory socket factory<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>   */<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  @VisibleForTesting<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory) {<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    this(conf, clusterId, factory, null, null);<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span><a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  /**<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>   * Construct an IPC cluster client whose values are of the {@link Message} class.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>   * @param conf configuration<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>   * @param clusterId the cluster id<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>   * @param factory socket factory<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>   * @param localAddr client socket bind address<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>   * @param metrics the connection metrics<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>   */<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory,<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      SocketAddress localAddr, MetricsConnection metrics) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    super(conf, clusterId, localAddr, metrics);<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    this.socketFactory = factory;<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    this.connections = new PoolMap&lt;ConnectionId, Connection&gt;(getPoolType(conf), getPoolSize(conf));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    this.failedServers = new FailedServers(conf);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>  }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>  /**<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   * Used in test only. Construct an IPC client for the cluster {@code clusterId} with<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>   * the default SocketFactory<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>   */<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>  @VisibleForTesting<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>  RpcClientImpl(Configuration conf, String clusterId) {<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), null, null);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>  }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span><a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  /**<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>   * Construct an IPC client for the cluster {@code clusterId} with the default SocketFactory<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   *<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * This method is called with reflection by the RpcClientFactory to create an instance<a name="line.1141"></a>
+<span class="sourceLineNo">1090</span>        } else if (c.checkAndSetTimeout()) {<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>          itor.remove();<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>        } else {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>          // We expect the call to be ordered by timeout. It may not be the case, but stopping<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>          //  at the first valid call allows to be sure that we still have something to do without<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          //  spending too much time by reading the full list.<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>          break;<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>        }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  }<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span><a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>  /**<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * Used in test only. Construct an IPC cluster client whose values are of the<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   * {@link Message} class.<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>   * @param conf configuration<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>   * @param clusterId the cluster id<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>   * @param factory socket factory<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>   */<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>  @VisibleForTesting<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory) {<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    this(conf, clusterId, factory, null, null);<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  /**<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>   * Construct an IPC cluster client whose values are of the {@link Message} class.<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>   * @param conf configuration<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>   * @param clusterId the cluster id<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>   * @param factory socket factory<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>   * @param localAddr client socket bind address<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>   * @param metrics the connection metrics<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>   */<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  RpcClientImpl(Configuration conf, String clusterId, SocketFactory factory,<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      SocketAddress localAddr, MetricsConnection metrics) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    super(conf, clusterId, localAddr, metrics);<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span><a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    this.socketFactory = factory;<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    this.connections = new PoolMap&lt;ConnectionId, Connection&gt;(getPoolType(conf), getPoolSize(conf));<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    this.failedServers = new FailedServers(conf);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span><a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>  /**<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>   * Used in test only. Construct an IPC client for the cluster {@code clusterId} with<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>   * the default SocketFactory<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   */<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>  @VisibleForTesting<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>  RpcClientImpl(Configuration conf, String clusterId) {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), null, null);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>  /**<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>   * Construct an IPC client for the cluster {@code clusterId} with the default SocketFactory<a name="line.1141"></a>
 <span class="sourceLineNo">1142</span>   *<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>   * @param conf configuration<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   * @param clusterId the cluster id<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>   * @param localAddr client socket bind address.<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @param metrics the connection metrics<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public RpcClientImpl(Configuration conf, String clusterId, SocketAddress localAddr,<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      MetricsConnection metrics) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), localAddr, metrics);<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>  }<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>  /** Stop all threads related to this client.  No further calls may be made<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   * using this client. */<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>  @Override<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>  public void close() {<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    if (LOG.isDebugEnabled()) LOG.debug("Stopping rpc client");<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    if (!running.compareAndSet(true, false)) return;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    Set&lt;Connection&gt; connsToClose = null;<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    // wake up all connections<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    synchronized (connections) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      for (Connection conn : connections.values()) {<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>        conn.interrupt();<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>        if (conn.callSender != null) {<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          conn.callSender.interrupt();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>        // In case the CallSender did not setupIOStreams() yet, the Connection may not be started<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        // at all (if CallSender has a cancelled Call it can happen). See HBASE-13851<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        if (!conn.isAlive()) {<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          if (connsToClose == null) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>            connsToClose = new HashSet&lt;Connection&gt;();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          connsToClose.add(conn);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>      }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    if (connsToClose != null) {<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      for (Connection conn : connsToClose) {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>        if (conn.markClosed(new InterruptedIOException("RpcClient is closing"))) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>          conn.close();<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>        }<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    // wait until all connections are closed<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    while (!connections.isEmpty()) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>      try {<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>        Thread.sleep(10);<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      } catch (InterruptedException e) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        LOG.info("Interrupted while stopping the client. We still have " + connections.size() +<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            " connections.");<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Thread.currentThread().interrupt();<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        return;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>  }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span><a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>  /** Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>   * threw an exception.<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>   *          {@link UserProvider#getCurrent()} makes a new instance of User each time so will be a<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   *          new Connection each time.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>   * @throws InterruptedException<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>   * @throws IOException<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   */<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  @Override<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>  protected Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc, MethodDescriptor md,<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>      Message param, Message returnType, User ticket, InetSocketAddress addr,<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      MetricsConnection.CallStats callStats)<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      throws IOException, InterruptedException {<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    if (pcrc == null) {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      pcrc = new PayloadCarryingRpcController();<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>    CellScanner cells = pcrc.cellScanner();<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span><a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    final Call call = new Call(this.callIdCnt.getAndIncrement(), md, param, cells, returnType,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        pcrc.getCallTimeout(), MetricsConnection.newCallStats());<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    final Connection connection = getConnection(ticket, call, addr);<a name="line.1224"></a>
+<span class="sourceLineNo">1143</span>   * This method is called with reflection by the RpcClientFactory to create an instance<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   *<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * @param conf configuration<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   * @param clusterId the cluster id<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * @param localAddr client socket bind address.<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * @param metrics the connection metrics<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  public RpcClientImpl(Configuration conf, String clusterId, SocketAddress localAddr,<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>      MetricsConnection metrics) {<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    this(conf, clusterId, NetUtils.getDefaultSocketFactory(conf), localAddr, metrics);<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  }<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  /** Stop all threads related to this client.  No further calls may be made<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * using this client. */<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>  @Override<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  public void close() {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    if (LOG.isDebugEnabled()) LOG.debug("Stopping rpc client");<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    if (!running.compareAndSet(true, false)) return;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span><a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    Set&lt;Connection&gt; connsToClose = null;<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    // wake up all connections<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    synchronized (connections) {<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      for (Connection conn : connections.values()) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>        conn.interrupt();<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>        if (conn.callSender != null) {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>          conn.callSender.interrupt();<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        // In case the CallSender did not setupIOStreams() yet, the Connection may not be started<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>        // at all (if CallSender has a cancelled Call it can happen). See HBASE-13851<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        if (!conn.isAlive()) {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>          if (connsToClose == null) {<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>            connsToClose = new HashSet&lt;Connection&gt;();<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          }<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>          connsToClose.add(conn);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>      }<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    if (connsToClose != null) {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      for (Connection conn : connsToClose) {<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>        if (conn.markClosed(new InterruptedIOException("RpcClient is closing"))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>          conn.close();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>        }<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>      }<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    }<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    // wait until all connections are closed<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>    while (!connections.isEmpty()) {<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      try {<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        Thread.sleep(10);<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>      } catch (InterruptedException e) {<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        LOG.info("Interrupted while stopping the client. We still have " + connections.size() +<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>            " connections.");<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        Thread.currentThread().interrupt();<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>        return;<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>  /** Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>   * threw an exception.<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   *          {@link UserProvider#getCurrent()} makes a new instance of User each time so will be a<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>   *          new Connection each time.<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   * @throws InterruptedException<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   * @throws IOException<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   */<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>  @Override<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  protected Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc, MethodDescriptor md,<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      Message param, Message returnType, User ticket, InetSocketAddress addr,<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      MetricsConnection.CallStats callStats)<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>      throws IOException, InterruptedException {<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    if (pcrc == null) {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      pcrc = new PayloadCarryingRpcController();<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>    }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    CellScanner cells = pcrc.cellScanner();<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span><a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    final Call call = new Call(this.callIdCnt.getAndIncrement(), md, param, cells, returnType,<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>        pcrc.getCallTimeout(), MetricsConnection.newCallStats());<a name="line.1224"></a>
 <span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final CallFuture cts;<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    if (connection.callSender != null) {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      cts = connection.callSender.sendCall(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>        pcrc.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>          @Override<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>          public void run(Object parameter) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>            connection.callSender.remove(cts);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>          }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        });<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>        if (pcrc.isCanceled()) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>          // To finish if the call was cancelled before we set the notification (race condition)<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>          call.callComplete();<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>          return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>        }<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    } else {<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>      cts = null;<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      connection.tracedWriteRequest(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    while (!call.done) {<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      if (call.checkAndSetTimeout()) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        break;<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      }<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      if (connection.shouldCloseConnection.get()) {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>        throw new ConnectionClosingException("Call id=" + call.id +<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>            " on server " + addr + " aborted: connection is closing");<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>      try {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>        synchronized (call) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>          if (call.done) break;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>          call.wait(Math.min(call.remainingTime(), 1000) + 1);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      } catch (InterruptedException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>        call.setException(new InterruptedIOException());<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>        throw e;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    }<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span><a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    if (call.error != null) {<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      if (call.error instanceof RemoteException) {<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>        call.error.fillInStackTrace();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>        throw call.error;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>      }<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      // local exception<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      throw wrapException(addr, call.error);<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    }<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span><a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>  }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span><a name="line.1277"></a>
-<span class="sourceLineNo">1278</span><a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>  /**<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>   * Interrupt the connections to the given ip:port server. This should be called if the server<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>   *  is known as actually dead. This will not prevent current operation to be retried, and,<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>   *  depending on their own behavior, they may retry on the same server. This can be a feature,<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   *  for example at startup. In any case, they're likely to get connection refused (if the<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *  process died) or no route to host: i.e. their next retries should be faster and with a<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   *  safe exception.<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   */<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  @Override<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  public void cancelConnections(ServerName sn) {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    synchronized (connections) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      for (Connection connection : connections.values()) {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        if (connection.isAlive() &amp;&amp;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>            connection.getRemoteAddress().getPort() == sn.getPort() &amp;&amp;<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>            connection.getRemoteAddress().getHostName().equals(sn.getHostname())) {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>          LOG.info("The server on " + sn.toString() +<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>              " is dead - stopping the connection " + connection.remoteId);<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>          connection.interrupt(); // We're interrupting a Reader. It means we want it to finish.<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>                                  // This will close the connection as well.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>        }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      }<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>  }<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span><a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>  /**<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>   *  Get a connection from the pool, or create a new one and add it to the<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>   * pool. Connections to a given host/port are reused.<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>   */<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>  protected Connection getConnection(User ticket, Call call, InetSocketAddress addr)<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  throws IOException {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    if (!running.get()) throw new StoppedRpcClientException();<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    Connection connection;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    ConnectionId remoteId =<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      new ConnectionId(ticket, call.md.getService().getName(), addr);<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    synchronized (connections) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      connection = connections.get(remoteId);<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      if (connection == null) {<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        connection = createConnection(remoteId, this.codec, this.compressor);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>        connections.put(remoteId, connection);<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      }<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span><a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    return connection;<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>  }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>}<a name="line.1323"></a>
+<span class="sourceLineNo">1226</span>    final Connection connection = getConnection(ticket, call, addr);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    final CallFuture cts;<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    if (connection.callSender != null) {<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>      cts = connection.callSender.sendCall(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>        pcrc.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>          @Override<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>          public void run(Object parameter) {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>            connection.callSender.remove(cts);<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>          }<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>        });<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>        if (pcrc.isCanceled()) {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>          // To finish if the call was cancelled before we set the notification (race condition)<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>          call.callComplete();<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>        }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    } else {<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>      cts = null;<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>      connection.tracedWriteRequest(call, pcrc.getPriority(), Trace.currentSpan());<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    }<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    while (!call.done) {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      if (call.checkAndSetTimeout()) {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>        break;<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      if (connection.shouldCloseConnection.get()) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        throw new ConnectionClosingException("Call id=" + call.id +<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>            " on server " + addr + " aborted: connection is closing");<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>      }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      try {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>        synchronized (call) {<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>          if (call.done) break;<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>          call.wait(Math.min(call.remainingTime(), 1000) + 1);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>        }<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      } catch (InterruptedException e) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        call.setException(new InterruptedIOException());<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        if (cts != null) connection.callSender.remove(cts);<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        throw e;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span><a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    if (call.error != null) {<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>      if (call.error instanceof RemoteException) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        call.error.fillInStackTrace();<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>        throw call.error;<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>      }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      // local exception<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>      throw wrapException(addr, call.error);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>    }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span><a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>    return new Pair&lt;Message, CellScanner&gt;(call.response, call.cells);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>  }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span><a name="line.1279"></a>
+<span class="sourceLineNo">1280</span><a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>  /**<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>   * Interrupt the connections to the given ip:port server. This should be called if the server<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   *  is known as actually dead. This will not prevent current operation to be retried, and,<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>   *  depending on their own behavior, they may retry on the same server. This can be a feature,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>   *  for example at startup. In any case, they're likely to get connection refused (if the<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>   *  process died) or no route to host: i.e. their next retries should be faster and with a<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>   *  safe exception.<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>   */<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>  @Override<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>  public void cancelConnections(ServerName sn) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    synchronized (connections) {<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      for (Connection connection : connections.values()) {<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>        if (connection.isAlive() &amp;&amp;<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>            connection.getRemoteAddress().getPort() == sn.getPort() &amp;&amp;<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>            connection.getRemoteAddress().getHostName().equals(sn.getHostname())) {<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>          LOG.info("The server on " + sn.toString() +<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>              " is dead - stopping the connection " + connection.remoteId);<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>          connection.interrupt(); // We're interrupting a Reader. It means we want it to finish.<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>                                  // This will close the connection as well.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    }<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  /**<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>   *  Get a connection from the pool, or create a new one and add it to the<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>   * pool. Connections to a given host/port are reused.<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>   */<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  protected Connection getConnection(User ticket, Call call, InetSocketAddress addr)<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  throws IOException {<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>    if (!running.get()) throw new StoppedRpcClientException();<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>    Connection connection;<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>    ConnectionId remoteId =<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>      new ConnectionId(ticket, call.md.getService().getName(), addr);<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    synchronized (connections) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>      connection = connections.get(remoteId);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      if (connection == null) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>        connection = createConnection(remoteId, this.codec, this.compressor);<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>        connections.put(remoteId, connection);<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>      }<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    }<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span><a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    return connection;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>  }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>}<a name="line.1325"></a>