Author: jbellis
Date: Tue Aug 2 16:54:38 2011
New Revision: 1153190
URL: http://svn.apache.org/viewvc?rev=1153190&view=rev
Log:
merge #2951 from trunk (r1151625, r1152416)
Modified:
cassandra/branches/cassandra-0.8/ (props changed)
cassandra/branches/cassandra-0.8/CHANGES.txt
cassandra/branches/cassandra-0.8/contrib/ (props changed)
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
(props changed)
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
(props changed)
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
(props changed)
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
(props changed)
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
(props changed)
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cache/FreeableMemory.java
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cache/SerializingCache.java
cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
Propchange: cassandra/branches/cassandra-0.8/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Aug 2 16:54:38 2011
@@ -5,7 +5,7 @@
/cassandra/branches/cassandra-0.8.0:1125021-1130369
/cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689
/cassandra/tags/cassandra-0.8.0-rc1:1102511-1125020
-/cassandra/trunk:1129049-1129050,1129065
+/cassandra/trunk:1129049-1129050,1129065,1151625,1152416,1153189
/incubator/cassandra/branches/cassandra-0.3:774578-796573
/incubator/cassandra/branches/cassandra-0.4:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5:888872-915439
Modified: cassandra/branches/cassandra-0.8/CHANGES.txt
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/CHANGES.txt?rev=1153190&r1=1153189&r2=1153190&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.8/CHANGES.txt Tue Aug 2 16:54:38 2011
@@ -26,6 +26,8 @@
(CASSANDRA-2960)
* fix assertion error during compaction of counter CFs (CASSANDRA-2968)
* avoid trying to create index names, when no index exists (CASSANDRA-2867)
+ * fix potential use of free'd native memory in SerializingCache
+ (CASSANDRA-2951)
0.8.2
Propchange: cassandra/branches/cassandra-0.8/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Aug 2 16:54:38 2011
@@ -5,7 +5,7 @@
/cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369
/cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689
/cassandra/tags/cassandra-0.8.0-rc1/contrib:1102511-1125020
-/cassandra/trunk/contrib:1129049-1129050,1129065
+/cassandra/trunk/contrib:1129049-1129050,1129065,1151625,1152416,1153189
/incubator/cassandra/branches/cassandra-0.3/contrib:774578-796573
/incubator/cassandra/branches/cassandra-0.4/contrib:810145-810987,810994-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/contrib:888872-915439
Propchange:
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Aug 2 16:54:38 2011
@@ -5,7 +5,7 @@
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689
/cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1102511-1125020
-/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1129049-1129050,1129065
+/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1129049-1129050,1129065,1151625,1152416,1153189
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/Cassandra.java:774578-796573
/incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/Cassandra.java:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/Cassandra.java:888872-903502
Propchange:
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Aug 2 16:54:38 2011
@@ -5,7 +5,7 @@
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689
/cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1102511-1125020
-/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1129049-1129050,1129065
+/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1129049-1129050,1129065,1151625,1152416,1153189
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/column_t.java:774578-792198
/incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/Column.java:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/Column.java:888872-903502
Propchange:
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Aug 2 16:54:38 2011
@@ -5,7 +5,7 @@
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689
/cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1102511-1125020
-/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1129049-1129050,1129065
+/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1129049-1129050,1129065,1151625,1152416,1153189
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:774578-796573
/incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:888872-903502
Propchange:
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Aug 2 16:54:38 2011
@@ -5,7 +5,7 @@
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689
/cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1102511-1125020
-/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1129049-1129050,1129065
+/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1129049-1129050,1129065,1151625,1152416,1153189
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:774578-796573
/incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:888872-903502
Propchange:
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Aug 2 16:54:38 2011
@@ -5,7 +5,7 @@
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689
/cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1102511-1125020
-/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1129049-1129050,1129065
+/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1129049-1129050,1129065,1151625,1152416,1153189
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/superColumn_t.java:774578-792198
/incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/SuperColumn.java:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/SuperColumn.java:888872-903502
Modified:
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cache/FreeableMemory.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cache/FreeableMemory.java?rev=1153190&r1=1153189&r2=1153190&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cache/FreeableMemory.java
(original)
+++
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cache/FreeableMemory.java
Tue Aug 2 16:54:38 2011
@@ -22,19 +22,43 @@ package org.apache.cassandra.cache;
import java.io.IOException;
+import java.util.concurrent.atomic.AtomicInteger;
import com.sun.jna.Memory;
public class FreeableMemory extends Memory
{
- protected volatile boolean valid = true;
-
+ AtomicInteger references = new AtomicInteger(1);
+
public FreeableMemory(long size)
{
super(size);
}
- public void free()
+ /**
+ * @return true if we succeed in referencing before the reference count
reaches zero.
+ * (A FreeableMemory object is created with a reference count of one.)
+ */
+ public boolean reference()
+ {
+ while (true)
+ {
+ int n = references.get();
+ if (n <= 0)
+ return false;
+ if (references.compareAndSet(n, n + 1))
+ return true;
+ }
+ }
+
+ /** decrement reference count. if count reaches zero, the object is
freed. */
+ public void unreference()
+ {
+ if (references.decrementAndGet() == 0)
+ free();
+ }
+
+ private void free()
{
assert peer != 0;
super.finalize(); // calls free and sets peer to zero
@@ -46,8 +70,8 @@ public class FreeableMemory extends Memo
@Override
protected void finalize()
{
- if (peer != 0)
- super.finalize();
+ assert references.get() == 0;
+ assert peer == 0;
}
public byte getValidByte(long offset)
Modified:
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cache/SerializingCache.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cache/SerializingCache.java?rev=1153190&r1=1153189&r2=1153190&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cache/SerializingCache.java
(original)
+++
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cache/SerializingCache.java
Tue Aug 2 16:54:38 2011
@@ -55,7 +55,7 @@ public class SerializingCache<K, V> impl
{
public void onEviction(K k, FreeableMemory mem)
{
- mem.free();
+ mem.unreference();
}
};
this.map = new ConcurrentLinkedHashMap.Builder<K, FreeableMemory>()
@@ -137,7 +137,16 @@ public class SerializingCache<K, V> impl
FreeableMemory mem = map.get(key);
if (mem == null)
return null;
- return deserialize(mem);
+ if (!mem.reference())
+ return null;
+ try
+ {
+ return deserialize(mem);
+ }
+ finally
+ {
+ mem.unreference();
+ }
}
public void put(K key, V value)
@@ -148,14 +157,14 @@ public class SerializingCache<K, V> impl
FreeableMemory old = map.put(key, mem);
if (old != null)
- old.free();
+ old.unreference();
}
public void remove(K key)
{
FreeableMemory mem = map.remove(key);
if (mem != null)
- mem.free();
+ mem.unreference();
}
public Set<K> keySet()
Modified:
cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/cache/CacheProviderTest.java?rev=1153190&r1=1153189&r2=1153190&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
(original)
+++
cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
Tue Aug 2 16:54:38 2011
@@ -48,6 +48,8 @@ public class CacheProviderTest extends S
private void simpleCase(ColumnFamily cf, ICache<String, ColumnFamily>
cache)
{
cache.put(key1, cf);
+ assert cache.get(key1) != null;
+
assertDigests(cache.get(key1), cf);
cache.put(key2, cf);
cache.put(key3, cf);