You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2012/04/04 19:06:50 UTC
[7/10] git commit: avoid seg faults during compaction patch by Vijay;
reviewed by jbellis for CASSANDRA-4111
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/030d4718
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/030d4718
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/030d4718
Branch: refs/heads/trunk
Commit: 030d4718e5596884c766b6e3e5b1c54fe23f6dd8
Parents: 031e894
Author: Vijay Parthasarathy <vi...@gmail.com>
Authored: Tue Apr 3 12:26:01 2012 -0700
Committer: Vijay Parthasarathy <vi...@gmail.com>
Committed: Tue Apr 3 12:33:03 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/030d4718/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 4946fb0..275130c 100644
--- a/src/java/org/apache/cassandra/cache/SerializingCache.java
+++ b/src/java/org/apache/cassandra/cache/SerializingCache.java
@@ -205,11 +205,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;