http://git-wip-us.apache.org/repos/asf/hbase-site/blob/5eb82203/devapidocs/src-html/org/apache/hadoop/hbase/client/ClientScanner.html
----------------------------------------------------------------------
diff --git 
a/devapidocs/src-html/org/apache/hadoop/hbase/client/ClientScanner.html 
b/devapidocs/src-html/org/apache/hadoop/hbase/client/ClientScanner.html
index c971a4e..6296370 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ClientScanner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ClientScanner.html
@@ -389,414 +389,409 @@
 <span class="sourceLineNo">381</span>    Result[] values = null;<a 
name="line.381"></a>
 <span class="sourceLineNo">382</span>    long remainingResultSize = 
maxScannerResultSize;<a name="line.382"></a>
 <span class="sourceLineNo">383</span>    int countdown = this.caching;<a 
name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    // We need to reset it if it's a new 
callable that was created<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // with a countdown in nextScanner<a 
name="line.386"></a>
-<span class="sourceLineNo">387</span>    callable.setCaching(this.caching);<a 
name="line.387"></a>
-<span class="sourceLineNo">388</span>    // This flag is set when we want to 
skip the result returned. We do<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // this when we reset scanner because 
it split under us.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    boolean retryAfterOutOfOrderException 
= true;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    // We don't expect that the server 
will have more results for us if<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // it doesn't tell us otherwise. We 
rely on the size or count of results<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    boolean serverHasMoreResults = 
false;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    do {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      try {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        // Server returns a null values 
if scanning is to stop. Else,<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        // returns an empty array if 
scanning is to go on and we've just<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        // exhausted current region.<a 
name="line.398"></a>
-<span class="sourceLineNo">399</span>        values = call(callable, caller, 
scannerTimeout);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        // When the replica switch 
happens, we need to do certain operations<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        // again. The callable will 
openScanner with the right startkey<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        // but we need to pick up from 
there. Bypass the rest of the loop<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        // and let the catch-up happen in 
the beginning of the loop as it<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        // happens for the cases where we 
see exceptions. Since only openScanner<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        // would have happened, values 
would be null<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        if (values == null &amp;&amp; 
callable.switchedToADifferentReplica()) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>          // Any accumulated partial 
results are no longer valid since the callable will<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          // openScanner with the correct 
startkey and we must pick up from there<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          clearPartialResults();<a 
name="line.409"></a>
-<span class="sourceLineNo">410</span>          this.currentRegion = 
callable.getHRegionInfo();<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          continue;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        retryAfterOutOfOrderException = 
true;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      } catch (DoNotRetryIOException e) 
{<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        // An exception was thrown which 
makes any partial results that we were collecting<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        // invalid. The scanner will need 
to be reset to the beginning of a row.<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        clearPartialResults();<a 
name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // DNRIOEs are thrown to make us 
break out of retries. Some types of DNRIOEs want us<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        // to reset the scanner and come 
back in again.<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        if (e instanceof 
UnknownScannerException) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          long timeout = lastNext + 
scannerTimeout;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          // If we are over the timeout, 
throw this exception to the client wrapped in<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          // a ScannerTimeoutException. 
Else, it's because the region moved and we used the old<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          // id against the new region 
server; reset the scanner.<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          if (timeout &lt; 
System.currentTimeMillis()) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>            LOG.info("For hints related 
to the following exception, please try taking a look at: " +<a 
name="line.427"></a>
-<span class="sourceLineNo">428</span>                
"https://hbase.apache.org/book.html#trouble.client.scantimeout";);<a 
name="line.428"></a>
-<span class="sourceLineNo">429</span>            long elapsed = 
System.currentTimeMillis() - lastNext;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>            ScannerTimeoutException ex 
=<a name="line.430"></a>
-<span class="sourceLineNo">431</span>                new 
ScannerTimeoutException(elapsed + "ms passed since the last invocation, "<a 
name="line.431"></a>
-<span class="sourceLineNo">432</span>                    + "timeout is 
currently set to " + scannerTimeout);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>            ex.initCause(e);<a 
name="line.433"></a>
-<span class="sourceLineNo">434</span>            throw ex;<a 
name="line.434"></a>
-<span class="sourceLineNo">435</span>          }<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        } else {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          // If exception is any but the 
list below throw it back to the client; else setup<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          // the scanner and retry.<a 
name="line.438"></a>
-<span class="sourceLineNo">439</span>          Throwable cause = 
e.getCause();<a name="line.439"></a>
-<span class="sourceLineNo">440</span>          if ((cause != null &amp;&amp; 
cause instanceof NotServingRegionException) ||<a name="line.440"></a>
-<span class="sourceLineNo">441</span>              (cause != null &amp;&amp; 
cause instanceof RegionServerStoppedException) ||<a name="line.441"></a>
-<span class="sourceLineNo">442</span>              e instanceof 
OutOfOrderScannerNextException) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>            // Pass<a name="line.443"></a>
-<span class="sourceLineNo">444</span>            // It is easier writing the 
if loop test as list of what is allowed rather than<a name="line.444"></a>
-<span class="sourceLineNo">445</span>            // as a list of what is not 
allowed... so if in here, it means we do not throw.<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          } else {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>            throw e;<a 
name="line.447"></a>
-<span class="sourceLineNo">448</span>          }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        }<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        // Else, its signal from depths 
of ScannerCallable that we need to reset the scanner.<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        if (this.lastResult != null) {<a 
name="line.451"></a>
-<span class="sourceLineNo">452</span>          // The region has moved. We 
need to open a brand new scanner at<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          // the new location.<a 
name="line.453"></a>
-<span class="sourceLineNo">454</span>          // Reset the startRow to the 
row we've seen last so that the new<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          // scanner starts at the 
correct row. Otherwise we may see previously<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          // returned rows again.<a 
name="line.456"></a>
-<span class="sourceLineNo">457</span>          // (ScannerCallable by now has 
"relocated" the correct region)<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          if (scan.isReversed()) {<a 
name="line.458"></a>
-<span class="sourceLineNo">459</span>            
scan.setStartRow(createClosestRowBefore(lastResult.getRow()));<a 
name="line.459"></a>
+<span class="sourceLineNo">384</span>    // We need to reset it if it's a new 
callable that was created with a countdown in nextScanner<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    callable.setCaching(this.caching);<a 
name="line.385"></a>
+<span class="sourceLineNo">386</span>    // This flag is set when we want to 
skip the result returned. We do<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    // this when we reset scanner because 
it split under us.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    boolean retryAfterOutOfOrderException 
= true;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    // We don't expect that the server 
will have more results for us if<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    // it doesn't tell us otherwise. We 
rely on the size or count of results<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    boolean serverHasMoreResults = 
false;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    do {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      try {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        // Server returns a null values 
if scanning is to stop. Else,<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        // returns an empty array if 
scanning is to go on and we've just<a name="line.395"></a>
+<span class="sourceLineNo">396</span>        // exhausted current region.<a 
name="line.396"></a>
+<span class="sourceLineNo">397</span>        values = call(callable, caller, 
scannerTimeout);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        // When the replica switch 
happens, we need to do certain operations again.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        // The callable will openScanner 
with the right startkey but we need to pick up<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        // from there. Bypass the rest of 
the loop and let the catch-up happen in the beginning<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        // of the loop as it happens for 
the cases where we see exceptions.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        // Since only openScanner would 
have happened, values would be null<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        if (values == null &amp;&amp; 
callable.switchedToADifferentReplica()) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          // Any accumulated partial 
results are no longer valid since the callable will<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          // openScanner with the correct 
startkey and we must pick up from there<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          clearPartialResults();<a 
name="line.406"></a>
+<span class="sourceLineNo">407</span>          this.currentRegion = 
callable.getHRegionInfo();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          continue;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        retryAfterOutOfOrderException = 
true;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      } catch (DoNotRetryIOException e) 
{<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        // An exception was thrown which 
makes any partial results that we were collecting<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        // invalid. The scanner will need 
to be reset to the beginning of a row.<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        clearPartialResults();<a 
name="line.414"></a>
+<span class="sourceLineNo">415</span>        // DNRIOEs are thrown to make us 
break out of retries. Some types of DNRIOEs want us<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        // to reset the scanner and come 
back in again.<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        if (e instanceof 
UnknownScannerException) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          long timeout = lastNext + 
scannerTimeout;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          // If we are over the timeout, 
throw this exception to the client wrapped in<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          // a ScannerTimeoutException. 
Else, it's because the region moved and we used the old<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          // id against the new region 
server; reset the scanner.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          if (timeout &lt; 
System.currentTimeMillis()) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>            LOG.info("For hints related 
to the following exception, please try taking a look at: "<a 
name="line.423"></a>
+<span class="sourceLineNo">424</span>                    + 
"https://hbase.apache.org/book.html#trouble.client.scantimeout";);<a 
name="line.424"></a>
+<span class="sourceLineNo">425</span>            long elapsed = 
System.currentTimeMillis() - lastNext;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>            ScannerTimeoutException ex 
=<a name="line.426"></a>
+<span class="sourceLineNo">427</span>                new 
ScannerTimeoutException(elapsed + "ms passed since the last invocation, "<a 
name="line.427"></a>
+<span class="sourceLineNo">428</span>                    + "timeout is 
currently set to " + scannerTimeout);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>            ex.initCause(e);<a 
name="line.429"></a>
+<span class="sourceLineNo">430</span>            throw ex;<a 
name="line.430"></a>
+<span class="sourceLineNo">431</span>          }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        } else {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>          // If exception is any but the 
list below throw it back to the client; else setup<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          // the scanner and retry.<a 
name="line.434"></a>
+<span class="sourceLineNo">435</span>          Throwable cause = 
e.getCause();<a name="line.435"></a>
+<span class="sourceLineNo">436</span>          if ((cause != null &amp;&amp; 
cause instanceof NotServingRegionException) ||<a name="line.436"></a>
+<span class="sourceLineNo">437</span>              (cause != null &amp;&amp; 
cause instanceof RegionServerStoppedException) ||<a name="line.437"></a>
+<span class="sourceLineNo">438</span>              e instanceof 
OutOfOrderScannerNextException) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            // Pass. It is easier writing 
the if loop test as list of what is allowed rather than<a name="line.439"></a>
+<span class="sourceLineNo">440</span>            // as a list of what is not 
allowed... so if in here, it means we do not throw.<a name="line.440"></a>
+<span class="sourceLineNo">441</span>          } else {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>            throw e;<a 
name="line.442"></a>
+<span class="sourceLineNo">443</span>          }<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        // Else, its signal from depths 
of ScannerCallable that we need to reset the scanner.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        if (this.lastResult != null) {<a 
name="line.446"></a>
+<span class="sourceLineNo">447</span>          // The region has moved. We 
need to open a brand new scanner at the new location.<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          // Reset the startRow to the 
row we've seen last so that the new scanner starts at<a name="line.448"></a>
+<span class="sourceLineNo">449</span>          // the correct row. Otherwise 
we may see previously returned rows again.<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          // (ScannerCallable by now has 
"relocated" the correct region)<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          if (scan.isReversed()) {<a 
name="line.451"></a>
+<span class="sourceLineNo">452</span>            
scan.setStartRow(createClosestRowBefore(lastResult.getRow()));<a 
name="line.452"></a>
+<span class="sourceLineNo">453</span>          } else {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            
scan.setStartRow(Bytes.add(lastResult.getRow(), new byte[1]));<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>        if (e instanceof 
OutOfOrderScannerNextException) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>          if 
(retryAfterOutOfOrderException) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            retryAfterOutOfOrderException 
= false;<a name="line.459"></a>
 <span class="sourceLineNo">460</span>          } else {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            
scan.setStartRow(Bytes.add(lastResult.getRow(), new byte[1]));<a 
name="line.461"></a>
-<span class="sourceLineNo">462</span>          }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        if (e instanceof 
OutOfOrderScannerNextException) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          if 
(retryAfterOutOfOrderException) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>            retryAfterOutOfOrderException 
= false;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          } else {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>            // TODO: Why wrap this in a 
DNRIOE when it already is a DNRIOE?<a name="line.468"></a>
-<span class="sourceLineNo">469</span>            throw new 
DoNotRetryIOException("Failed after retry of " +<a name="line.469"></a>
-<span class="sourceLineNo">470</span>                
"OutOfOrderScannerNextException: was there a rpc timeout?", e);<a 
name="line.470"></a>
-<span class="sourceLineNo">471</span>          }<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        // Clear region.<a 
name="line.473"></a>
-<span class="sourceLineNo">474</span>        this.currentRegion = null;<a 
name="line.474"></a>
-<span class="sourceLineNo">475</span>        // Set this to zero so we don't 
try and do an rpc and close on remote server when<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        // the exception we got was 
UnknownScanner or the Server is going down.<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        callable = null;<a 
name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>        // This continue will take us to 
while at end of loop where we will set up new scanner.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        continue;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      long currentTime = 
System.currentTimeMillis();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      if (this.scanMetrics != null) {<a 
name="line.483"></a>
-<span class="sourceLineNo">484</span>        
this.scanMetrics.sumOfMillisSecBetweenNexts.addAndGet(currentTime - 
lastNext);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      lastNext = currentTime;<a 
name="line.486"></a>
-<span class="sourceLineNo">487</span>      // Groom the array of Results that 
we received back from the server before adding that<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      // Results to the scanner's cache. 
If partial results are not allowed to be seen by the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      // caller, all book keeping will be 
performed within this method.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      List&lt;Result&gt; 
resultsToAddToCache =<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          getResultsToAddToCache(values, 
callable.isHeartbeatMessage());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      if (!resultsToAddToCache.isEmpty()) 
{<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        for (Result rs : 
resultsToAddToCache) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          cache.add(rs);<a 
name="line.494"></a>
-<span class="sourceLineNo">495</span>          long estimatedHeapSizeOfResult 
= calcEstimatedSize(rs);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          countdown--;<a 
name="line.496"></a>
-<span class="sourceLineNo">497</span>          remainingResultSize -= 
estimatedHeapSizeOfResult;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          
addEstimatedSize(estimatedHeapSizeOfResult);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          this.lastResult = rs;<a 
name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>      // Caller of this method just wants 
a Result. If we see a heartbeat message, it means<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      // processing of the scan is taking 
a long time server side. Rather than continue to<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      // loop until a limit (e.g. size or 
caching) is reached, break out early to avoid causing<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      // unnecesary delays to the 
caller<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      if (callable.isHeartbeatMessage() 
&amp;&amp; cache.size() &gt; 0) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        if (LOG.isTraceEnabled()) {<a 
name="line.508"></a>
-<span class="sourceLineNo">509</span>          LOG.trace("Heartbeat message 
received and cache contains Results."<a name="line.509"></a>
-<span class="sourceLineNo">510</span>              + " Breaking out of scan 
loop");<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        break;<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>      // We expect that the server won't 
have more results for us when we exhaust<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      // the size (bytes or count) of the 
results returned. If the server *does* inform us that<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      // there are more results, we want 
to avoid possiblyNextScanner(...). Only when we actually<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      // get results is the moreResults 
context valid.<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      if (null != values &amp;&amp; 
values.length &gt; 0 &amp;&amp; callable.hasMoreResultsContext()) {<a 
name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Only adhere to more server 
results when we don't have any partialResults<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        // as it keeps the outer loop 
logic the same.<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        serverHasMoreResults = 
callable.getServerHasMoreResults() &amp; partialResults.isEmpty();<a 
name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      // Values == null means server-side 
filter has determined we must STOP<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      // !partialResults.isEmpty() means 
that we are still accumulating partial Results for a<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // row. We should not change 
scanners before we receive all the partial Results for that<a 
name="line.526"></a>
-<span class="sourceLineNo">527</span>      // row.<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    } while 
(doneWithRegion(remainingResultSize, countdown, serverHasMoreResults)<a 
name="line.528"></a>
-<span class="sourceLineNo">529</span>        &amp;&amp; 
(!partialResults.isEmpty() || possiblyNextScanner(countdown, values == 
null)));<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  /**<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @param remainingResultSize<a 
name="line.533"></a>
-<span class="sourceLineNo">534</span>   * @param remainingRows<a 
name="line.534"></a>
-<span class="sourceLineNo">535</span>   * @param regionHasMoreResults<a 
name="line.535"></a>
-<span class="sourceLineNo">536</span>   * @return true when the current region 
has been exhausted. When the current region has been<a name="line.536"></a>
-<span class="sourceLineNo">537</span>   *         exhausted, the region must 
be changed before scanning can continue<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  private boolean doneWithRegion(long 
remainingResultSize, int remainingRows,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      boolean regionHasMoreResults) {<a 
name="line.540"></a>
-<span class="sourceLineNo">541</span>    return remainingResultSize &gt; 0 
&amp;&amp; remainingRows &gt; 0 &amp;&amp; !regionHasMoreResults;<a 
name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  protected long calcEstimatedSize(Result 
rs) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    long estimatedHeapSizeOfResult = 0;<a 
name="line.545"></a>
-<span class="sourceLineNo">546</span>    // We don't make Iterator here<a 
name="line.546"></a>
-<span class="sourceLineNo">547</span>    for (Cell cell : rs.rawCells()) {<a 
name="line.547"></a>
-<span class="sourceLineNo">548</span>      estimatedHeapSizeOfResult += 
CellUtil.estimatedHeapSizeOf(cell);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return estimatedHeapSizeOfResult;<a 
name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  protected void addEstimatedSize(long 
estimatedHeapSizeOfResult) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return;<a name="line.554"></a>
+<span class="sourceLineNo">461</span>            // TODO: Why wrap this in a 
DNRIOE when it already is a DNRIOE?<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            throw new 
DoNotRetryIOException("Failed after retry of " +<a name="line.462"></a>
+<span class="sourceLineNo">463</span>                
"OutOfOrderScannerNextException: was there a rpc timeout?", e);<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>        // Clear region.<a 
name="line.466"></a>
+<span class="sourceLineNo">467</span>        this.currentRegion = null;<a 
name="line.467"></a>
+<span class="sourceLineNo">468</span>        // Set this to zero so we don't 
try and do an rpc and close on remote server when<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        // the exception we got was 
UnknownScanner or the Server is going down.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        callable = null;<a 
name="line.470"></a>
+<span class="sourceLineNo">471</span>        // This continue will take us to 
while at end of loop where we will set up new scanner.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        continue;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      long currentTime = 
System.currentTimeMillis();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      if (this.scanMetrics != null) {<a 
name="line.475"></a>
+<span class="sourceLineNo">476</span>        
this.scanMetrics.sumOfMillisSecBetweenNexts.addAndGet(currentTime - 
lastNext);<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      }<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      lastNext = currentTime;<a 
name="line.478"></a>
+<span class="sourceLineNo">479</span>      // Groom the array of Results that 
we received back from the server before adding that<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      // Results to the scanner's cache. 
If partial results are not allowed to be seen by the<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      // caller, all book keeping will be 
performed within this method.<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      List&lt;Result&gt; 
resultsToAddToCache =<a name="line.482"></a>
+<span class="sourceLineNo">483</span>          getResultsToAddToCache(values, 
callable.isHeartbeatMessage());<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      if (!resultsToAddToCache.isEmpty()) 
{<a name="line.484"></a>
+<span class="sourceLineNo">485</span>        for (Result rs : 
resultsToAddToCache) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>          cache.add(rs);<a 
name="line.486"></a>
+<span class="sourceLineNo">487</span>          long estimatedHeapSizeOfResult 
= calcEstimatedSize(rs);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>          countdown--;<a 
name="line.488"></a>
+<span class="sourceLineNo">489</span>          remainingResultSize -= 
estimatedHeapSizeOfResult;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>          
addEstimatedSize(estimatedHeapSizeOfResult);<a name="line.490"></a>
+<span class="sourceLineNo">491</span>          this.lastResult = rs;<a 
name="line.491"></a>
+<span class="sourceLineNo">492</span>        }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      }<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      if (callable.isHeartbeatMessage()) 
{<a name="line.494"></a>
+<span class="sourceLineNo">495</span>        if (cache.size() &gt; 0) {<a 
name="line.495"></a>
+<span class="sourceLineNo">496</span>          // Caller of this method just 
wants a Result. If we see a heartbeat message, it means<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          // processing of the scan is 
taking a long time server side. Rather than continue to<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          // loop until a limit (e.g. 
size or caching) is reached, break out early to avoid causing<a 
name="line.498"></a>
+<span class="sourceLineNo">499</span>          // unnecesary delays to the 
caller<a name="line.499"></a>
+<span class="sourceLineNo">500</span>          if (LOG.isTraceEnabled()) {<a 
name="line.500"></a>
+<span class="sourceLineNo">501</span>            LOG.trace("Heartbeat message 
received and cache contains Results."<a name="line.501"></a>
+<span class="sourceLineNo">502</span>                    + " Breaking out of 
scan loop");<a name="line.502"></a>
+<span class="sourceLineNo">503</span>          }<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          break;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        continue;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>      // We expect that the server won't 
have more results for us when we exhaust<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      // the size (bytes or count) of the 
results returned. If the server *does* inform us that<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      // there are more results, we want 
to avoid possiblyNextScanner(...). Only when we actually<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      // get results is the moreResults 
context valid.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      if (null != values &amp;&amp; 
values.length &gt; 0 &amp;&amp; callable.hasMoreResultsContext()) {<a 
name="line.513"></a>
+<span class="sourceLineNo">514</span>        // Only adhere to more server 
results when we don't have any partialResults<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        // as it keeps the outer loop 
logic the same.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        serverHasMoreResults = 
callable.getServerHasMoreResults() &amp;&amp; partialResults.isEmpty();<a 
name="line.516"></a>
+<span class="sourceLineNo">517</span>      }<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      // Values == null means server-side 
filter has determined we must STOP<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      // !partialResults.isEmpty() means 
that we are still accumulating partial Results for a<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      // row. We should not change 
scanners before we receive all the partial Results for that<a 
name="line.520"></a>
+<span class="sourceLineNo">521</span>      // row.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    } while ((callable != null &amp;&amp; 
callable.isHeartbeatMessage())<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        || 
(doneWithRegion(remainingResultSize, countdown, serverHasMoreResults)<a 
name="line.523"></a>
+<span class="sourceLineNo">524</span>        &amp;&amp; 
(!partialResults.isEmpty() || possiblyNextScanner(countdown, values == 
null))));<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<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>   * @param remainingResultSize<a 
name="line.528"></a>
+<span class="sourceLineNo">529</span>   * @param remainingRows<a 
name="line.529"></a>
+<span class="sourceLineNo">530</span>   * @param regionHasMoreResults<a 
name="line.530"></a>
+<span class="sourceLineNo">531</span>   * @return true when the current region 
has been exhausted. When the current region has been<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   *         exhausted, the region must 
be changed before scanning can continue<a name="line.532"></a>
+<span class="sourceLineNo">533</span>   */<a name="line.533"></a>
+<span class="sourceLineNo">534</span>  private boolean doneWithRegion(long 
remainingResultSize, int remainingRows,<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      boolean regionHasMoreResults) {<a 
name="line.535"></a>
+<span class="sourceLineNo">536</span>    return remainingResultSize &gt; 0 
&amp;&amp; remainingRows &gt; 0 &amp;&amp; !regionHasMoreResults;<a 
name="line.536"></a>
+<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>  protected long calcEstimatedSize(Result 
rs) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    long estimatedHeapSizeOfResult = 0;<a 
name="line.540"></a>
+<span class="sourceLineNo">541</span>    // We don't make Iterator here<a 
name="line.541"></a>
+<span class="sourceLineNo">542</span>    for (Cell cell : rs.rawCells()) {<a 
name="line.542"></a>
+<span class="sourceLineNo">543</span>      estimatedHeapSizeOfResult += 
CellUtil.estimatedHeapSizeOf(cell);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    return estimatedHeapSizeOfResult;<a 
name="line.545"></a>
+<span class="sourceLineNo">546</span>  }<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>  protected void addEstimatedSize(long 
estimatedHeapSizeOfResult) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    return;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
+<span class="sourceLineNo">551</span><a name="line.551"></a>
+<span class="sourceLineNo">552</span>  @VisibleForTesting<a 
name="line.552"></a>
+<span class="sourceLineNo">553</span>  public int getCacheCount() {<a 
name="line.553"></a>
+<span class="sourceLineNo">554</span>    return cache != null ? cache.size() : 
0;<a name="line.554"></a>
 <span class="sourceLineNo">555</span>  }<a name="line.555"></a>
 <span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  @VisibleForTesting<a 
name="line.557"></a>
-<span class="sourceLineNo">558</span>  public int getCacheCount() {<a 
name="line.558"></a>
-<span class="sourceLineNo">559</span>    return cache != null ? cache.size() : 
0;<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * This method ensures all of our book 
keeping regarding partial results is kept up to date. This<a 
name="line.563"></a>
-<span class="sourceLineNo">564</span>   * method should be called once we know 
that the results we received back from the RPC request do<a name="line.564"></a>
-<span class="sourceLineNo">565</span>   * not contain errors. We return a list 
of results that should be added to the cache. In general,<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * this list will contain all 
NON-partial results from the input array (unless the client has<a 
name="line.566"></a>
-<span class="sourceLineNo">567</span>   * specified that they are okay with 
receiving partial results)<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * @param resultsFromServer The array 
of {@link Result}s returned from the server<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * @param heartbeatMessage Flag 
indicating whether or not the response received from the server<a 
name="line.569"></a>
-<span class="sourceLineNo">570</span>   *          represented a complete 
response, or a heartbeat message that was sent to keep the<a 
name="line.570"></a>
-<span class="sourceLineNo">571</span>   *          client-server connection 
alive<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @return the list of results that 
should be added to the cache.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @throws IOException<a 
name="line.573"></a>
-<span class="sourceLineNo">574</span>   */<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  protected List&lt;Result&gt;<a 
name="line.575"></a>
-<span class="sourceLineNo">576</span>      getResultsToAddToCache(Result[] 
resultsFromServer, boolean heartbeatMessage)<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          throws IOException {<a 
name="line.577"></a>
-<span class="sourceLineNo">578</span>    int resultSize = resultsFromServer != 
null ? resultsFromServer.length : 0;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    List&lt;Result&gt; 
resultsToAddToCache = new ArrayList&lt;Result&gt;(resultSize);<a 
name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    final boolean isBatchSet = scan != 
null &amp;&amp; scan.getBatch() &gt; 0;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    final boolean allowPartials = scan != 
null &amp;&amp; scan.getAllowPartialResults();<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    // If the caller has indicated in 
their scan that they are okay with seeing partial results,<a 
name="line.584"></a>
-<span class="sourceLineNo">585</span>    // then simply add all results to the 
list. Note that since scan batching also returns results<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    // for a row in pieces we treat batch 
being set as equivalent to allowing partials. The<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    // implication of treating batching 
as equivalent to partial results is that it is possible<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // the caller will receive a result 
back where the number of cells in the result is less than<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    // the batch size even though it may 
not be the last group of cells for that row.<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    if (allowPartials || isBatchSet) {<a 
name="line.590"></a>
-<span class="sourceLineNo">591</span>      
addResultsToList(resultsToAddToCache, resultsFromServer, 0,<a 
name="line.591"></a>
-<span class="sourceLineNo">592</span>          (null == resultsFromServer ? 0 
: resultsFromServer.length));<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      return resultsToAddToCache;<a 
name="line.593"></a>
-<span class="sourceLineNo">594</span>    }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>    // If no results were returned it 
indicates that either we have the all the partial results<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    // necessary to construct the 
complete result or the server had to send a heartbeat message<a 
name="line.597"></a>
-<span class="sourceLineNo">598</span>    // to the client to keep the 
client-server connection alive<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    if (resultsFromServer == null || 
resultsFromServer.length == 0) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      // If this response was an empty 
heartbeat message, then we have not exhausted the region<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      // and thus there may be more 
partials server side that still need to be added to the partial<a 
name="line.601"></a>
-<span class="sourceLineNo">602</span>      // list before we form the complete 
Result<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      if (!partialResults.isEmpty() 
&amp;&amp; !heartbeatMessage) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        
resultsToAddToCache.add(Result.createCompleteResult(partialResults));<a 
name="line.604"></a>
-<span class="sourceLineNo">605</span>        clearPartialResults();<a 
name="line.605"></a>
-<span class="sourceLineNo">606</span>      }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>      return resultsToAddToCache;<a 
name="line.608"></a>
-<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">557</span>  /**<a name="line.557"></a>
+<span class="sourceLineNo">558</span>   * This method ensures all of our book 
keeping regarding partial results is kept up to date. This<a 
name="line.558"></a>
+<span class="sourceLineNo">559</span>   * method should be called once we know 
that the results we received back from the RPC request do<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * not contain errors. We return a list 
of results that should be added to the cache. In general,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * this list will contain all 
NON-partial results from the input array (unless the client has<a 
name="line.561"></a>
+<span class="sourceLineNo">562</span>   * specified that they are okay with 
receiving partial results)<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * @param resultsFromServer The array 
of {@link Result}s returned from the server<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   * @param heartbeatMessage Flag 
indicating whether or not the response received from the server<a 
name="line.564"></a>
+<span class="sourceLineNo">565</span>   *          represented a complete 
response, or a heartbeat message that was sent to keep the<a 
name="line.565"></a>
+<span class="sourceLineNo">566</span>   *          client-server connection 
alive<a name="line.566"></a>
+<span class="sourceLineNo">567</span>   * @return the list of results that 
should be added to the cache.<a name="line.567"></a>
+<span class="sourceLineNo">568</span>   * @throws IOException<a 
name="line.568"></a>
+<span class="sourceLineNo">569</span>   */<a name="line.569"></a>
+<span class="sourceLineNo">570</span>  protected List&lt;Result&gt;<a 
name="line.570"></a>
+<span class="sourceLineNo">571</span>      getResultsToAddToCache(Result[] 
resultsFromServer, boolean heartbeatMessage)<a name="line.571"></a>
+<span class="sourceLineNo">572</span>          throws IOException {<a 
name="line.572"></a>
+<span class="sourceLineNo">573</span>    int resultSize = resultsFromServer != 
null ? resultsFromServer.length : 0;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    List&lt;Result&gt; 
resultsToAddToCache = new ArrayList&lt;Result&gt;(resultSize);<a 
name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>    final boolean isBatchSet = scan != 
null &amp;&amp; scan.getBatch() &gt; 0;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    final boolean allowPartials = scan != 
null &amp;&amp; scan.getAllowPartialResults();<a name="line.577"></a>
+<span class="sourceLineNo">578</span><a name="line.578"></a>
+<span class="sourceLineNo">579</span>    // If the caller has indicated in 
their scan that they are okay with seeing partial results,<a 
name="line.579"></a>
+<span class="sourceLineNo">580</span>    // then simply add all results to the 
list. Note that since scan batching also returns results<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    // for a row in pieces we treat batch 
being set as equivalent to allowing partials. The<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    // implication of treating batching 
as equivalent to partial results is that it is possible<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    // the caller will receive a result 
back where the number of cells in the result is less than<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    // the batch size even though it may 
not be the last group of cells for that row.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    if (allowPartials || isBatchSet) {<a 
name="line.585"></a>
+<span class="sourceLineNo">586</span>      
addResultsToList(resultsToAddToCache, resultsFromServer, 0,<a 
name="line.586"></a>
+<span class="sourceLineNo">587</span>          (null == resultsFromServer ? 0 
: resultsFromServer.length));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      return resultsToAddToCache;<a 
name="line.588"></a>
+<span class="sourceLineNo">589</span>    }<a name="line.589"></a>
+<span class="sourceLineNo">590</span><a name="line.590"></a>
+<span class="sourceLineNo">591</span>    // If no results were returned it 
indicates that either we have the all the partial results<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    // necessary to construct the 
complete result or the server had to send a heartbeat message<a 
name="line.592"></a>
+<span class="sourceLineNo">593</span>    // to the client to keep the 
client-server connection alive<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    if (resultsFromServer == null || 
resultsFromServer.length == 0) {<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      // If this response was an empty 
heartbeat message, then we have not exhausted the region<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      // and thus there may be more 
partials server side that still need to be added to the partial<a 
name="line.596"></a>
+<span class="sourceLineNo">597</span>      // list before we form the complete 
Result<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      if (!partialResults.isEmpty() 
&amp;&amp; !heartbeatMessage) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        
resultsToAddToCache.add(Result.createCompleteResult(partialResults));<a 
name="line.599"></a>
+<span class="sourceLineNo">600</span>        clearPartialResults();<a 
name="line.600"></a>
+<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      return resultsToAddToCache;<a 
name="line.603"></a>
+<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
+<span class="sourceLineNo">605</span><a name="line.605"></a>
+<span class="sourceLineNo">606</span>    // In every RPC response there should 
be at most a single partial result. Furthermore, if<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    // there is a partial result, it is 
guaranteed to be in the last position of the array.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    Result last = 
resultsFromServer[resultsFromServer.length - 1];<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    Result partial = last.isPartial() ? 
last : null;<a name="line.609"></a>
 <span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    // In every RPC response there should 
be at most a single partial result. Furthermore, if<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    // there is a partial result, it is 
guaranteed to be in the last position of the array.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    Result last = 
resultsFromServer[resultsFromServer.length - 1];<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    Result partial = last.isPartial() ? 
last : null;<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    if (LOG.isTraceEnabled()) {<a 
name="line.616"></a>
-<span class="sourceLineNo">617</span>      StringBuilder sb = new 
StringBuilder();<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      sb.append("number results from RPC: 
").append(resultsFromServer.length).append(",");<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      sb.append("partial != null: 
").append(partial != null).append(",");<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      sb.append("number of partials so 
far: ").append(partialResults.size());<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      LOG.trace(sb.toString());<a 
name="line.621"></a>
-<span class="sourceLineNo">622</span>    }<a name="line.622"></a>
-<span class="sourceLineNo">623</span><a name="line.623"></a>
-<span class="sourceLineNo">624</span>    // There are three possibilities 
cases that can occur while handling partial results<a name="line.624"></a>
+<span class="sourceLineNo">611</span>    if (LOG.isTraceEnabled()) {<a 
name="line.611"></a>
+<span class="sourceLineNo">612</span>      StringBuilder sb = new 
StringBuilder();<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      sb.append("number results from RPC: 
").append(resultsFromServer.length).append(",");<a name="line.613"></a>
+<span class="sourceLineNo">614</span>      sb.append("partial != null: 
").append(partial != null).append(",");<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      sb.append("number of partials so 
far: ").append(partialResults.size());<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      LOG.trace(sb.toString());<a 
name="line.616"></a>
+<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
+<span class="sourceLineNo">618</span><a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // There are three possibilities 
cases that can occur while handling partial results<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    //<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // 1. (partial != null &amp;&amp; 
partialResults.isEmpty())<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // This is the first partial result 
that we have received. It should be added to<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    // the list of partialResults and 
await the next RPC request at which point another<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    // portion of the complete result 
will be received<a name="line.624"></a>
 <span class="sourceLineNo">625</span>    //<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    // 1. (partial != null &amp;&amp; 
partialResults.isEmpty())<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    // This is the first partial result 
that we have received. It should be added to<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    // the list of partialResults and 
await the next RPC request at which point another<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    // portion of the complete result 
will be received<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    //<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    // 2. !partialResults.isEmpty()<a 
name="line.631"></a>
-<span class="sourceLineNo">632</span>    // Since our partialResults list is 
not empty it means that we have been accumulating partial<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    // Results for a particular row. We 
cannot form the complete/whole Result for that row until<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    // all partials for the row have been 
received. Thus we loop through all of the Results<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // returned from the server and 
determine whether or not all partial Results for the row have<a 
name="line.635"></a>
-<span class="sourceLineNo">636</span>    // been received. We know that we 
have received all of the partial Results for the row when:<a 
name="line.636"></a>
-<span class="sourceLineNo">637</span>    // i) We notice a row change in the 
Results<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // ii) We see a Result for the 
partial row that is NOT marked as a partial Result<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    //<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    // 3. (partial == null &amp;&amp; 
partialResults.isEmpty())<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Business as usual. We are not 
accumulating partial results and there wasn't a partial result<a 
name="line.641"></a>
-<span class="sourceLineNo">642</span>    // in the RPC response. This means 
that all of the results we received from the server are<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    // complete and can be added directly 
to the cache<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    if (partial != null &amp;&amp; 
partialResults.isEmpty()) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      addToPartialResults(partial);<a 
name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>      // Exclude the last result, it's a 
partial<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      
addResultsToList(resultsToAddToCache, resultsFromServer, 0, 
resultsFromServer.length - 1);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    } else if (!partialResults.isEmpty()) 
{<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      for (int i = 0; i &lt; 
resultsFromServer.length; i++) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        Result result = 
resultsFromServer[i];<a name="line.651"></a>
+<span class="sourceLineNo">626</span>    // 2. !partialResults.isEmpty()<a 
name="line.626"></a>
+<span class="sourceLineNo">627</span>    // Since our partialResults list is 
not empty it means that we have been accumulating partial<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    // Results for a particular row. We 
cannot form the complete/whole Result for that row until<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    // all partials for the row have been 
received. Thus we loop through all of the Results<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    // returned from the server and 
determine whether or not all partial Results for the row have<a 
name="line.630"></a>
+<span class="sourceLineNo">631</span>    // been received. We know that we 
have received all of the partial Results for the row when:<a 
name="line.631"></a>
+<span class="sourceLineNo">632</span>    // i) We notice a row change in the 
Results<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // ii) We see a Result for the 
partial row that is NOT marked as a partial Result<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    //<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    // 3. (partial == null &amp;&amp; 
partialResults.isEmpty())<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // Business as usual. We are not 
accumulating partial results and there wasn't a partial result<a 
name="line.636"></a>
+<span class="sourceLineNo">637</span>    // in the RPC response. This means 
that all of the results we received from the server are<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    // complete and can be added directly 
to the cache<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    if (partial != null &amp;&amp; 
partialResults.isEmpty()) {<a name="line.639"></a>
+<span class="sourceLineNo">640</span>      addToPartialResults(partial);<a 
name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>      // Exclude the last result, it's a 
partial<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      
addResultsToList(resultsToAddToCache, resultsFromServer, 0, 
resultsFromServer.length - 1);<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    } else if (!partialResults.isEmpty()) 
{<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      for (int i = 0; i &lt; 
resultsFromServer.length; i++) {<a name="line.645"></a>
+<span class="sourceLineNo">646</span>        Result result = 
resultsFromServer[i];<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>        // This result is from the same 
row as the partial Results. Add it to the list of partials<a 
name="line.648"></a>
+<span class="sourceLineNo">649</span>        // and check if it was the last 
partial Result for that row<a name="line.649"></a>
+<span class="sourceLineNo">650</span>        if 
(Bytes.equals(partialResultsRow, result.getRow())) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>          addToPartialResults(result);<a 
name="line.651"></a>
 <span class="sourceLineNo">652</span><a name="line.652"></a>
-<span class="sourceLineNo">653</span>        // This result is from the same 
row as the partial Results. Add it to the list of partials<a 
name="line.653"></a>
-<span class="sourceLineNo">654</span>        // and check if it was the last 
partial Result for that row<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        if 
(Bytes.equals(partialResultsRow, result.getRow())) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>          addToPartialResults(result);<a 
name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>          // If the result is not a 
partial, it is a signal to us that it is the last Result we<a 
name="line.658"></a>
-<span class="sourceLineNo">659</span>          // need to form the complete 
Result client-side<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          if (!result.isPartial()) {<a 
name="line.660"></a>
-<span class="sourceLineNo">661</span>            
resultsToAddToCache.add(Result.createCompleteResult(partialResults));<a 
name="line.661"></a>
-<span class="sourceLineNo">662</span>            clearPartialResults();<a 
name="line.662"></a>
-<span class="sourceLineNo">663</span>          }<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        } else {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>          // The row of this result 
differs from the row of the partial results we have received so<a 
name="line.665"></a>
-<span class="sourceLineNo">666</span>          // far. If our list of partials 
isn't empty, this is a signal to form the complete Result<a name="line.666"></a>
-<span class="sourceLineNo">667</span>          // since the row has now 
changed<a name="line.667"></a>
-<span class="sourceLineNo">668</span>          if (!partialResults.isEmpty()) 
{<a name="line.668"></a>
-<span class="sourceLineNo">669</span>            
resultsToAddToCache.add(Result.createCompleteResult(partialResults));<a 
name="line.669"></a>
-<span class="sourceLineNo">670</span>            clearPartialResults();<a 
name="line.670"></a>
-<span class="sourceLineNo">671</span>          }<a name="line.671"></a>
-<span class="sourceLineNo">672</span><a name="line.672"></a>
-<span class="sourceLineNo">673</span>          // It's possible that in one 
response from the server we receive the final partial for<a name="line.673"></a>
-<span class="sourceLineNo">674</span>          // one row and receive a 
partial for a different row. Thus, make sure that all Results<a 
name="line.674"></a>
-<span class="sourceLineNo">675</span>          // are added to the proper 
list<a name="line.675"></a>
-<span class="sourceLineNo">676</span>          if (result.isPartial()) {<a 
name="line.676"></a>
-<span class="sourceLineNo">677</span>            
addToPartialResults(result);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>          } else {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>            
resultsToAddToCache.add(result);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>          }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        }<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    } else { // partial == null 
&amp;&amp; partialResults.isEmpty() -- business as usual<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      
addResultsToList(resultsToAddToCache, resultsFromServer, 0, 
resultsFromServer.length);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    return resultsToAddToCache;<a 
name="line.687"></a>
-<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>  /**<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * A convenience method for adding a 
Result to our list of partials. This method ensure that only<a 
name="line.691"></a>
-<span class="sourceLineNo">692</span>   * Results that belong to the same row 
as the other partials can be added to the list.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param result The result that we 
want to add to our list of partial Results<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @throws IOException<a 
name="line.694"></a>
-<span class="sourceLineNo">695</span>   */<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  private void addToPartialResults(final 
Result result) throws IOException {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    final byte[] row = result.getRow();<a 
name="line.697"></a>
-<span class="sourceLineNo">698</span>    if (partialResultsRow != null 
&amp;&amp; !Bytes.equals(row, partialResultsRow)) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      throw new IOException("Partial 
result row does not match. All partial results must come "<a 
name="line.699"></a>
-<span class="sourceLineNo">700</span>          + "from the same row. 
partialResultsRow: " + Bytes.toString(partialResultsRow) + "row: "<a 
name="line.700"></a>
-<span class="sourceLineNo">701</span>          + Bytes.toString(row));<a 
name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    partialResultsRow = row;<a 
name="line.703"></a>
-<span class="sourceLineNo">704</span>    partialResults.add(result);<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>  /**<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * Convenience method for clearing the 
list of partials and resetting the partialResultsRow.<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   */<a name="line.709"></a>
-<span class="sourceLineNo">710</span>  private void clearPartialResults() {<a 
name="line.710"></a>
-<span class="sourceLineNo">711</span>    partialResults.clear();<a 
name="line.711"></a>
-<span class="sourceLineNo">712</span>    partialResultsRow = null;<a 
name="line.712"></a>
-<span class="sourceLineNo">713</span>  }<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>  /**<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * Helper method for adding results 
between the indices [start, end) to the outputList<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   * @param outputList the list that 
results will be added to<a name="line.717"></a>
-<span class="sourceLineNo">718</span>   * @param inputArray the array that 
results are taken from<a name="line.718"></a>
-<span class="sourceLineNo">719</span>   * @param start beginning index 
(inclusive)<a name="line.719"></a>
-<span class="sourceLineNo">720</span>   * @param end ending index 
(exclusive)<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  private void 
addResultsToList(List&lt;Result&gt; outputList, Result[] inputArray, int start, 
int end) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    if (inputArray == null || start &lt; 
0 || end &gt; inputArray.length) return;<a name="line.723"></a>
+<span class="sourceLineNo">653</span>          // If the result is not a 
partial, it is a signal to us that it is the last Result we<a 
name="line.653"></a>
+<span class="sourceLineNo">654</span>          // need to form the complete 
Result client-side<a name="line.654"></a>
+<span class="sourceLineNo">655</span>          if (!result.isPartial()) {<a 
name="line.655"></a>
+<span class="sourceLineNo">656</span>            
resultsToAddToCache.add(Result.createCompleteResult(partialResults));<a 
name="line.656"></a>
+<span class="sourceLineNo">657</span>            clearPartialResults();<a 
name="line.657"></a>
+<span class="sourceLineNo">658</span>          }<a name="line.658"></a>
+<span class="sourceLineNo">659</span>        } else {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>          // The row of this result 
differs from the row of the partial results we have received so<a 
name="line.660"></a>
+<span class="sourceLineNo">661</span>          // far. If our list of partials 
isn't empty, this is a signal to form the complete Result<a name="line.661"></a>
+<span class="sourceLineNo">662</span>          // since the row has now 
changed<a name="line.662"></a>
+<span class="sourceLineNo">663</span>          if (!partialResults.isEmpty()) 
{<a name="line.663"></a>
+<span class="sourceLineNo">664</span>            
resultsToAddToCache.add(Result.createCompleteResult(partialResults));<a 
name="line.664"></a>
+<span class="sourceLineNo">665</span>            clearPartialResults();<a 
name="line.665"></a>
+<span class="sourceLineNo">666</span>          }<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>          // It's possible that in one 
response from the server we receive the final partial for<a name="line.668"></a>
+<span class="sourceLineNo">669</span>          // one row and receive a 
partial for a different row. Thus, make sure that all Results<a 
name="line.669"></a>
+<span class="sourceLineNo">670</span>          // are added to the proper 
list<a name="line.670"></a>
+<span class="sourceLineNo">671</span>          if (result.isPartial()) {<a 
name="line.671"></a>
+<span class="sourceLineNo">672</span>            
addToPartialResults(result);<a name="line.672"></a>
+<span class="sourceLineNo">673</span>          } else {<a name="line.673"></a>
+<span class="sourceLineNo">674</span>            
resultsToAddToCache.add(result);<a name="line.674"></a>
+<span class="sourceLineNo">675</span>          }<a name="line.675"></a>
+<span class="sourceLineNo">676</span>        }<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      }<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    } else { // partial == null 
&amp;&amp; partialResults.isEmpty() -- business as usual<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      
addResultsToList(resultsToAddToCache, resultsFromServer, 0, 
resultsFromServer.length);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span><a name="line.681"></a>
+<span class="sourceLineNo">682</span>    return resultsToAddToCache;<a 
name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  /**<a name="line.685"></a>
+<span class="sourceLineNo">686</span>   * A convenience method for adding a 
Result to our list of partials. This method ensure that only<a 
name="line.686"></a>
+<span class="sourceLineNo">687</span>   * Results that belong to the same row 
as the other partials can be added to the list.<a name="line.687"></a>
+<span class="sourceLineNo">688</span>   * @param result The result that we 
want to add to our list of partial Results<a name="line.688"></a>
+<span class="sourceLineNo">689</span>   * @throws IOException<a 
name="line.689"></a>
+<span class="sourceLineNo">690</span>   */<a name="line.690"></a>
+<span class="sourceLineNo">691</span>  private void addToPartialResults(final 
Result result) throws IOException {<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    final byte[] row = result.getRow();<a 
name="line.692"></a>
+<span class="sourceLineNo">693</span>    if (partialResultsRow != null 
&amp;&amp; !Bytes.equals(row, partialResultsRow)) {<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      throw new IOException("Partial 
result row does not match. All partial results must come "<a 
name="line.694"></a>
+<span class="sourceLineNo">695</span>          + "from the same row. 
partialResultsRow: " + Bytes.toString(partialResultsRow) + "row: "<a 
name="line.695"></a>
+<span class="sourceLineNo">696</span>          + Bytes.toString(row));<a 
name="line.696"></a>
+<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    partialResultsRow = row;<a 
name="line.698"></a>
+<span class="sourceLineNo">699</span>    partialResults.add(result);<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>   * Convenience method for clearing the 
list of partials and resetting the partialResultsRow.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   */<a name="line.704"></a>
+<span class="sourceLineNo">705</span>  private void clearPartialResults() {<a 
name="line.705"></a>
+<span class="sourceLineNo">706</span>    partialResults.clear();<a 
name="line.706"></a>
+<span class="sourceLineNo">707</span>    partialResultsRow = null;<a 
name="line.707"></a>
+<span class="sourceLineNo">708</span>  }<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>  /**<a name="line.710"></a>
+<span class="sourceLineNo">711</span>   * Helper method for adding results 
between the indices [start, end) to the outputList<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * @param outputList the list that 
results will be added to<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   * @param inputArray the array that 
results are taken from<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * @param start beginning index 
(inclusive)<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * @param end ending index 
(exclusive)<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   */<a name="line.716"></a>
+<span class="sourceLineNo">717</span>  private void 
addResultsToList(List&lt;Result&gt; outputList, Result[] inputArray, int start, 
int end) {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    if (inputArray == null || start &lt; 
0 || end &gt; inputArray.length) return;<a name="line.718"></a>
+<span class="sourceLineNo">719</span><a name="line.719"></a>
+<span class="sourceLineNo">720</span>    for (int i = start; i &lt; end; i++) 
{<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      outputList.add(inputArray[i]);<a 
name="line.721"></a>
+<span class="sourceLineNo">722</span>    }<a name="line.722"></a>
+<span class="sourceLineNo">723</span>  }<a name="line.723"></a>
 <span class="sourceLineNo">724</span><a name="line.724"></a>
-<span class="sourceLineNo">725</span>    for (int i = start; i &lt; end; i++) 
{<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      outputList.add(inputArray[i]);<a 
name="line.726"></a>
-<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  }<a name="line.728"></a>
-<span class="sourceLineNo">729</span><a name="line.729"></a>
-<span class="sourceLineNo">730</span>    @Override<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    public void close() {<a 
name="line.731"></a>
-<span class="sourceLineNo">732</span>      if (!scanMetricsPublished) 
writeScanMetrics();<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      if (callable != null) {<a 
name="line.733"></a>
-<span class="sourceLineNo">734</span>        callable.setClose();<a 
name="line.734"></a>
-<span class="sourceLineNo">735</span>        try {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          call(callable, caller, 
scannerTimeout);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        } catch (UnknownScannerException 
e) {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>           // We used to catch this 
error, interpret, and rethrow. However, we<a name="line.738"></a>
-<span class="sourceLineNo">739</span>           // have since decided that 
it's not nice for a scanner's close to<a name="line.739"></a>
-<span class="sourceLineNo">740</span>           // throw exceptions. Chances 
are it was just due to lease time out.<a name="line.740"></a>
-<span class="sourceLineNo">741</span>          if (LOG.isDebugEnabled()) {<a 
name="line.741"></a>
-<span class="sourceLineNo">742</span>            LOG.debug("scanner failed to 
close", e);<a name="line.742"></a>
-<span class="sourceLineNo">743</span>          }<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        } catch (IOException e) {<a 
name="line.744"></a>
-<span class="sourceLineNo">745</span>          /* An exception other than 
UnknownScanner is unexpected. */<a name="line.745"></a>
-<span class="sourceLineNo">746</span>          LOG.warn("scanner failed to 
close.", e);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>        }<a name="line.747"></a>
-<span class="sourceLineNo">748</span>        callable = null;<a 
name="line.748"></a>
-<span class="sourceLineNo">749</span>      }<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      closed = true;<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>
-<span class="sourceLineNo">754</span>   * Create the closest row before the 
specified row<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   * @param row<a name="line.755"></a>
-<span class="sourceLineNo">756</span>   * @return a new byte array which is 
the closest front row of the specified one<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   */<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  protected static byte[] 
createClosestRowBefore(byte[] row) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    if (row == null) {<a 
name="line.759"></a>
-<span class="sourceLineNo">760</span>      throw new 
IllegalArgumentException("The passed row is empty");<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    if (Bytes.equals(row, 
HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      return MAX_BYTE_ARRAY;<a 
name="line.763"></a>
-<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    if (row[row.length - 1] == 0) {<a 
name="line.765"></a>
-<span class="sourceLineNo">766</span>      return Arrays.copyOf(row, 
row.length - 1);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    } else {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      byte[] closestFrontRow = 
Arrays.copyOf(row, row.length);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      closestFrontRow[row.length - 1] = 
(byte) ((closestFrontRow[row.length - 1] &amp; 0xff) - 1);<a 
name="line.769"></a>
-<span class="sourceLineNo">770</span>      closestFrontRow = 
Bytes.add(closestFrontRow, MAX_BYTE_ARRAY);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      return closestFrontRow;<a 
name="line.771"></a>
-<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
-<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
-<span class="sourceLineNo">774</span><a name="line.774"></a>
-<span class="sourceLineNo">775</span>  @Override<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  public boolean renewLease() {<a 
name="line.776"></a>
-<span class="sourceLineNo">777</span>    if (callable != null) {<a 
name="line.777"></a>
-<span class="sourceLineNo">778</span>      // do not return any rows, do not 
advance the scanner<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      callable.setRenew(true);<a 
name="line.779"></a>
-<span class="sourceLineNo">780</span>      try {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        
this.caller.callWithoutRetries(callable, this.scannerTimeout);<a 
name="line.781"></a>
-<span class="sourceLineNo">782</span>      } catch (Exception e) {<a 
name="line.782"></a>
-<span class="sourceLineNo">783</span>        return false;<a 
name="line.783"></a>
-<span class="sourceLineNo">784</span>      } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>        callable.setRenew(false);<a 
name="line.785"></a>
-<span class="sourceLineNo">786</span>      }<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      return true;<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return false;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span>}<a name="line.791"></a>
+<span class="sourceLineNo">725</span>    @Override<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    public void close() {<a 
name="line.726"></a>
+<span class="sourceLineNo">727</span>      if (!scanMetricsPublished) 
writeScanMetrics();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      if (callable != null) {<a 
name="line.728"></a>
+<span class="sourceLineNo">729</span>        callable.setClose();<a 
name="line.729"></a>
+<span class="sourceLineNo">730</span>        try {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>          call(callable, caller, 
scannerTimeout);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        } catch (UnknownScannerException 
e) {<a name="line.732"></a>
+<span class="sourceLineNo">733</span>           // We used to catch this 
error, interpret, and rethrow. However, we<a name="line.733"></a>
+<span class="sourceLineNo">734</span>           // have since decided that 
it's not nice for a scanner's close to<a name="line.734"></a>
+<span class="sourceLineNo">735</span>           // throw exceptions. Chances 
are it was just due to lease time out.<a name="line.735"></a>
+<span class="sourceLineNo">736</span>          if (LOG.isDebugEnabled()) {<a 
name="line.736"></a>
+<span class="sourceLineNo">737</span>            LOG.debug("scanner failed to 
close", e);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>          }<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        } catch (IOException e) {<a 
name="line.739"></a>
+<span class="sourceLineNo">740</span>          /* An exception other than 
UnknownScanner is unexpected. */<a name="line.740"></a>
+<span class="sourceLineNo">741</span>          LOG.warn("scanner failed to 
close.", e);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>        }<a name="line.742"></a>
+<span class="sourceLineNo">743</span>        callable = null;<a 
name="line.743"></a>
+<span class="sourceLineNo">744</span>      }<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      closed = true;<a 
name="line.745"></a>
+<span class="sourceLineNo">746</span>    }<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>   * Create the closest row before the 
specified row<a name="line.749"></a>
+<span class="sourceLineNo">750</span>   * @param row<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * @return a new byte array which is 
the closest front row of the specified one<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  protected static byte[] 
createClosestRowBefore(byte[] row) {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    if (row == null) {<a 
name="line.754"></a>
+<span class="sourceLineNo">755</span>      throw new 
IllegalArgumentException("The passed row is empty");<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    }<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    if (Bytes.equals(row, 
HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      return MAX_BYTE_ARRAY;<a 
name="line.758"></a>
+<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    if (row[row.length - 1] == 0) {<a 
name="line.760"></a>
+<span class="sourceLineNo">761</span>      return Arrays.copyOf(row, 
row.length - 1);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    } else {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      byte[] closestFrontRow = 
Arrays.copyOf(row, row.length);<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      closestFrontRow[row.length - 1] = 
(byte) ((closestFrontRow[row.length - 1] &amp; 0xff) - 1);<a 
name="line.764"></a>
+<span class="sourceLineNo">765</span>      closestFrontRow = 
Bytes.add(closestFrontRow, MAX_BYTE_ARRAY);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      return closestFrontRow;<a 
name="line.766"></a>
+<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
+<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>  @Override<a name="line.770"></a>
+<span class="sourceLineNo">771</span>  public boolean renewLease() {<a 
name="line.771"></a>
+<span class="sourceLineNo">772</span>    if (callable != null) {<a 
name="line.772"></a>
+<span class="sourceLineNo">773</span>      // do not return any rows, do not 
advance the scanner<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      callable.setRenew(true);<a 
name="line.774"></a>
+<span class="sourceLineNo">775</span>      try {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>        
this.caller.callWithoutRetries(callable, this.scannerTimeout);<a 
name="line.776"></a>
+<span class="sourceLineNo">777</span>      } catch (Exception e) {<a 
name="line.777"></a>
+<span class="sourceLineNo">778</span>        return false;<a 
name="line.778"></a>
+<span class="sourceLineNo">779</span>      } finally {<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        callable.setRenew(false);<a 
name="line.780"></a>
+<span class="sourceLineNo">781</span>      }<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      return true;<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    return false;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>  }<a name="line.785"></a>
+<span class="sourceLineNo">786</span>}<a name="line.786"></a>
 
 
 

Reply via email to