[
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