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)