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)