Updated Branches:
  refs/heads/trunk 1a5ebd6a7 -> d365faab0

Don't send confusing info on timeouts

patch by slebresne; reviewed by jbellis for CASSANDRA-6491


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

Branch: refs/heads/trunk
Commit: b73178d8626ec7fb404c8ded442ecff23192f14f
Parents: 079f1e8
Author: Sylvain Lebresne <[email protected]>
Authored: Wed Dec 18 13:48:26 2013 +0100
Committer: Sylvain Lebresne <[email protected]>
Committed: Wed Dec 18 13:48:26 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                              |  1 +
 .../cassandra/service/AbstractWriteResponseHandler.java  | 11 ++++++++++-
 src/java/org/apache/cassandra/service/ReadCallback.java  |  8 +++++++-
 src/java/org/apache/cassandra/service/StorageProxy.java  |  4 ++--
 4 files changed, 20 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/b73178d8/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 5086440..a1514d0 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,6 @@
 1.2.14
  * Allow executing CREATE statements multiple times (CASSANDRA-6471)
+ * Don't send confusing info with timeouts (CASSANDRA-6491)
 
 1.2.13
  * Improved error message on bad properties in DDL queries (CASSANDRA-6453)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b73178d8/src/java/org/apache/cassandra/service/AbstractWriteResponseHandler.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/service/AbstractWriteResponseHandler.java 
b/src/java/org/apache/cassandra/service/AbstractWriteResponseHandler.java
index 4df9e1f..3cd853f 100644
--- a/src/java/org/apache/cassandra/service/AbstractWriteResponseHandler.java
+++ b/src/java/org/apache/cassandra/service/AbstractWriteResponseHandler.java
@@ -88,7 +88,16 @@ public abstract class AbstractWriteResponseHandler 
implements IAsyncCallback
         }
 
         if (!success)
-            throw new WriteTimeoutException(writeType, consistencyLevel, 
ackCount(), totalBlockFor());
+        {
+            int acks = ackCount();
+            int blockedFor = totalBlockFor();
+            // It's pretty unlikely, but we can race between exiting await 
above and here, so
+            // that we could now have enough acks. In that case, we "lie" on 
the acks count to
+            // avoid sending confusing info to the user (see CASSANDRA-).
+            if (acks >= blockedFor)
+                acks = blockedFor - 1;
+            throw new WriteTimeoutException(writeType, consistencyLevel, acks, 
blockedFor);
+        }
     }
 
     protected int totalBlockFor()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b73178d8/src/java/org/apache/cassandra/service/ReadCallback.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/ReadCallback.java 
b/src/java/org/apache/cassandra/service/ReadCallback.java
index 64b9e76..7889039 100644
--- a/src/java/org/apache/cassandra/service/ReadCallback.java
+++ b/src/java/org/apache/cassandra/service/ReadCallback.java
@@ -97,7 +97,13 @@ public class ReadCallback<TMessage, TResolved> implements 
IAsyncCallback<TMessag
         }
 
         if (!success)
-            throw new ReadTimeoutException(consistencyLevel, received.get(), 
blockfor, resolver.isDataPresent());
+        {
+            // Same as for writes, see AbstractWriteResponseHandler
+            int acks = received.get();
+            if (resolver.isDataPresent() && acks >= blockfor)
+                acks = blockfor - 1;
+            throw new ReadTimeoutException(consistencyLevel, acks, blockfor, 
resolver.isDataPresent());
+        }
 
         return blockfor == 1 ? resolver.getData() : resolver.resolve();
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b73178d8/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 d49e59d..e6cd755 100644
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@ -1013,7 +1013,7 @@ public class StorageProxy implements StorageProxyMBean
                     {
                         Tracing.trace("Timed out on digest mismatch retries");
                         int blockFor = 
consistency_level.blockFor(Table.open(command.getKeyspace()));
-                        throw new ReadTimeoutException(consistency_level, 
blockFor, blockFor, true);
+                        throw new ReadTimeoutException(consistency_level, 
blockFor-1, blockFor, true);
                     }
 
                     // retry any potential short reads
@@ -1248,7 +1248,7 @@ public class StorageProxy implements StorageProxyMBean
                         Tracing.trace("Timed out while read-repairing after 
receiving all {} data and digest responses", blockFor);
                     else
                         logger.debug("Range slice timeout while read-repairing 
after receiving all {} data and digest responses", blockFor);
-                    throw new ReadTimeoutException(consistency_level, 
blockFor, blockFor, true);
+                    throw new ReadTimeoutException(consistency_level, 
blockFor-1, blockFor, true);
                 }
                 catch (DigestMismatchException e)
                 {

Reply via email to