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

Sylvain Lebresne updated CASSANDRA-5113:
----------------------------------------

    Fix Version/s:     (was: 1.1.9)
                   1.2.1
    
> RepairCallback breaks CL guarantees
> -----------------------------------
>
>                 Key: CASSANDRA-5113
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-5113
>             Project: Cassandra
>          Issue Type: Bug
>            Reporter: Sylvain Lebresne
>            Assignee: Sylvain Lebresne
>             Fix For: 1.2.1
>
>         Attachments: 0001-Always-ensure-CL-after-a-digest-mismatch-1.2.txt, 
> 0001-Always-ensure-CL-after-a-digest-mismatch.txt, 
> 0002-Rename-RowRepairResolver-to-RowDataResolver-1.2.txt, 
> 0002-Rename-RowRepairResolver-to-RowDataResolver.txt
>
>
> RepairCallback does not validate the consistency level of the query. It seems 
> that this was done on purpose as the comments there says:
> {noformat}
> /**
>  * The main difference between this and ReadCallback is, ReadCallback has a 
> ConsistencyLevel
>  * it needs to achieve.  Repair on the other hand is happy to repair whoever 
> replies within the timeout.
>  */
> {noformat}
> Concretely, the get() method of RepairCallback:
> * waits for all endpoints, even if there is more than strictly required by 
> the CL.
> * if it timeouts, doesn't check it and always return a response.
> * for some reason, it returns null unless there is strictly more than 1 
> response.
> All of that seems wrong to me. The result of RepairCallback is what is 
> returned to the client in case of a digest mismatch on the first read. So we 
> must ensure that the CL has been reached. Also, returning null where there is 
> 1 response (or none) seems clearly wrong.
> In fact I don't think we need a special callback for this "read all data" 
> phase as it is a "normal" read (the fact we do a first read with digests is 
> just an "optimization"). The only difference between the two phases should be 
> how we resolve the responses (in the first case we have digest and in the 2nd 
> we don't) but that's handled by the resolver.
> So attaching a patch that removes RepairCallback and use ReadCallback 
> instead.  I'm also attaching a 2nd trivial patch that renames 
> RowRepairResolver to RowDataResolver because I think it describe better what 
> this actually do (i.e.  the main goal is to resolve a full data read to 
> answer the right value to the client, repairing inconsistent nodes is 
> secondary).
> The patch is against 1.1, because I think breaking CL guarantees is probably 
> serious enough to warrant pushing this to 1.1.

--
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

Reply via email to