diff --git a/CHANGES.txt b/CHANGES.txt index bb3a98a3c9..3bc50acbb7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -17,6 +17,7 @@ 2.0.4 + * Reduce gossip memory use by interning VersionedValue strings (CASSANDRA-6410) * Allow specifying datacenters to participate in a repair (CASSANDRA-6218) * Fix divide-by-zero in PCI (CASSANDRA-6403) * Fix setting last compacted key in the wrong level for LCS (CASSANDRA-6284) diff --git a/conf/cassandra-env.sh b/conf/cassandra-env.sh index e229297b41..95acc4e270 100644 --- a/conf/cassandra-env.sh +++ b/conf/cassandra-env.sh @@ -195,6 +195,9 @@ startswith() { [ "${1#$2}" != "$1" ]; } # Per-thread stack size. JVM_OPTS="$JVM_OPTS -Xss256k" +# Larger interned string table, for gossip's benefit (CASSANDRA-6410) +JVM_OPTS="$JVM_OPTS -XX:StringTableSize=1000003" + # GC tuning options JVM_OPTS="$JVM_OPTS -XX:+UseParNewGC" JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC" diff --git a/src/java/org/apache/cassandra/gms/VersionedValue.java b/src/java/org/apache/cassandra/gms/VersionedValue.java index ec0f39fe98..a7ee047b4b 100644 --- a/src/java/org/apache/cassandra/gms/VersionedValue.java +++ b/src/java/org/apache/cassandra/gms/VersionedValue.java @@ -80,7 +80,11 @@ public class VersionedValue implements Comparable private VersionedValue(String value, int version) { assert value != null; - this.value = value; + // blindly interning everything is somewhat suboptimal -- lots of VersionedValues are unique -- + // but harmless, and interning the non-unique ones saves significant memory. (Unfortunately, + // we don't really have enough information here in VersionedValue to tell the probably-unique + // values apart.) See CASSANDRA-6410. + this.value = value.intern(); this.version = version; }