diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java index 7ebae94..ceb4b8e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java @@ -202,24 +202,31 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner this.store.addChangedReaderObserver(this); - // Pass columns to try to filter out unnecessary StoreFiles. - List scanners = getScannersNoCompaction(); - - // Seek all scanners to the start of the Row (or if the exact matching row - // key does not exist, then to the start of the next matching Row). - // Always check bloom filter to optimize the top row seek for delete - // family marker. - seekScanners(scanners, matcher.getStartKey(), explicitColumnQuery - && lazySeekEnabledGlobally, parallelSeekEnabled); - - // set storeLimit - this.storeLimit = scan.getMaxResultsPerColumnFamily(); - - // set rowOffset - this.storeOffset = scan.getRowOffsetPerColumnFamily(); - addCurrentScanners(scanners); - // Combine all seeked scanners with a heap - resetKVHeap(scanners, store.getComparator()); + try { + // Pass columns to try to filter out unnecessary StoreFiles. + List scanners = getScannersNoCompaction(); + + // Seek all scanners to the start of the Row (or if the exact matching row + // key does not exist, then to the start of the next matching Row). + // Always check bloom filter to optimize the top row seek for delete + // family marker. + seekScanners(scanners, matcher.getStartKey(), explicitColumnQuery && lazySeekEnabledGlobally, + parallelSeekEnabled); + + // set storeLimit + this.storeLimit = scan.getMaxResultsPerColumnFamily(); + + // set rowOffset + this.storeOffset = scan.getRowOffsetPerColumnFamily(); + addCurrentScanners(scanners); + // Combine all seeked scanners with a heap + resetKVHeap(scanners, store.getComparator()); + } catch (IOException e) { + // remove us from the HStore#changedReaderObservers here or we'll have no chance to + // and might cause memory leak + this.store.deleteChangedReaderObserver(this); + throw e; + } } /**