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

Hudson commented on CASSANDRA-2870:
-----------------------------------

Integrated in Cassandra-0.7 #526 (See 
[https://builds.apache.org/job/Cassandra-0.7/526/])
    fix possibility of spuriousUnavailableException for LOCAL_QUORUM reads with 
dynamic snitch and read repair disabled
patch by jbellis; reviewed by slebresne for CASSANDRA-2870

jbellis : 
http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1144380
Files : 
* /cassandra/branches/cassandra-0.7/CHANGES.txt
* 
/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/ReadCallback.java
* 
/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/DatacenterReadCallback.java


> dynamic snitch + read repair off can cause LOCAL_QUORUM reads to return 
> spurious UnavailableException
> -----------------------------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-2870
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-2870
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 0.7.0
>            Reporter: Jonathan Ellis
>            Assignee: Jonathan Ellis
>            Priority: Minor
>             Fix For: 0.7.8, 0.8.2
>
>         Attachments: 2870.txt
>
>
> When Read Repair is off, we want to avoid doing requests to more nodes than 
> necessary to satisfy the ConsistencyLevel.  ReadCallback does this here:
> {code}
>         this.endpoints = repair || resolver instanceof RowRepairResolver
>                        ? endpoints
>                        : endpoints.subList(0, Math.min(endpoints.size(), 
> blockfor)); // min so as to not throw exception until assureSufficient is 
> called
> {code}
> You can see that it is assuming that the "endpoints" list is sorted in order 
> of preferred-ness for the read.
> Then the LOCAL_QUORUM code in DatacenterReadCallback checks to see if we have 
> enough nodes to do the read:
> {code}
>         int localEndpoints = 0;
>         for (InetAddress endpoint : endpoints)
>         {
>             if (localdc.equals(snitch.getDatacenter(endpoint)))
>                 localEndpoints++;
>         }
>         if (localEndpoints < blockfor)
>             throw new UnavailableException();
> {code}
> So if repair is off (so we truncate our endpoints list) AND dynamic snitch 
> has decided that nodes in another DC are to be preferred over local ones, 
> we'll throw UE even if all the replicas are healthy.

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

        

Reply via email to