PHOENIX-2470 Skip overlapped scan left after 
StaleRegionBoundaryCacheException(Ankit Singhal)


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/95cff2d4
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/95cff2d4
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/95cff2d4

Branch: refs/heads/4.x-HBase-1.0
Commit: 95cff2d49e9c83977852f89c806ecbf55309caa0
Parents: 785f487
Author: Rajeshbabu Chintaguntla <[email protected]>
Authored: Mon Dec 21 08:07:28 2015 +0530
Committer: Rajeshbabu Chintaguntla <[email protected]>
Committed: Mon Dec 21 08:07:28 2015 +0530

----------------------------------------------------------------------
 .../phoenix/iterate/BaseResultIterators.java    | 42 +++++++++++++++++---
 1 file changed, 37 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/95cff2d4/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
index 6ad57c3..19c60bf 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
@@ -543,13 +543,31 @@ public abstract class BaseResultIterators extends 
ExplainTable implements Result
         // contain them all (for example if work was rejected from the queue)
         Queue<PeekingResultIterator> allIterators = new 
ConcurrentLinkedQueue<>();
         List<PeekingResultIterator> iterators = new 
ArrayList<PeekingResultIterator>(numScans);
+        ScanWrapper previousScan = new ScanWrapper(null);
         return getIterators(scans, services, isLocalIndex, allIterators, 
iterators, isReverse, maxQueryEndTime,
-                splits.size());
+                splits.size(), previousScan);
     }
 
-    private List<PeekingResultIterator> getIterators(List<List<Scan>> scan, 
ConnectionQueryServices services, boolean isLocalIndex,
-        Queue<PeekingResultIterator> allIterators, List<PeekingResultIterator> 
iterators, boolean isReverse, long maxQueryEndTime, int splitSize)
-                throws SQLException {
+    class ScanWrapper {
+        Scan scan;
+
+        public Scan getScan() {
+            return scan;
+        }
+
+        public void setScan(Scan scan) {
+            this.scan = scan;
+        }
+
+        public ScanWrapper(Scan scan) {
+            this.scan = scan;
+        }
+
+    }
+
+    private List<PeekingResultIterator> getIterators(List<List<Scan>> scan, 
ConnectionQueryServices services,
+            boolean isLocalIndex, Queue<PeekingResultIterator> allIterators, 
List<PeekingResultIterator> iterators,
+            boolean isReverse, long maxQueryEndTime, int splitSize, 
ScanWrapper previousScan) throws SQLException {
         boolean success = false;
         final List<List<Pair<Scan,Future<PeekingResultIterator>>>> futures = 
Lists.newArrayListWithExpectedSize(splitSize);
         allFutures.add(futures);
@@ -566,8 +584,22 @@ public abstract class BaseResultIterators extends 
ExplainTable implements Result
                         if (timeOutForScan < 0) {
                             throw new 
SQLExceptionInfo.Builder(SQLExceptionCode.OPERATION_TIMED_OUT).setMessage(". 
Query couldn't be completed in the alloted time: " + queryTimeOut + " 
ms").build().buildException(); 
                         }
+                        if (isLocalIndex && previousScan != null && 
previousScan.getScan() != null
+                                && ((!isReverse && 
Bytes.compareTo(scanPair.getFirst().getStartRow(),
+                                        previousScan.getScan().getStopRow()) < 
0)
+                                || (isReverse && 
Bytes.compareTo(scanPair.getFirst().getStartRow(),
+                                        previousScan.getScan().getStopRow()) > 
0)
+                                || 
(scanPair.getFirst().getAttribute(EXPECTED_UPPER_REGION_KEY) != null
+                                        && 
previousScan.getScan().getAttribute(EXPECTED_UPPER_REGION_KEY) != null
+                                        && 
Bytes.compareTo(scanPair.getFirst().getAttribute(EXPECTED_UPPER_REGION_KEY),
+                                                previousScan.getScan()
+                                                        
.getAttribute(EXPECTED_UPPER_REGION_KEY)) == 0))) {
+
+                            continue;
+                        }
                         PeekingResultIterator iterator = 
scanPair.getSecond().get(timeOutForScan, TimeUnit.MILLISECONDS);
                         concatIterators.add(iterator);
+                        previousScan.setScan(scanPair.getFirst());
                     } catch (ExecutionException e) {
                         try { // Rethrow as SQLException
                             throw ServerUtil.parseServerException(e);
@@ -590,7 +622,7 @@ public abstract class BaseResultIterators extends 
ExplainTable implements Result
                             addIterator(iterators, concatIterators);
                             concatIterators = Lists.newArrayList();
                             getIterators(newNestedScans, services, 
isLocalIndex, allIterators, iterators, isReverse,
-                                    maxQueryEndTime, newNestedScans.size());
+                                    maxQueryEndTime, newNestedScans.size(), 
previousScan);
                         }
                     }
                 }

Reply via email to