Paulo Motta created CASSANDRA-11529:
---------------------------------------

             Summary: Checking if an unlogged batch is local is inefficient
                 Key: CASSANDRA-11529
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-11529
             Project: Cassandra
          Issue Type: Bug
          Components: Coordination
            Reporter: Paulo Motta


Based on CASSANDRA-11363 report I noticed that on CASSANDRA-9303 we introduced 
the following check to avoid printing a {{WARN}} in case an unlogged batch 
statement is local:

{noformat}
             for (IMutation im : mutations)
             {
                 keySet.add(im.key());
                 for (ColumnFamily cf : im.getColumnFamilies())
                     ksCfPairs.add(String.format("%s.%s", cf.metadata().ksName, 
cf.metadata().cfName));
+
+                if (localMutationsOnly)
+                    localMutationsOnly &= isMutationLocal(localTokensByKs, im);
             }
 
+            // CASSANDRA-9303: If we only have local mutations we do not warn
+            if (localMutationsOnly)
+                return;
+
             NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, 
TimeUnit.MINUTES, unloggedBatchWarning,
                              keySet.size(), keySet.size() == 1 ? "" : "s",
                              ksCfPairs.size() == 1 ? "" : "s", ksCfPairs);
{noformat}

The {{isMutationLocal}} check uses 
{{StorageService.instance.getLocalRanges(mutation.getKeyspaceName())}}, which 
underneaths uses {{AbstractReplication.getAddressRanges}} to calculate local 
ranges. 

Recalculating this at every unlogged batch can be pretty inefficient, so we 
should at the very least cache it every time the ring changes.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to