This is an automated email from the ASF dual-hosted git repository. marcuse pushed a commit to branch cassandra-5.0 in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/cassandra-5.0 by this push: new f9ab5cf797 Add flag to avoid invalidating key cache on sstable deletions f9ab5cf797 is described below commit f9ab5cf797013211c51c4e7d2dbd401300eb44e6 Author: Marcus Eriksson <marc...@apache.org> AuthorDate: Fri Nov 8 13:39:51 2024 +0100 Add flag to avoid invalidating key cache on sstable deletions Patch by marcuse; reviewed by Caleb Rackliffe for CASSANDRA-20068 --- CHANGES.txt | 1 + src/java/org/apache/cassandra/config/Config.java | 1 + .../org/apache/cassandra/config/DatabaseDescriptor.java | 10 ++++++++++ .../apache/cassandra/io/sstable/format/big/BigFormat.java | 15 +++++++++------ src/java/org/apache/cassandra/service/StorageService.java | 10 ++++++++++ .../org/apache/cassandra/service/StorageServiceMBean.java | 2 ++ .../cassandra/io/sstable/keycache/KeyCacheTest.java | 6 +++--- 7 files changed, 36 insertions(+), 9 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 6fbc22f8fb..b038387817 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 5.0.3 + * Add flag to avoid invalidating key cache on sstable deletions (CASSANDRA-20068) * Interpret inet, bigint, varint, and decimal as non-reversed types for query construction and post-filtering (CASSANDRA-20100) * Fix delayed gossip shutdown messages clobbering startup states that leave restarted nodes appearing down (CASSANDRA-20033) * Streamline the serialized format for index status gossip messages (CASSANDRA-20058) diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 103d8a7cf7..8f6283ac1d 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -455,6 +455,7 @@ public class Config public volatile DataStorageSpec.IntMebibytesBound sstable_preemptive_open_interval = new DataStorageSpec.IntMebibytesBound("50MiB"); public volatile boolean key_cache_migrate_during_compaction = true; + public volatile boolean key_cache_invalidate_after_sstable_deletion = false; public volatile int key_cache_keys_to_save = Integer.MAX_VALUE; @Replaces(oldName = "key_cache_size_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_LONG, deprecated = true) public DataStorageSpec.LongMebibytesBound key_cache_size = null; diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index bf44b53e2b..8fe910aad7 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -3760,6 +3760,16 @@ public class DatabaseDescriptor conf.key_cache_migrate_during_compaction = migrateCacheEntry; } + public static boolean shouldInvalidateKeycacheOnSSTableDeletion() + { + return conf.key_cache_invalidate_after_sstable_deletion; + } + + public static void setInvalidateKeycacheOnSSTableDeletion(boolean invalidateCacheEntry) + { + conf.key_cache_invalidate_after_sstable_deletion = invalidateCacheEntry; + } + /** This method can return negative number for disabled */ public static int getSSTablePreemptiveOpenIntervalInMiB() { diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java index 4abfc88b5a..d188638669 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java +++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java @@ -247,13 +247,16 @@ public class BigFormat extends AbstractSSTableFormat<BigTableReader, BigTableWri { try { - // remove key cache entries for the sstable being deleted - Iterator<KeyCacheKey> it = CacheService.instance.keyCache.keyIterator(); - while (it.hasNext()) + if (DatabaseDescriptor.shouldInvalidateKeycacheOnSSTableDeletion()) { - KeyCacheKey key = it.next(); - if (key.desc.equals(desc)) - it.remove(); + // remove key cache entries for the sstable being deleted + Iterator<KeyCacheKey> it = CacheService.instance.keyCache.keyIterator(); + while (it.hasNext()) + { + KeyCacheKey key = it.next(); + if (key.desc.equals(desc)) + it.remove(); + } } delete(desc, Lists.newArrayList(Sets.intersection(allComponents(), desc.discoverComponents()))); diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 7a86e89fd5..ec771ab9bf 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -6646,6 +6646,16 @@ public class StorageService extends NotificationBroadcasterSupport implements IE DatabaseDescriptor.setMigrateKeycacheOnCompaction(invalidateKeyCacheOnCompaction); } + public boolean getInvalidateKeycacheOnSSTableDeletion() + { + return DatabaseDescriptor.shouldInvalidateKeycacheOnSSTableDeletion(); + } + + public void setInvalidateKeycacheOnSSTableDeletion(boolean invalidate) + { + DatabaseDescriptor.setInvalidateKeycacheOnSSTableDeletion(invalidate); + } + public int getTombstoneWarnThreshold() { return DatabaseDescriptor.getTombstoneWarnThreshold(); diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java index 8152096831..bd0f80aba6 100644 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@ -833,6 +833,8 @@ public interface StorageServiceMBean extends NotificationEmitter public boolean getMigrateKeycacheOnCompaction(); public void setMigrateKeycacheOnCompaction(boolean invalidateKeyCacheOnCompaction); + public boolean getInvalidateKeycacheOnSSTableDeletion(); + public void setInvalidateKeycacheOnSSTableDeletion(boolean invalidate); public int getConcurrentViewBuilders(); public void setConcurrentViewBuilders(int value); diff --git a/test/unit/org/apache/cassandra/io/sstable/keycache/KeyCacheTest.java b/test/unit/org/apache/cassandra/io/sstable/keycache/KeyCacheTest.java index 15c37ea60a..abe83b59d5 100644 --- a/test/unit/org/apache/cassandra/io/sstable/keycache/KeyCacheTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/keycache/KeyCacheTest.java @@ -350,14 +350,14 @@ public class KeyCacheTest LifecycleTransaction.waitForDeletions(); - // after releasing the reference this should drop to 2 - assertKeyCacheSize(2, KEYSPACE1, cf); + // after releasing the reference this should drop to 2, unless we don't invalidate keycache on sstable deletion + assertKeyCacheSize(DatabaseDescriptor.shouldInvalidateKeycacheOnSSTableDeletion() ? 2 : 4, KEYSPACE1, cf); // re-read same keys to verify that key cache didn't grow further Util.getAll(Util.cmd(cfs, "key1").build()); Util.getAll(Util.cmd(cfs, "key2").build()); - assertKeyCacheSize( 2, KEYSPACE1, cf); + assertKeyCacheSize( DatabaseDescriptor.shouldInvalidateKeycacheOnSSTableDeletion() ? 2 : 4, KEYSPACE1, cf); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org