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

Anoop Sam John commented on HBASE-6311:
---------------------------------------

{quote}
Assume that one scanner could read put type KV first, and then we delete this 
KV, but this scanner should also could read this scannner as the MVCC , If we 
don't write put and delete KV in majorCompaction, this scanner couldn't read 
the put type KV and break the MVCC, is it right?
{quote}

Raises the question about MVCC. What you say is suppose a read started and at 
that time row r1 was there. Later this row is deleted by some other client. 
Still as per the MVCC this reader will be able to read this row.
But if in between the read (after the delete) a flush and a compact (major) 
happened and then only reader is reaching the row r1, it will not see r1.  
Correct right Chunhui?  This is what you are telling?
[Not sure whether this actions can really happen. but just saying theoretically]

That makes your point valid Chunhui IMO

In Chunhui's test case, if the 1st scanner [scanner1] is calling next() 1st 
time after the major compact, still he should be able to see the row.

                
> Data error after majorCompaction caused by keeping MVCC for opened scanners
> ---------------------------------------------------------------------------
>
>                 Key: HBASE-6311
>                 URL: https://issues.apache.org/jira/browse/HBASE-6311
>             Project: HBase
>          Issue Type: Bug
>          Components: regionserver
>    Affects Versions: 0.94.0
>            Reporter: chunhui shen
>            Assignee: chunhui shen
>            Priority: Blocker
>         Attachments: HBASE-6311-test.patch, HBASE-6311v1.patch
>
>
> It is a big problem we found in 0.94, and you could reproduce the problem in 
> Trunk using the test case I uploaded.
> When we do compaction, we will use region.getSmallestReadPoint() to keep MVCC 
> for opened scanners;
> However,It will make data mistake after majorCompaction because we will skip 
> delete type KV but keep the put type kv in the compacted storefile.
> The following is the reason from code:
> In StoreFileScanner, enforceMVCC is false when compaction, so we could read 
> the delete type KV,
> However, we will skip this delete type KV in ScanQueryMatcher because 
> following code
> {code}
> if (kv.isDelete())
> {
> ...
>  if (includeDeleteMarker
>             && kv.getMemstoreTS() <= maxReadPointToTrackVersions) {
>           System.out.println("add deletes,maxReadPointToTrackVersions="
>               + maxReadPointToTrackVersions);
>           this.deletes.add(bytes, offset, qualLength, timestamp, type);
>         }
> ...
> }
> {code}
> Here maxReadPointToTrackVersions = region.getSmallestReadPoint();
> and kv.getMemstoreTS() > maxReadPointToTrackVersions 
> So we won't add this to DeleteTracker.
> Why test case passed if remove the line 
> MultiVersionConsistencyControl.setThreadReadPoint(smallestReadPoint);
> Because in the StoreFileScanner#skipKVsNewerThanReadpoint
> {code}
> if (cur.getMemstoreTS() <= readPoint) {
>       cur.setMemstoreTS(0);
>     }
> {code}
> So if we remove the line 
> MultiVersionConsistencyControl.setThreadReadPoint(smallestReadPoint);
> Here readPoint is LONG.MAX_VALUE, we will set memStore ts as 0, so we will 
> add it to DeleteTracker in ScanQueryMatcher 
> Solution:
> We use smallestReadPoint of region when compaction to keep MVCC for OPENED 
> scanner, So we should retain delete type kv in output in the case(Already 
> deleted KV is retained in output to make old opened scanner could read this 
> KV) even if it is a majorcompaction.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to