[ 
https://issues.apache.org/jira/browse/HBASE-11099?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13985843#comment-13985843
 ] 

Enis Soztutar commented on HBASE-11099:
---------------------------------------

bq. These edits may be in the snapshot so could be included in the hfile but 
because we took the flushSeqId before they finished, these 'extra' edits could 
be overwritten on HRegion open?
Not sure about getting overriden. But we might end up in a case where the hfile 
flush seqId is smaller than some of the seqId of the keys which were in the 
ring buffer. 
bq.  I could add in a sync and wait till it completes but that could take a 
while if the ring buffer filled by other regions writing.
I think we already sync() before flush. Jeff added that some time ago. But the 
sync() call does not happen while holding the updatesLock IIRC. 

> Two situations where we could open a region with smaller sequence number
> ------------------------------------------------------------------------
>
>                 Key: HBASE-11099
>                 URL: https://issues.apache.org/jira/browse/HBASE-11099
>             Project: HBase
>          Issue Type: Bug
>          Components: regionserver
>    Affects Versions: 0.99.0
>            Reporter: Jeffrey Zhong
>             Fix For: 0.99.0
>
>
> Recently I happened to run into code where we potentially could open region 
> with smaller sequence number:
> 1) Inside function: HRegion#internalFlushcache. This is due to we change the 
> way WAL Sync where we use late binding(assign sequence number right before 
> wal sync).
> The flushSeqId may less than the change sequence number included in the flush 
> which may cause later region opening code to use a smaller than expected 
> sequence number when we reopen the region.
> {code}
> flushSeqId = this.sequenceId.incrementAndGet();
> ...
> mvcc.waitForRead(w);
> {code}
> 2) HRegion#replayRecoveredEdits where we have following code:
> {code}
> ...
>           if (coprocessorHost != null) {
>             status.setStatus("Running pre-WAL-restore hook in coprocessors");
>             if (coprocessorHost.preWALRestore(this.getRegionInfo(), key, 
> val)) {
>               // if bypass this log entry, ignore it ...
>               continue;
>             }
>           }
> ...
>           currentEditSeqId = key.getLogSeqNum();
> {code} 
> If coprocessor skip some tail WALEdits, then the function will return smaller 
> currentEditSeqId. In the end, a region may also open with a smaller sequence 
> number. This may cause data loss because Master may record a larger flushed 
> sequence Id and some WALEdits maybe skipped during recovery if the region 
> fail again.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to