Updated Branches:
  refs/heads/cassandra-2.0 f8fd7db67 -> de19f963a
  refs/heads/trunk c2294aa21 -> db07b20ed


Fix execution of LOCAL_QUORUM queries with SimpleStrategy

patch by alexliu68; reviewed by slebresne for CASSANDRA-6545


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/32d7cb50
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/32d7cb50
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/32d7cb50

Branch: refs/heads/trunk
Commit: 32d7cb5066050ef6123f50a25c6e9b4c9e180ea0
Parents: 2a7c20e
Author: Sylvain Lebresne <sylv...@datastax.com>
Authored: Wed Jan 8 17:14:58 2014 +0100
Committer: Sylvain Lebresne <sylv...@datastax.com>
Committed: Wed Jan 8 17:15:20 2014 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/ConsistencyLevel.java   | 60 +++++++++++++-------
 .../locator/AbstractReplicationStrategy.java    |  2 +-
 3 files changed, 42 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/32d7cb50/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 5a85977..cba97d0 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -8,6 +8,7 @@
  * fsync compression metadata (CASSANDRA-6531)
  * Validate CF existence on execution for prepared statement (CASSANDRA-6535)
  * Add ability to throttle batchlog replay (CASSANDRA-6550)
+ * Fix executing LOCAL_QUORUM with SimpleStrategy (CASSANDRA-6545)
 
 
 1.2.13

http://git-wip-us.apache.org/repos/asf/cassandra/blob/32d7cb50/src/java/org/apache/cassandra/db/ConsistencyLevel.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ConsistencyLevel.java 
b/src/java/org/apache/cassandra/db/ConsistencyLevel.java
index 4d72767..3737c73 100644
--- a/src/java/org/apache/cassandra/db/ConsistencyLevel.java
+++ b/src/java/org/apache/cassandra/db/ConsistencyLevel.java
@@ -88,9 +88,16 @@ public enum ConsistencyLevel
         return codeIdx[code];
     }
 
+    private int quorumFor(Table table)
+    {
+        return (table.getReplicationStrategy().getReplicationFactor() / 2) + 1;
+    }
+
     private int localQuorumFor(Table table, String dc)
     {
-        return (((NetworkTopologyStrategy) 
table.getReplicationStrategy()).getReplicationFactor(dc) / 2) + 1;
+        return (table.getReplicationStrategy() instanceof 
NetworkTopologyStrategy)
+             ? (((NetworkTopologyStrategy) 
table.getReplicationStrategy()).getReplicationFactor(dc) / 2) + 1
+             : quorumFor(table);
     }
 
     public int blockFor(Table table)
@@ -107,17 +114,24 @@ public enum ConsistencyLevel
             case THREE:
                 return 3;
             case QUORUM:
-                return (table.getReplicationStrategy().getReplicationFactor() 
/ 2) + 1;
+                return quorumFor(table);
             case ALL:
                 return table.getReplicationStrategy().getReplicationFactor();
             case LOCAL_QUORUM:
                 return localQuorumFor(table, 
DatabaseDescriptor.getLocalDataCenter());
             case EACH_QUORUM:
-                NetworkTopologyStrategy strategy = (NetworkTopologyStrategy) 
table.getReplicationStrategy();
-                int n = 0;
-                for (String dc : strategy.getDatacenters())
-                    n += localQuorumFor(table, dc);
-                return n;
+                if (table.getReplicationStrategy() instanceof 
NetworkTopologyStrategy)
+                {
+                    NetworkTopologyStrategy strategy = 
(NetworkTopologyStrategy) table.getReplicationStrategy();
+                    int n = 0;
+                    for (String dc : strategy.getDatacenters())
+                        n += localQuorumFor(table, dc);
+                    return n;
+                }
+                else
+                {
+                    return quorumFor(table);
+                }
             default:
                 throw new UnsupportedOperationException("Invalid consistency 
level: " + toString());
         }
@@ -208,16 +222,20 @@ public enum ConsistencyLevel
                 // local hint is acceptable, and local node is always live
                 return true;
             case LOCAL_ONE:
-                    return countLocalEndpoints(liveEndpoints) >= 1;
+                return countLocalEndpoints(liveEndpoints) >= 1;
             case LOCAL_QUORUM:
                 return countLocalEndpoints(liveEndpoints) >= blockFor(table);
             case EACH_QUORUM:
-                for (Map.Entry<String, Integer> entry : 
countPerDCEndpoints(table, liveEndpoints).entrySet())
+                if (table.getReplicationStrategy() instanceof 
NetworkTopologyStrategy)
                 {
-                    if (entry.getValue() < localQuorumFor(table, 
entry.getKey()))
-                        return false;
+                    for (Map.Entry<String, Integer> entry : 
countPerDCEndpoints(table, liveEndpoints).entrySet())
+                    {
+                        if (entry.getValue() < localQuorumFor(table, 
entry.getKey()))
+                            return false;
+                    }
+                    return true;
                 }
-                return true;
+                // Fallthough on purpose for SimpleStrategy
             default:
                 return Iterables.size(liveEndpoints) >= blockFor(table);
         }
@@ -250,14 +268,18 @@ public enum ConsistencyLevel
                 }
                 break;
             case EACH_QUORUM:
-                for (Map.Entry<String, Integer> entry : 
countPerDCEndpoints(table, liveEndpoints).entrySet())
+                if (table.getReplicationStrategy() instanceof 
NetworkTopologyStrategy)
                 {
-                    int dcBlockFor = localQuorumFor(table, entry.getKey());
-                    int dcLive = entry.getValue();
-                    if (dcLive < dcBlockFor)
-                        throw new UnavailableException(this, dcBlockFor, 
dcLive);
+                    for (Map.Entry<String, Integer> entry : 
countPerDCEndpoints(table, liveEndpoints).entrySet())
+                    {
+                        int dcBlockFor = localQuorumFor(table, entry.getKey());
+                        int dcLive = entry.getValue();
+                        if (dcLive < dcBlockFor)
+                            throw new UnavailableException(this, dcBlockFor, 
dcLive);
+                    }
+                    break;
                 }
-                break;
+                // Fallthough on purpose for SimpleStrategy
             default:
                 int live = Iterables.size(liveEndpoints);
                 if (live < blockFor)
@@ -282,8 +304,6 @@ public enum ConsistencyLevel
 
     public void validateForWrite(String table) throws InvalidRequestException
     {
-        if(this == EACH_QUORUM)
-            requireNetworkTopologyStrategy(table);
     }
 
     public void validateCounterForWrite(CFMetaData metadata) throws 
InvalidRequestException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/32d7cb50/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java 
b/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
index a48bec9..e4dd422 100644
--- a/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
+++ b/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
@@ -134,7 +134,7 @@ public abstract class AbstractReplicationStrategy
             // block for in this context will be localnodes block.
             return new DatacenterWriteResponseHandler(naturalEndpoints, 
pendingEndpoints, consistency_level, getTable(), callback, writeType);
         }
-        else if (consistency_level == ConsistencyLevel.EACH_QUORUM)
+        else if (consistency_level == ConsistencyLevel.EACH_QUORUM && (this 
instanceof NetworkTopologyStrategy))
         {
             return new DatacenterSyncWriteResponseHandler(naturalEndpoints, 
pendingEndpoints, consistency_level, getTable(), callback, writeType);
         }

Reply via email to