Updated Branches: refs/heads/trunk f4595a791 -> 7e3bb8644
avoid seg faults during compaction patch by Vijay; reviewed by jbellis for CASSANDRA-4111 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/7e3bb864 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/7e3bb864 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/7e3bb864 Branch: refs/heads/trunk Commit: 7e3bb8644d0b6e9bd3528fb589550f7d3971ab63 Parents: f4595a7 Author: Vijay Parthasarathy <[email protected]> Authored: Tue Apr 3 12:26:01 2012 -0700 Committer: Vijay Parthasarathy <[email protected]> Committed: Tue Apr 3 12:33:53 2012 -0700 ---------------------------------------------------------------------- .../apache/cassandra/cache/SerializingCache.java | 16 +++++++++++++- 1 files changed, 14 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/7e3bb864/src/java/org/apache/cassandra/cache/SerializingCache.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cache/SerializingCache.java b/src/java/org/apache/cassandra/cache/SerializingCache.java index 8687e52..cd74611 100644 --- a/src/java/org/apache/cassandra/cache/SerializingCache.java +++ b/src/java/org/apache/cassandra/cache/SerializingCache.java @@ -201,11 +201,23 @@ public class SerializingCache<K, V> implements ICache<K, V> FreeableMemory mem = serialize(value); if (mem == null) return false; // out of memory. never mind. - V oldValue = deserialize(old); + + V oldValue; + // reference old guy before de-serializing + if (!old.reference()) + return false; // we have already freed hence noop. + try + { + oldValue = deserialize(old); + } + finally + { + old.unreference(); + } boolean success = oldValue.equals(oldToReplace) && map.replace(key, old, mem); if (success) - old.unreference(); + old.unreference(); // so it will be eventually be cleaned else mem.unreference(); return success;
