You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2013/12/18 13:52:58 UTC

[1/3] git commit: Don't send confusing info on timeouts

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 <sy...@datastax.com>
Authored: Wed Dec 18 13:48:26 2013 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
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)
                 {


[3/3] git commit: Merge branch 'cassandra-2.0' into trunk

Posted by sl...@apache.org.
Merge branch 'cassandra-2.0' into trunk


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

Branch: refs/heads/trunk
Commit: d365faab07f14d436bf827b3cf6dae5d25e4c9c1
Parents: 1a5ebd6 1727ea7
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed Dec 18 13:51:48 2013 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed Dec 18 13:51:48 2013 +0100

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


http://git-wip-us.apache.org/repos/asf/cassandra/blob/d365faab/CHANGES.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d365faab/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/StorageProxy.java
index 6f362db,2da9d38..e4741f6
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@@ -1664,33 -1577,17 +1664,33 @@@ public class StorageProxy implements St
                          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)
 +
 +                if (haveSufficientRows)
 +                    return trim(command, rows);
 +
 +                // we didn't get enough rows in our concurrent fetch; recalculate our concurrency factor
 +                // based on the results we've seen so far (as long as we still have ranges left to query)
 +                if (i < ranges.size())
                  {
 -                    throw new AssertionError(e); // no digests in range slices yet
 +                    float fetchedRows = command.countCQL3Rows() ? cql3RowCount : rows.size();
 +                    float remainingRows = command.limit() - fetchedRows;
 +                    float actualRowsPerRange;
 +                    if (fetchedRows == 0.0)
 +                    {
 +                        // we haven't actually gotten any results, so query all remaining ranges at once
 +                        actualRowsPerRange = 0.0f;
 +                        concurrencyFactor = ranges.size() - i;
 +                    }
 +                    else
 +                    {
 +                        actualRowsPerRange = i / fetchedRows;
 +                        concurrencyFactor = Math.max(1, Math.min(ranges.size() - i, Math.round(remainingRows / actualRowsPerRange)));
 +                    }
 +                    logger.debug("Didn't get enough response rows; actual rows per range: {}; remaining rows: {}, new concurrent requests: {}",
 +                                 actualRowsPerRange, (int) remainingRows, concurrencyFactor);
                  }
 -
 -                // if we're done, great, otherwise, move to the next range
 -                int count = nodeCmd.countCQL3Rows() ? cql3RowCount : rows.size();
 -                if (count >= nodeCmd.limit())
 -                    break;
              }
          }
          finally


[2/3] git commit: Merge branch 'cassandra-1.2' into cassandra-2.0

Posted by sl...@apache.org.
Merge branch 'cassandra-1.2' into cassandra-2.0

Conflicts:
	CHANGES.txt
	src/java/org/apache/cassandra/service/ReadCallback.java
	src/java/org/apache/cassandra/service/StorageProxy.java


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

Branch: refs/heads/trunk
Commit: 1727ea773324b9a8afd41b5d5d238aee1dd8f441
Parents: 7c32ffb b73178d
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed Dec 18 13:51:23 2013 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed Dec 18 13:51:23 2013 +0100

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


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1727ea77/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 5a124ab,a1514d0..10c9c33
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -30,46 -23,9 +30,47 @@@ Merged from 1.2
     (CASSANDRA-6413)
   * (Hadoop) add describe_local_ring (CASSANDRA-6268)
   * Fix handling of concurrent directory creation failure (CASSANDRA-6459)
 + * Allow executing CREATE statements multiple times (CASSANDRA-6471)
++ * Don't send confusing info with timeouts (CASSANDRA-6491)
  
  
 -1.2.12
 +2.0.3
 + * Fix FD leak on slice read path (CASSANDRA-6275)
 + * Cancel read meter task when closing SSTR (CASSANDRA-6358)
 + * free off-heap IndexSummary during bulk (CASSANDRA-6359)
 + * Recover from IOException in accept() thread (CASSANDRA-6349)
 + * Improve Gossip tolerance of abnormally slow tasks (CASSANDRA-6338)
 + * Fix trying to hint timed out counter writes (CASSANDRA-6322)
 + * Allow restoring specific columnfamilies from archived CL (CASSANDRA-4809)
 + * Avoid flushing compaction_history after each operation (CASSANDRA-6287)
 + * Fix repair assertion error when tombstones expire (CASSANDRA-6277)
 + * Skip loading corrupt key cache (CASSANDRA-6260)
 + * Fixes for compacting larger-than-memory rows (CASSANDRA-6274)
 + * Compact hottest sstables first and optionally omit coldest from
 +   compaction entirely (CASSANDRA-6109)
 + * Fix modifying column_metadata from thrift (CASSANDRA-6182)
 + * cqlsh: fix LIST USERS output (CASSANDRA-6242)
 + * Add IRequestSink interface (CASSANDRA-6248)
 + * Update memtable size while flushing (CASSANDRA-6249)
 + * Provide hooks around CQL2/CQL3 statement execution (CASSANDRA-6252)
 + * Require Permission.SELECT for CAS updates (CASSANDRA-6247)
 + * New CQL-aware SSTableWriter (CASSANDRA-5894)
 + * Reject CAS operation when the protocol v1 is used (CASSANDRA-6270)
 + * Correctly throw error when frame too large (CASSANDRA-5981)
 + * Fix serialization bug in PagedRange with 2ndary indexes (CASSANDRA-6299)
 + * Fix CQL3 table validation in Thrift (CASSANDRA-6140)
 + * Fix bug missing results with IN clauses (CASSANDRA-6327)
 + * Fix paging with reversed slices (CASSANDRA-6343)
 + * Set minTimestamp correctly to be able to drop expired sstables (CASSANDRA-6337)
 + * Support NaN and Infinity as float literals (CASSANDRA-6003)
 + * Remove RF from nodetool ring output (CASSANDRA-6289)
 + * Fix attempting to flush empty rows (CASSANDRA-6374)
 + * Fix potential out of bounds exception when paging (CASSANDRA-6333)
 +Merged from 1.2:
 + * Optimize FD phi calculation (CASSANDRA-6386)
 + * Improve initial FD phi estimate when starting up (CASSANDRA-6385)
 + * Don't list CQL3 table in CLI describe even if named explicitely 
 +   (CASSANDRA-5750)
   * Invalidate row cache when dropping CF (CASSANDRA-6351)
   * add non-jamm path for cached statements (CASSANDRA-6293)
   * (Hadoop) Require CFRR batchSize to be at least 2 (CASSANDRA-6114)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1727ea77/src/java/org/apache/cassandra/service/AbstractWriteResponseHandler.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1727ea77/src/java/org/apache/cassandra/service/ReadCallback.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/ReadCallback.java
index d4cc7f5,7889039..d665242
--- a/src/java/org/apache/cassandra/service/ReadCallback.java
+++ b/src/java/org/apache/cassandra/service/ReadCallback.java
@@@ -89,16 -95,14 +89,20 @@@ public class ReadCallback<TMessage, TRe
          {
              throw new AssertionError(ex);
          }
 +    }
  
 -        if (!success)
 +    public TResolved get() throws ReadTimeoutException, DigestMismatchException
 +    {
 +        if (!await(command.getTimeout(), TimeUnit.MILLISECONDS))
          {
+             // 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());
 +            ReadTimeoutException ex = new ReadTimeoutException(consistencyLevel, received.get(), blockfor, resolver.isDataPresent());
 +            if (logger.isDebugEnabled())
 +                logger.debug("Read timeout: {}", ex.toString());
 +            throw ex;
          }
  
          return blockfor == 1 ? resolver.getData() : resolver.resolve();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1727ea77/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/StorageProxy.java
index 4b53246,e6cd755..2da9d38
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@@ -1351,8 -1012,8 +1351,8 @@@ public class StorageProxy implements St
                      catch (TimeoutException e)
                      {
                          Tracing.trace("Timed out on digest mismatch retries");
 -                        int blockFor = consistency_level.blockFor(Table.open(command.getKeyspace()));
 -                        throw new ReadTimeoutException(consistency_level, blockFor-1, blockFor, true);
 +                        int blockFor = consistencyLevel.blockFor(Keyspace.open(command.getKeyspace()));
-                         throw new ReadTimeoutException(consistencyLevel, blockFor, blockFor, true);
++                        throw new ReadTimeoutException(consistencyLevel, blockFor-1, blockFor, true);
                      }
  
                      // retry any potential short reads