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);


Reply via email to