Kadir OZDEMIR created PHOENIX-5743:
--------------------------------------

             Summary: Concurrent read repairs on the same index row should be 
idempotent
                 Key: PHOENIX-5743
                 URL: https://issues.apache.org/jira/browse/PHOENIX-5743
             Project: Phoenix
          Issue Type: Bug
    Affects Versions: 4.14.3, 5.0.0
            Reporter: Kadir OZDEMIR
            Assignee: Kadir OZDEMIR


It is possible that two or more read repairs can work on the same row. 
Regardless of how many read repairs concurrently happen on this row, the end 
result should be the same.  The current implementation does not satisfy this 
property in one case. This can happen with the following steps:
 # An update on a data table row fails due to the data table row write failure 
(the phase two write). Since the phase 1 (unverified index write) has completed 
here, this leaves an unverified row in the index table.
 # Two (or more) concurrent queries on this table scans this unverified index 
row. 
 # Each query triggers a separate read repair activity.
 # The first one deletes the unverified row correctly.
 # The subsequent ones may leave a wrong delete marker which corrupts this 
index row.

Step 5 can happen because of two bugs in deleteRowIfAgedEnough() in 
GlobalIndexChecker.GlobalIndexScanner:
 # "deleteRowScan.setTimeRange(0, ts + 1);" should read 
"deleteRowScan.setTimeRange(ts, ts + 1);". This will make sure that the first 
read repair will retrieve the cells of the unverified row with the timestamp ts 
but the subsequent read repair gets either the same set of cells the first one 
got, or no cell (i.e., empty row).
 # If the unverified row has been already deleted, deleteRowIfAgedEnough() 
should do nothing and return. However, the current implementation either the 
read repair will retrieve the previous row version (i.e., previous to the 
unverified row) and leaves DeleteColumn markers for wrong cells,  or it will 
get no cells (if no previous row version exists) and leaves a DeleteFamily 
marker which will deletes all previous versions of the row if such rows are 
inserted back by index rebuild.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to