Description
CompactionManager's estimatedCompactions map seems to hold all or most ColumnFamilyStores in the system as keys. Keys are never removed from estimatedCompactions.
I have a project that embeds Cassandra as a storage backend. Some of my integration tests create and drop a single keyspace and pair of column families a hundred or 150 times in one JVM. These tests always OOM'd. Loading some near-death heapdumps in mat suggested CompactionManager's estimatedCompactions held over 80% of total heap via its ColumnFamilyStore keys. estimatedCompactions had the only inbound reference to these CFSs, and the CFSs themselves had invalid = true.
As a workaround, I changed estimatedCompactions to a WeakReference-keyed map (using Guava MapMaker). My integration tests no longer OOM.
I'm generally unfamiliar with Cassandra's guts. I don't know whether weak referencing the keys of estimatedCompactions is correct (or ideal). But, that did seem to confirm my guess that retained references to dead CFSs in estimatedCompactions were swamping my heap after lots of Keyspace+ColumnFamily drops.