From 2b0e38936c863306dcc03a5ed1e4476aea4f4aaa Mon Sep 17 00:00:00 2001 From: Maxim Muzafarov Date: Wed, 30 Oct 2024 18:19:10 +0100 Subject: [PATCH 1/3] CASSANDRA-19429 Avoid using getCapacity for the SSTableReader in a hot path --- .../org/apache/cassandra/cache/InstrumentingCache.java | 8 ++++++++ src/java/org/apache/cassandra/cache/NopCacheProvider.java | 2 +- .../apache/cassandra/io/sstable/format/SSTableReader.java | 6 +++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/cassandra/cache/InstrumentingCache.java b/src/java/org/apache/cassandra/cache/InstrumentingCache.java index 494dbbc561..0dcce68310 100644 --- a/src/java/org/apache/cassandra/cache/InstrumentingCache.java +++ b/src/java/org/apache/cassandra/cache/InstrumentingCache.java @@ -18,6 +18,7 @@ package org.apache.cassandra.cache; import java.util.Iterator; +import java.util.concurrent.atomic.AtomicLong; import org.apache.cassandra.metrics.CacheMetrics; @@ -28,6 +29,7 @@ public class InstrumentingCache { private final ICache map; private final String type; + private final boolean enabled; private CacheMetrics metrics; @@ -35,6 +37,7 @@ public class InstrumentingCache { this.map = map; this.type = type; + enabled = !(map instanceof NopCacheProvider.NopCache) && map.capacity() > 0; this.metrics = new CacheMetrics(type, map); } @@ -84,6 +87,11 @@ public class InstrumentingCache map.setCapacity(capacity); } + public boolean enabled() + { + return enabled; + } + public int size() { return map.size(); diff --git a/src/java/org/apache/cassandra/cache/NopCacheProvider.java b/src/java/org/apache/cassandra/cache/NopCacheProvider.java index 9b8a3dcdf1..22fd6456cd 100644 --- a/src/java/org/apache/cassandra/cache/NopCacheProvider.java +++ b/src/java/org/apache/cassandra/cache/NopCacheProvider.java @@ -27,7 +27,7 @@ public class NopCacheProvider implements CacheProvider + static class NopCache implements ICache { public long capacity() { diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java index f26cf65c93..ccdaf593a4 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java @@ -519,7 +519,7 @@ public abstract class SSTableReader extends SSTable implements UnfilteredSource, if (validate) sstable.validate(); - if (sstable.getKeyCache() != null) + if (logger.isTraceEnabled() && sstable.getKeyCache() != null && sstable.getKeyCache().enabled()) logger.trace("key cache contains {}/{} keys", sstable.getKeyCache().size(), sstable.getKeyCache().getCapacity()); return sstable; @@ -717,7 +717,7 @@ public abstract class SSTableReader extends SSTable implements UnfilteredSource, // e.g. by BulkLoader, which does not initialize the cache. As a kludge, we set up the cache // here when we know we're being wired into the rest of the server infrastructure. InstrumentingCache maybeKeyCache = CacheService.instance.keyCache; - if (maybeKeyCache.getCapacity() > 0) + if (maybeKeyCache.enabled()) keyCache = maybeKeyCache; final ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(metadata().id); @@ -1333,7 +1333,7 @@ public abstract class SSTableReader extends SSTable implements UnfilteredSource, { CachingParams caching = metadata().params.caching; - if (!caching.cacheKeys() || keyCache == null || keyCache.getCapacity() == 0) + if (!caching.cacheKeys() || keyCache == null || !keyCache.enabled()) return; KeyCacheKey cacheKey = new KeyCacheKey(metadata(), descriptor, key.getKey()); From 272fec235c680b147ed7811d96a857a712e50941 Mon Sep 17 00:00:00 2001 From: Maxim Muzafarov Date: Wed, 30 Oct 2024 19:59:36 +0100 Subject: [PATCH 2/3] remove unused imports --- src/java/org/apache/cassandra/cache/InstrumentingCache.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/java/org/apache/cassandra/cache/InstrumentingCache.java b/src/java/org/apache/cassandra/cache/InstrumentingCache.java index 0dcce68310..7335b92413 100644 --- a/src/java/org/apache/cassandra/cache/InstrumentingCache.java +++ b/src/java/org/apache/cassandra/cache/InstrumentingCache.java @@ -18,7 +18,6 @@ package org.apache.cassandra.cache; import java.util.Iterator; -import java.util.concurrent.atomic.AtomicLong; import org.apache.cassandra.metrics.CacheMetrics; From 6be8b3e330ae1af40efe110ca646bb0ccb08f9c2 Mon Sep 17 00:00:00 2001 From: Maxim Muzafarov Date: Thu, 31 Oct 2024 17:08:31 +0100 Subject: [PATCH 3/3] make config changeable at runtime --- src/java/org/apache/cassandra/cache/InstrumentingCache.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/cache/InstrumentingCache.java b/src/java/org/apache/cassandra/cache/InstrumentingCache.java index 7335b92413..d657d64adf 100644 --- a/src/java/org/apache/cassandra/cache/InstrumentingCache.java +++ b/src/java/org/apache/cassandra/cache/InstrumentingCache.java @@ -28,7 +28,7 @@ public class InstrumentingCache { private final ICache map; private final String type; - private final boolean enabled; + private volatile boolean enabled; private CacheMetrics metrics; @@ -84,6 +84,7 @@ public class InstrumentingCache public void setCapacity(long capacity) { map.setCapacity(capacity); + enabled = capacity > 0; } public boolean enabled()