[ 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