Merge branch 'cassandra-2.2' into cassandra-3.0

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

Branch: refs/heads/cassandra-3.0
Commit: 5dbeef3f51e61525c90de35c521142f7db340fe5
Parents: f0cd326 ab2b8a6
Author: Aleksey Yeschenko <alek...@apache.org>
Authored: Mon Apr 11 19:16:03 2016 +0100
Committer: Aleksey Yeschenko <alek...@apache.org>
Committed: Mon Apr 11 19:16:39 2016 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 conf/cassandra.yaml                             |  3 ++
 .../org/apache/cassandra/config/Config.java     |  1 +
 .../cassandra/config/DatabaseDescriptor.java    |  5 +++
 .../cql3/statements/BatchStatement.java         | 37 ++++++--------------
 5 files changed, 20 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/5dbeef3f/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 8c40e63,419ed21..76c9d99
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -89,9 -42,12 +89,10 @@@ Merged from 2.2
   * (cqlsh) Support utf-8/cp65001 encoding on Windows (CASSANDRA-11030)
   * Fix paging on DISTINCT queries repeats result when first row in partition 
changes
     (CASSANDRA-10010)
 + * cqlsh: change default encoding to UTF-8 (CASSANDRA-11124)
  Merged from 2.1:
+  * Checking if an unlogged batch is local is inefficient (CASSANDRA-11529)
 - * Fix paging for COMPACT tables without clustering columns (CASSANDRA-11467)
 - * Add a -j parameter to scrub/cleanup/upgradesstables to state how
 -   many threads to use (CASSANDRA-11179)
 - * Backport CASSANDRA-10679 (CASSANDRA-9598)
 + * Fix out-of-space error treatment in memtable flushing (CASSANDRA-11448).
   * Don't do defragmentation if reading from repaired sstables 
(CASSANDRA-10342)
   * Fix streaming_socket_timeout_in_ms not enforced (CASSANDRA-11286)
   * Avoid dropping message too quickly due to missing unit conversion 
(CASSANDRA-11302)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5dbeef3f/conf/cassandra.yaml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5dbeef3f/src/java/org/apache/cassandra/config/Config.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5dbeef3f/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5dbeef3f/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/cql3/statements/BatchStatement.java
index 47396fb,76e389b..1c395a5
--- a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java
@@@ -32,12 -32,12 +32,10 @@@ import org.apache.cassandra.config.Colu
  import org.apache.cassandra.config.DatabaseDescriptor;
  import org.apache.cassandra.cql3.*;
  import org.apache.cassandra.db.*;
 -import org.apache.cassandra.db.composites.Composite;
 +import org.apache.cassandra.db.partitions.PartitionUpdate;
 +import org.apache.cassandra.db.rows.RowIterator;
- import org.apache.cassandra.dht.Range;
- import org.apache.cassandra.dht.Token;
  import org.apache.cassandra.exceptions.*;
 -import org.apache.cassandra.service.ClientState;
 -import org.apache.cassandra.service.ClientWarn;
 -import org.apache.cassandra.service.QueryState;
 -import org.apache.cassandra.service.StorageProxy;
 +import org.apache.cassandra.service.*;
  import org.apache.cassandra.tracing.Tracing;
  import org.apache.cassandra.transport.messages.ResultMessage;
  import org.apache.cassandra.utils.NoSpamLogger;
@@@ -69,16 -59,8 +67,16 @@@ public class BatchStatement implements 
      private final Attributes attrs;
      private final boolean hasConditions;
      private static final Logger logger = 
LoggerFactory.getLogger(BatchStatement.class);
 -    private static final String unloggedBatchWarning = "Unlogged batch 
covering {} partitions detected against table{} {}. " +
 -                                                       "You should use a 
logged batch for atomicity, or asynchronous writes for performance.";
 +
-     private static final String UNLOGGED_BATCH_WARNING = "Unlogged batch 
covering {} partition{} detected " +
++    private static final String UNLOGGED_BATCH_WARNING = "Unlogged batch 
covering {} partitions detected " +
 +                                                         "against table{} {}. 
You should use a logged batch for " +
 +                                                         "atomicity, or 
asynchronous writes for performance.";
 +
 +    private static final String LOGGED_BATCH_LOW_GCGS_WARNING = "Executing a 
LOGGED BATCH on table{} {}, configured with a " +
 +                                                                
"gc_grace_seconds of 0. The gc_grace_seconds is used to TTL " +
 +                                                                "batchlog 
entries, so setting gc_grace_seconds too low on " +
 +                                                                "tables 
involved in an atomic batch might cause batchlog " +
 +                                                                "entries to 
expire before being replayed.";
  
      /**
       * Creates a new BatchStatement from a list of statements and a
@@@ -292,35 -275,35 +290,31 @@@
          }
      }
  
 -    private void verifyBatchType(Collection<? extends IMutation> mutations)
 +    private void verifyBatchType(Iterable<PartitionUpdate> updates)
      {
 -        if (type != Type.LOGGED && mutations.size() > 1)
 +        if (!isLogged() && Iterables.size(updates) > 1)
          {
 -            Set<String> ksCfPairs = new HashSet<>();
 -            Set<ByteBuffer> keySet = new HashSet<>();
 +            Set<DecoratedKey> keySet = new HashSet<>();
 +            Set<String> tableNames = new HashSet<>();
  
-             Map<String, Collection<Range<Token>>> localTokensByKs = new 
HashMap<>();
-             boolean localPartitionsOnly = true;
 -            for (IMutation im : mutations)
 +            for (PartitionUpdate update : updates)
              {
 -                keySet.add(im.key());
 +                keySet.add(update.partitionKey());
-                 tableNames.add(String.format("%s.%s", 
update.metadata().ksName, update.metadata().cfName));
  
-                 if (localPartitionsOnly)
-                     localPartitionsOnly &= isPartitionLocal(localTokensByKs, 
update);
 -                for (ColumnFamily cf : im.getColumnFamilies())
 -                    ksCfPairs.add(String.format("%s.%s", 
cf.metadata().ksName, cf.metadata().cfName));
++                tableNames.add(String.format("%s.%s", 
update.metadata().ksName, update.metadata().cfName));
              }
  
-             // CASSANDRA-9303: If we only have local mutations we do not warn
-             if (localPartitionsOnly)
-                 return;
- 
+             // CASSANDRA-11529: log only if we have more than a threshold of 
keys, this was also suggested in the
+             // original ticket that introduced this warning, CASSANDRA-9282
+             if (keySet.size() > 
DatabaseDescriptor.getUnloggedBatchAcrossPartitionsWarnThreshold())
+             {
 -                NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, 
TimeUnit.MINUTES, unloggedBatchWarning,
 -                                 keySet.size(), ksCfPairs.size() == 1 ? "" : 
"s", ksCfPairs);
 -
 -                
ClientWarn.instance.warn(MessageFormatter.arrayFormat(unloggedBatchWarning,
 -                                                                  new 
Object[]{
 -                                                                              
keySet.size(),
 -                                                                              
ksCfPairs.size() == 1 ? "" : "s",
 -                                                                              
ksCfPairs
 -                                                                  
}).getMessage());
 +
-             NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, 
TimeUnit.MINUTES, UNLOGGED_BATCH_WARNING,
-                              keySet.size(), keySet.size() == 1 ? "" : "s",
-                              tableNames.size() == 1 ? "" : "s", tableNames);
++                NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, 
TimeUnit.MINUTES, UNLOGGED_BATCH_WARNING,
++                                 keySet.size(), tableNames.size() == 1 ? "" : 
"s", tableNames);
 +
-             
ClientWarn.instance.warn(MessageFormatter.arrayFormat(UNLOGGED_BATCH_WARNING, 
new Object[]{keySet.size(), keySet.size() == 1 ? "" : "s",
++                
ClientWarn.instance.warn(MessageFormatter.arrayFormat(UNLOGGED_BATCH_WARNING, 
new Object[]{keySet.size(),
 +                                                    tableNames.size() == 1 ? 
"" : "s", tableNames}).getMessage());
+             }
          }
      }
  

Reply via email to