Fix inconsistent use of consistencyForCommit that allowed LOCAL_QUORUM operations to incorrect become full QUORUM patch by Sankalp Kohli; reviewed by jbellis for CASSANDRA-7345
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/2b973b9e Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/2b973b9e Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/2b973b9e Branch: refs/heads/cassandra-2.1 Commit: 2b973b9ed1c1c6bd1c5b0c756cae12db434f02c0 Parents: 900f29c Author: Jonathan Ellis <jbel...@apache.org> Authored: Thu Jun 26 21:35:50 2014 -0500 Committer: Jonathan Ellis <jbel...@apache.org> Committed: Thu Jun 26 21:35:50 2014 -0500 ---------------------------------------------------------------------- CHANGES.txt | 2 ++ src/java/org/apache/cassandra/service/StorageProxy.java | 11 ++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/2b973b9e/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index c74b27d..365722f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,7 @@ 2.0.10 * Fix race in FileCacheService RemovalListener (CASSANDRA-7278) + * Fix inconsistent use of consistencyForCommit that allowed LOCAL_QUORUM + operations to incorrect become full QUORUM (CASSANDRA-7345) 2.0.9 http://git-wip-us.apache.org/repos/asf/cassandra/blob/2b973b9e/src/java/org/apache/cassandra/service/StorageProxy.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index 3b10cff..c606d75 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -217,7 +217,7 @@ public class StorageProxy implements StorageProxyMBean List<InetAddress> liveEndpoints = p.left; int requiredParticipants = p.right; - UUID ballot = beginAndRepairPaxos(start, key, metadata, liveEndpoints, requiredParticipants, consistencyForPaxos); + UUID ballot = beginAndRepairPaxos(start, key, metadata, liveEndpoints, requiredParticipants, consistencyForPaxos, consistencyForCommit); // read the current values and check they validate the conditions Tracing.trace("Reading existing values for CAS precondition"); @@ -302,7 +302,7 @@ public class StorageProxy implements StorageProxyMBean * @return the Paxos ballot promised by the replicas if no in-progress requests were seen and a quorum of * nodes have seen the mostRecentCommit. Otherwise, return null. */ - private static UUID beginAndRepairPaxos(long start, ByteBuffer key, CFMetaData metadata, List<InetAddress> liveEndpoints, int requiredParticipants, ConsistencyLevel consistencyForPaxos) + private static UUID beginAndRepairPaxos(long start, ByteBuffer key, CFMetaData metadata, List<InetAddress> liveEndpoints, int requiredParticipants, ConsistencyLevel consistencyForPaxos, ConsistencyLevel consistencyForCommit) throws WriteTimeoutException { long timeout = TimeUnit.MILLISECONDS.toNanos(DatabaseDescriptor.getCasContentionTimeout()); @@ -338,7 +338,7 @@ public class StorageProxy implements StorageProxyMBean Commit refreshedInProgress = Commit.newProposal(inProgress.key, ballot, inProgress.update); if (proposePaxos(refreshedInProgress, liveEndpoints, requiredParticipants, false, consistencyForPaxos)) { - commitPaxos(refreshedInProgress, ConsistencyLevel.QUORUM); + commitPaxos(refreshedInProgress, consistencyForCommit); } else { @@ -1140,16 +1140,17 @@ public class StorageProxy implements StorageProxyMBean int requiredParticipants = p.right; // does the work of applying in-progress writes; throws UAE or timeout if it can't + final ConsistencyLevel consistencyForCommitOrFetch = consistency_level == ConsistencyLevel.LOCAL_SERIAL ? ConsistencyLevel.LOCAL_QUORUM : ConsistencyLevel.QUORUM; try { - beginAndRepairPaxos(start, command.key, metadata, liveEndpoints, requiredParticipants, consistency_level); + beginAndRepairPaxos(start, command.key, metadata, liveEndpoints, requiredParticipants, consistency_level, consistencyForCommitOrFetch); } catch (WriteTimeoutException e) { throw new ReadTimeoutException(consistency_level, 0, consistency_level.blockFor(Keyspace.open(command.ksName)), false); } - rows = fetchRows(commands, consistency_level == ConsistencyLevel.LOCAL_SERIAL ? ConsistencyLevel.LOCAL_QUORUM : ConsistencyLevel.QUORUM); + rows = fetchRows(commands, consistencyForCommitOrFetch); } else {