You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2016/02/02 14:21:05 UTC

[3/6] cassandra git commit: Minimize buffers when using them in sstable metadata

Minimize buffers when using them in sstable metadata

patch by slebresne; reviewed by benedict for CASSANDRA-11026


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/c83d108a
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/c83d108a
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/c83d108a

Branch: refs/heads/trunk
Commit: c83d108a30f3c6b670b32d94359df251bf931234
Parents: 839a5ba
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed Jan 27 17:30:14 2016 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Tue Feb 2 14:18:48 2016 +0100

----------------------------------------------------------------------
 CHANGES.txt                                             |  1 +
 .../io/sstable/metadata/MetadataCollector.java          | 12 ++++++++++--
 2 files changed, 11 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/c83d108a/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index bed8703..da6f5cc 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.0.3
+ * Avoid memory leak when collecting sstable metadata (CASSANDRA-11026)
  * Mutations do not block for completion under view lock contention (CASSANDRA-10779)
  * Invalidate legacy schema tables when unloading them (CASSANDRA-11071)
  * (cqlsh) handle INSERT and UPDATE statements with LWT conditions correctly

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c83d108a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java
index 1c93f58..3947dc8 100644
--- a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java
+++ b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java
@@ -39,6 +39,7 @@ import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.SSTable;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.EstimatedHistogram;
 import org.apache.cassandra.utils.MurmurHash;
 import org.apache.cassandra.utils.StreamingHistogram;
@@ -232,12 +233,19 @@ public class MetadataCollector implements PartitionStatisticsCollector
         {
             AbstractType<?> type = comparator.subtype(i);
             ByteBuffer newValue = clustering.get(i);
-            minClusteringValues[i] = min(minClusteringValues[i], newValue, type);
-            maxClusteringValues[i] = max(maxClusteringValues[i], newValue, type);
+            minClusteringValues[i] = maybeMinimize(min(minClusteringValues[i], newValue, type));
+            maxClusteringValues[i] = maybeMinimize(max(maxClusteringValues[i], newValue, type));
         }
         return this;
     }
 
+    private static ByteBuffer maybeMinimize(ByteBuffer buffer)
+    {
+        // ByteBuffer.minimalBufferFor doesn't handle null, but we can get it in this case since it's possible
+        // for some clustering values to be null
+        return buffer == null ? null : ByteBufferUtil.minimalBufferFor(buffer);
+    }
+
     private static ByteBuffer min(ByteBuffer b1, ByteBuffer b2, AbstractType<?> comparator)
     {
         if (b1 == null)