[
https://issues.apache.org/jira/browse/HBASE-6900?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13469463#comment-13469463
]
Lars Hofhansl commented on HBASE-6900:
--------------------------------------
Thanks for explaining Ram.
Are you sure you care for the return value of checkReseek?
After you explanation it seems like you can just call checkReseek always, and
then always seek to the kv passed it. Like this:
{code}
@Override
public synchronized boolean reseek(KeyValue kv) throws IOException {
//Heap will not be null, if this is called from next() which.
//If called from RegionScanner.reseek(...) make sure the scanner
//stack is reset if needed.
checkReseek();
if (explicitColumnQuery && lazySeekEnabledGlobally) {
return heap.requestSeek(kv, true, useRowColBloom);
} else {
return heap.reseek(kv);
}
}
{code}
> RegionScanner.reseek() creates NPE when a flush or compaction happens before
> the reseek.
> ----------------------------------------------------------------------------------------
>
> Key: HBASE-6900
> URL: https://issues.apache.org/jira/browse/HBASE-6900
> Project: HBase
> Issue Type: Bug
> Reporter: ramkrishna.s.vasudevan
> Assignee: ramkrishna.s.vasudevan
> Fix For: 0.94.2, 0.96.0
>
> Attachments: HBASE-6900_1.patch, HBASE-6900.patch
>
>
> HBASE-5520 introduced reseek() on the RegionScanner.
> Now when a scanner is created we have the StoreScanner heap. After this if a
> flush or compaction happens parallely all the StoreScannerObservers are
> cleared so that whenever a new next() call happens we tend to recreate the
> scanner based on the latest store files.
> The reseek() in StoreScanner expects the heap not to be null because always
> reseek would be called from next()
> {code}
> public synchronized boolean reseek(KeyValue kv) throws IOException {
> //Heap cannot be null, because this is only called from next() which
> //guarantees that heap will never be null before this call.
> if (explicitColumnQuery && lazySeekEnabledGlobally) {
> return heap.requestSeek(kv, true, useRowColBloom);
> } else {
> return heap.reseek(kv);
> }
> }
> {code}
> Now when we call RegionScanner.reseek() directly using CPs we tend to get a
> NPE. In our case it happened when a major compaction was going on. I will
> also attach a testcase to show the problem.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira