[ 
https://issues.apache.org/jira/browse/CASSANDRA-2590?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jonathan Ellis updated CASSANDRA-2590:
--------------------------------------

    Attachment: 2590-v2.txt

... but that's not what we want for RowRepairResolver. (I freely admit that 
dealing with tombstones is subtle and tricky. :)

removeDeleted will give you back a version of the row with any GC-able 
tombstones removed. That's not what we want for read repair; we want to 
preserve tombstones, but we want a "canonical" representation of only the 
minimum tombstones necessary.

Instead we want to do what you were doing with ensureRelevant, and drop columns 
that are irrelevant. But it's a little more complex than that because we have 
the same problem at the supercolumn level, as at the row level.

Here's a patch that uses an IdentityQueryFilter to run through the isRelevant 
logic using the same supercolumn-aware code that we use when merging versions 
from different memtables/sstables.

> row delete breaks read repair 
> ------------------------------
>
>                 Key: CASSANDRA-2590
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-2590
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 0.7.5, 0.8 beta 1
>            Reporter: Aaron Morton
>            Assignee: Aaron Morton
>            Priority: Minor
>         Attachments: 
> 0001-cf-resolve-test-and-possible-solution-for-read-repai.patch, 2590-v2.txt
>
>
> related to CASSANDRA-2589 
> Working at CL ALL can get inconsistent reads after row deletion. Reproduced 
> on the 0.7 and 0.8 source. 
> Steps to reproduce:
> # two node cluster with rf 2 and HH turned off
> # insert rows via cli 
> # flush both nodes 
> # shutdown node 1
> # connect to node 2 via cli and delete one row
> # bring up node 1
> # connect to node 1 via cli and issue get with CL ALL 
> # first get returns the deleted row, second get returns zero rows.
> RowRepairResolver.resolveSuperSet() resolves a local CF with the old row 
> columns, and the remote CF which is marked for deletion. CF.resolve() does 
> not pay attention to the deletion flags and the resolved CF has both 
> markedForDeletion set and a column with a lower timestamp. The return from 
> resolveSuperSet() is used as the return for the read without checking if the 
> cols are relevant. 
> Also when RowRepairResolver.mabeScheduleRepairs() runs it sends two 
> mutations. Node 1 is given the row level deletation, and Node 2 is given a 
> mutation to write the old (and now deleted) column from node 2. I have some 
> log traces for this if needed. 
> A quick fix is to check for relevant columns in the RowRepairResolver, will 
> attach shortly.    

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to