Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java (revision 1433899) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java (working copy) @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.List; import java.util.NavigableSet; +import java.util.concurrent.CountDownLatch; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -127,9 +128,26 @@ scanner.requestSeek(matcher.getStartKey(), false, true); } } else { + if (scanners.isEmpty()) return; + CountDownLatch latch = new CountDownLatch(scanners.size()); + List workers = + new ArrayList(scanners.size()); for (KeyValueScanner scanner : scanners) { - scanner.seek(matcher.getStartKey()); + ScannerSeekWorker worker = + new ScannerSeekWorker(scanner, matcher.getStartKey(), latch); + workers.add(worker); } + for (ScannerSeekWorker worker : workers) { + worker.start(); + } + try { + latch.await(); + } catch (InterruptedException e) { + LOG.error("", e); + } + for (ScannerSeekWorker worker : workers) { + if (!worker.isSuccess()) throw new IOException(); + } } // set storeLimit @@ -554,6 +572,35 @@ return 0; } + private static class ScannerSeekWorker extends Thread { + KeyValueScanner scanner; + KeyValue keyValue; + CountDownLatch latch; + boolean isSuccess; + + public ScannerSeekWorker(KeyValueScanner scanner, KeyValue keyValue, CountDownLatch latch) { + this.scanner = scanner; + this.keyValue = keyValue; + this.latch = latch; + isSuccess = false; + } + public boolean isSuccess() { + return isSuccess; + } + + @Override + public void run() { + try { + scanner.seek(keyValue); + isSuccess = true; + } catch (IOException e) { + LOG.info("", e); + } finally { + latch.countDown(); + } + } + } + /** * Used in testing. * @return all scanners in no particular order