Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.1 b10629291 -> 9aaea2485


Expose off-heap memory usage stats

patch by Benjamin Lerer; reviewed by Aleksey Yeschenko for
CASSANDRA-7897


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

Branch: refs/heads/cassandra-2.1
Commit: 7a14a77f2cbe2ce10ac35d5853ddf9496a86e16e
Parents: 8b5cf64
Author: blerer <b_le...@hotmail.com>
Authored: Fri Nov 28 02:55:46 2014 +0300
Committer: Aleksey Yeschenko <alek...@apache.org>
Committed: Fri Nov 28 02:55:46 2014 +0300

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/ColumnFamilyStore.java  | 15 +++++
 .../cassandra/db/ColumnFamilyStoreMBean.java    | 18 +++++
 .../io/compress/CompressionMetadata.java        |  9 +++
 .../cassandra/io/sstable/IndexSummary.java      |  9 +++
 .../cassandra/io/sstable/SSTableReader.java     | 30 +++++++++
 .../cassandra/metrics/ColumnFamilyMetrics.java  | 36 ++++++++++
 .../cassandra/metrics/KeyspaceMetrics.java      | 27 ++++++++
 .../org/apache/cassandra/tools/NodeCmd.java     | 70 +++++++++++++++-----
 .../cassandra/utils/AlwaysPresentFilter.java    |  6 ++
 .../org/apache/cassandra/utils/IFilter.java     |  6 ++
 .../cassandra/utils/Murmur3BloomFilter.java     |  6 ++
 .../org/apache/cassandra/utils/obs/IBitSet.java |  6 ++
 .../cassandra/utils/obs/OffHeapBitSet.java      |  6 ++
 .../apache/cassandra/utils/obs/OpenBitSet.java  |  6 ++
 15 files changed, 234 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 937edbb..8f4add9 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.0.12:
+ * Expose off-heap memory usage stats (CASSANDRA-7897)
  * Ignore Paxos commits for truncated tables (CASSANDRA-7538)
  * Validate size of indexed column values (CASSANDRA-8280)
  * Make LCS split compaction results over all data directories (CASSANDRA-8329)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java 
b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 6365b4f..06520ab 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -2164,6 +2164,21 @@ public class ColumnFamilyStore implements 
ColumnFamilyStoreMBean
         return metric.bloomFilterDiskSpaceUsed.value();
     }
 
+    public long getBloomFilterOffHeapMemoryUsed()
+    {
+        return metric.bloomFilterOffHeapMemoryUsed.value();
+    }
+
+    public long getIndexSummaryOffHeapMemoryUsed()
+    {
+        return metric.indexSummaryOffHeapMemoryUsed.value();
+    }
+
+    public long getCompressionMetadataOffHeapMemoryUsed()
+    {
+        return metric.compressionMetadataOffHeapMemoryUsed.value();
+    }
+
     @Override
     public String toString()
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java 
b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
index 90c9f1f..53f7ba9 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
@@ -230,6 +230,24 @@ public interface ColumnFamilyStoreMBean
     public long getBloomFilterDiskSpaceUsed();
 
     /**
+     * @see 
org.apache.cassandra.metrics.ColumnFamilyMetrics#bloomFilterOffHeapMemoryUsed
+     */
+    @Deprecated
+    public long getBloomFilterOffHeapMemoryUsed();
+
+    /**
+     * @see 
org.apache.cassandra.metrics.ColumnFamilyMetrics#indexSummaryOffHeapMemoryUsed
+     */
+    @Deprecated
+    public long getIndexSummaryOffHeapMemoryUsed();
+
+    /**
+     * @see 
org.apache.cassandra.metrics.ColumnFamilyMetrics#compressionMetadataOffHeapMemoryUsed
+     */
+    @Deprecated
+    public long getCompressionMetadataOffHeapMemoryUsed();
+
+    /**
      * Gets the minimum number of sstables in queue before compaction kicks off
      */
     public int getMinimumCompactionThreshold();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java 
b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java
index e75a7d7..231778a 100644
--- a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java
+++ b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java
@@ -126,6 +126,15 @@ public class CompressionMetadata
     }
 
     /**
+     * Returns the amount of memory in bytes used off heap.
+     * @return the amount of memory in bytes used off heap
+     */
+    public long offHeapSize()
+    {
+        return chunkOffsets.size();
+    }
+
+    /**
      * Read offsets of the individual chunks from the given input.
      *
      * @param input Source of the data.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/io/sstable/IndexSummary.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/IndexSummary.java 
b/src/java/org/apache/cassandra/io/sstable/IndexSummary.java
index be7977e..b66071b 100644
--- a/src/java/org/apache/cassandra/io/sstable/IndexSummary.java
+++ b/src/java/org/apache/cassandra/io/sstable/IndexSummary.java
@@ -108,6 +108,15 @@ public class IndexSummary implements Closeable
         return summary_size;
     }
 
+    /**
+     * Returns the amount of memory in bytes used off heap.
+     * @return the amount of memory in bytes used off heap
+     */
+    public long offHeapSize()
+    {
+        return bytes.size();
+    }
+
     public static class IndexSummarySerializer
     {
         public void serialize(IndexSummary t, DataOutputStream out) throws 
IOException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java 
b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
index 87f084c..f0e9e65 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
@@ -634,6 +634,18 @@ public class SSTableReader extends SSTable implements 
Closeable
     }
 
     /**
+     * Returns the amount of memory in bytes used off heap by the compression 
meta-data.
+     * @return the amount of memory in bytes used off heap by the compression 
meta-data
+     */
+    public long getCompressionMetadataOffHeapSize()
+    {
+        if (!compression)
+            return 0;
+
+        return getCompressionMetadata().offHeapSize();
+    }
+
+    /**
      * For testing purposes only.
      */
     public void forceFilterFailures()
@@ -652,6 +664,24 @@ public class SSTableReader extends SSTable implements 
Closeable
     }
 
     /**
+     * Returns the amount of memory in bytes used off heap by the bloom filter.
+     * @return the amount of memory in bytes used off heap by the bloom filter
+     */
+    public long getBloomFilterOffHeapSize()
+    {
+        return bf.offHeapSize();
+    }
+
+    /**
+     * Returns the amount of memory in bytes used off heap by the index 
summary.
+     * @return the amount of memory in bytes used off heap by the index summary
+     */
+    public long getIndexSummaryOffHeapSize()
+    {
+        return indexSummary.offHeapSize();
+    }
+
+    /**
      * @return An estimate of the number of keys in this SSTable.
      */
     public long estimatedKeys()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java 
b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
index c2b7d61..4dbc0f8 100644
--- a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
@@ -87,6 +87,12 @@ public class ColumnFamilyMetrics
     public final Gauge<Double> recentBloomFilterFalseRatio;
     /** Disk space used by bloom filter */
     public final Gauge<Long> bloomFilterDiskSpaceUsed;
+    /** Off heap memory used by bloom filter */
+    public final Gauge<Long> bloomFilterOffHeapMemoryUsed;
+    /** Off heap memory used by index summary */
+    public final Gauge<Long> indexSummaryOffHeapMemoryUsed;
+    /** Off heap memory used by compression meta data*/
+    public final Gauge<Long> compressionMetadataOffHeapMemoryUsed;
     /** Key cache hit rate  for this CF */
     public final Gauge<Double> keyCacheHitRate;
     /** Tombstones scanned in queries on this CF */
@@ -429,6 +435,36 @@ public class ColumnFamilyMetrics
                 return total;
             }
         });
+        bloomFilterOffHeapMemoryUsed = 
createColumnFamilyGauge("BloomFilterOffHeapMemoryUsed", new Gauge<Long>()
+        {
+            public Long value()
+            {
+                long total = 0;
+                for (SSTableReader sst : cfs.getSSTables())
+                    total += sst.getBloomFilterOffHeapSize();
+                return total;
+            }
+        });
+        indexSummaryOffHeapMemoryUsed = 
createColumnFamilyGauge("IndexSummaryOffHeapMemoryUsed", new Gauge<Long>()
+        {
+            public Long value()
+            {
+                long total = 0;
+                for (SSTableReader sst : cfs.getSSTables())
+                    total += sst.getIndexSummaryOffHeapSize();
+                return total;
+            }
+        });
+        compressionMetadataOffHeapMemoryUsed = 
createColumnFamilyGauge("CompressionMetadataOffHeapMemoryUsed", new 
Gauge<Long>()
+        {
+            public Long value()
+            {
+                long total = 0;
+                for (SSTableReader sst : cfs.getSSTables())
+                    total += sst.getCompressionMetadataOffHeapSize();
+                return total;
+            }
+        });
         speculativeRetries = createColumnFamilyCounter("SpeculativeRetries");
         keyCacheHitRate = 
Metrics.newGauge(factory.createMetricName("KeyCacheHitRate"), new RatioGauge()
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java 
b/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java
index 0ea982e..fd89983 100644
--- a/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java
@@ -50,6 +50,12 @@ public class KeyspaceMetrics
     public final Gauge<Long> totalDiskSpaceUsed;
     /** Disk space used by bloom filter */
     public final Gauge<Long> bloomFilterDiskSpaceUsed;
+    /** Off heap memory used by bloom filter */
+    public final Gauge<Long> bloomFilterOffHeapMemoryUsed;
+    /** Off heap memory used by index summary */
+    public final Gauge<Long> indexSummaryOffHeapMemoryUsed;
+    /** Off heap memory used by compression meta data*/
+    public final Gauge<Long> compressionMetadataOffHeapMemoryUsed;
     /** (Local) read metrics */
     public final LatencyMetrics readLatency;
     /** (Local) range slice metrics */
@@ -149,6 +155,27 @@ public class KeyspaceMetrics
                 return metric.bloomFilterDiskSpaceUsed.value();
             }
         });
+        bloomFilterOffHeapMemoryUsed = 
createKeyspaceGauge("BloomFilterOffHeapMemoryUsed", new MetricValue()
+        {
+            public Long getValue(ColumnFamilyMetrics metric)
+            {
+                return metric.bloomFilterOffHeapMemoryUsed.value();
+            }
+        });
+        indexSummaryOffHeapMemoryUsed = 
createKeyspaceGauge("IndexSummaryOffHeapMemoryUsed", new MetricValue()
+        {
+            public Long getValue(ColumnFamilyMetrics metric)
+            {
+                return metric.indexSummaryOffHeapMemoryUsed.value();
+            }
+        });
+        compressionMetadataOffHeapMemoryUsed = 
createKeyspaceGauge("CompressionMetadataOffHeapMemoryUsed", new MetricValue()
+        {
+            public Long getValue(ColumnFamilyMetrics metric)
+            {
+                return metric.compressionMetadataOffHeapMemoryUsed.value();
+            }
+        });
         // latency metrics for ColumnFamilyMetrics to update
         readLatency = new LatencyMetrics(factory, "Read");
         writeLatency = new LatencyMetrics(factory, "Write");

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/tools/NodeCmd.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeCmd.java 
b/src/java/org/apache/cassandra/tools/NodeCmd.java
index 2d7809a..e4a14b2 100644
--- a/src/java/org/apache/cassandra/tools/NodeCmd.java
+++ b/src/java/org/apache/cassandra/tools/NodeCmd.java
@@ -635,41 +635,44 @@ public class NodeCmd
         // If there is just 1 token, print it now like we always have, 
otherwise,
         // require that -T/--tokens be passed (that output is potentially 
verbose).
         if (toks.size() == 1)
-            outs.printf("%-17s: %s%n", "Token", toks.get(0));
+            outs.printf("%-23s: %s%n", "Token", toks.get(0));
         else if (!cmd.hasOption(TOKENS_OPT.left))
-            outs.printf("%-17s: (invoke with -T/--tokens to see all %d 
tokens)%n", "Token", toks.size());
+            outs.printf("%-23s: (invoke with -T/--tokens to see all %d 
tokens)%n", "Token", toks.size());
 
-        outs.printf("%-17s: %s%n", "ID", probe.getLocalHostId());
-        outs.printf("%-17s: %s%n", "Gossip active", gossipInitialized);
-        outs.printf("%-17s: %s%n", "Thrift active", 
probe.isThriftServerRunning());
-        outs.printf("%-17s: %s%n", "Native Transport active", 
probe.isNativeTransportRunning());
-        outs.printf("%-17s: %s%n", "Load", probe.getLoadString());
+        outs.printf("%-23s: %s%n", "ID", probe.getLocalHostId());
+        outs.printf("%-23s: %s%n", "Gossip active", gossipInitialized);
+        outs.printf("%-23s: %s%n", "Thrift active", 
probe.isThriftServerRunning());
+        outs.printf("%-23s: %s%n", "Native Transport active", 
probe.isNativeTransportRunning());
+        outs.printf("%-23s: %s%n", "Load", probe.getLoadString());
         if (gossipInitialized)
-            outs.printf("%-17s: %s%n", "Generation No", 
probe.getCurrentGenerationNumber());
+            outs.printf("%-23s: %s%n", "Generation No", 
probe.getCurrentGenerationNumber());
         else
-            outs.printf("%-17s: %s%n", "Generation No", 0);
+            outs.printf("%-23s: %s%n", "Generation No", 0);
 
         // Uptime
         long secondsUp = probe.getUptime() / 1000;
-        outs.printf("%-17s: %d%n", "Uptime (seconds)", secondsUp);
+        outs.printf("%-23s: %d%n", "Uptime (seconds)", secondsUp);
 
         // Memory usage
         MemoryUsage heapUsage = probe.getHeapMemoryUsage();
         double memUsed = (double)heapUsage.getUsed() / (1024 * 1024);
         double memMax = (double)heapUsage.getMax() / (1024 * 1024);
-        outs.printf("%-17s: %.2f / %.2f%n", "Heap Memory (MB)", memUsed, 
memMax);
+        outs.printf("%-23s: %.2f / %.2f%n", "Heap Memory (MB)", memUsed, 
memMax);
+
+        // Off heap memory usage
+        outs.printf("%-23s: %.2f%n", "Off Heap Memory (MB)", 
getOffHeapMemoryUsed());
 
         // Data Center/Rack
-        outs.printf("%-17s: %s%n", "Data Center", probe.getDataCenter());
-        outs.printf("%-17s: %s%n", "Rack", probe.getRack());
+        outs.printf("%-23s: %s%n", "Data Center", probe.getDataCenter());
+        outs.printf("%-23s: %s%n", "Rack", probe.getRack());
 
         // Exceptions
-        outs.printf("%-17s: %s%n", "Exceptions", probe.getExceptionCount());
+        outs.printf("%-23s: %s%n", "Exceptions", probe.getExceptionCount());
 
         CacheServiceMBean cacheService = probe.getCacheServiceMBean();
 
         // Key Cache: Hits, Requests, RecentHitRate, SavePeriodInSeconds
-        outs.printf("%-17s: size %d (bytes), capacity %d (bytes), %d hits, %d 
requests, %.3f recent hit rate, %d save period in seconds%n",
+        outs.printf("%-23s: size %d (bytes), capacity %d (bytes), %d hits, %d 
requests, %.3f recent hit rate, %d save period in seconds%n",
                     "Key Cache",
                     cacheService.getKeyCacheSize(),
                     cacheService.getKeyCacheCapacityInBytes(),
@@ -679,7 +682,7 @@ public class NodeCmd
                     cacheService.getKeyCacheSavePeriodInSeconds());
 
         // Row Cache: Hits, Requests, RecentHitRate, SavePeriodInSeconds
-        outs.printf("%-17s: size %d (bytes), capacity %d (bytes), %d hits, %d 
requests, %.3f recent hit rate, %d save period in seconds%n",
+        outs.printf("%-23s: size %d (bytes), capacity %d (bytes), %d hits, %d 
requests, %.3f recent hit rate, %d save period in seconds%n",
                     "Row Cache",
                     cacheService.getRowCacheSize(),
                     cacheService.getRowCacheCapacityInBytes(),
@@ -691,8 +694,30 @@ public class NodeCmd
         if (toks.size() > 1 && cmd.hasOption(TOKENS_OPT.left))
         {
             for (String tok : toks)
-                outs.printf("%-17s: %s%n", "Token", tok);
+                outs.printf("%-23s: %s%n", "Token", tok);
+        }
+    }
+
+    /**
+     * Returns the total off heap memory used in MB.
+     * @return the total off heap memory used in MB.
+     */
+    private double getOffHeapMemoryUsed()
+    {
+        long offHeapMemUsedInBytes = 0;
+        // get a list of column family stores
+        Iterator<Map.Entry<String, ColumnFamilyStoreMBean>> cfamilies = 
probe.getColumnFamilyStoreMBeanProxies();
+
+        while (cfamilies.hasNext())
+        {
+            Entry<String, ColumnFamilyStoreMBean> entry = cfamilies.next();
+            ColumnFamilyStoreMBean cfsProxy = entry.getValue();
+            offHeapMemUsedInBytes += 
cfsProxy.getBloomFilterOffHeapMemoryUsed();
+            offHeapMemUsedInBytes += 
cfsProxy.getIndexSummaryOffHeapMemoryUsed();
+            offHeapMemUsedInBytes += 
cfsProxy.getCompressionMetadataOffHeapMemoryUsed();
         }
+
+        return offHeapMemUsedInBytes / (1024d * 1024);
     }
 
     public void printReleaseVersion(PrintStream outs)
@@ -948,8 +973,16 @@ public class NodeCmd
                             outs.println("]");
                     }
                 }
+
+                long bloomFilterOffHeapSize = 
cfstore.getBloomFilterOffHeapMemoryUsed();
+                long indexSummaryOffHeapSize = 
cfstore.getIndexSummaryOffHeapMemoryUsed();
+                long compressionMetadataOffHeapSize = 
cfstore.getCompressionMetadataOffHeapMemoryUsed();
+
+                long offHeapSize = bloomFilterOffHeapSize + 
indexSummaryOffHeapSize + compressionMetadataOffHeapSize;
+
                 outs.println("\t\tSpace used (live), bytes: " + 
cfstore.getLiveDiskSpaceUsed());
                 outs.println("\t\tSpace used (total), bytes: " + 
cfstore.getTotalDiskSpaceUsed());
+                outs.println("\t\tOff heap memory used (total), bytes: " + 
offHeapSize);
                 outs.println("\t\tSSTable Compression Ratio: " + 
cfstore.getCompressionRatio());
                 outs.println("\t\tNumber of keys (estimate): " + 
cfstore.estimateKeys());
                 outs.println("\t\tMemtable cell count: " + 
cfstore.getMemtableColumnsCount());
@@ -963,6 +996,9 @@ public class NodeCmd
                 outs.println("\t\tBloom filter false positives: " + 
cfstore.getBloomFilterFalsePositives());
                 outs.println("\t\tBloom filter false ratio: " + 
String.format("%01.5f", cfstore.getRecentBloomFilterFalseRatio()));
                 outs.println("\t\tBloom filter space used, bytes: " + 
cfstore.getBloomFilterDiskSpaceUsed());
+                outs.println("\t\tBloom filter off heap memory used, bytes: " 
+ bloomFilterOffHeapSize);
+                outs.println("\t\tIndex summary off heap memory used, bytes: " 
+ indexSummaryOffHeapSize);
+                outs.println("\t\tCompression metadata off heap memory used, 
bytes: " + compressionMetadataOffHeapSize);
                 outs.println("\t\tCompacted partition minimum bytes: " + 
cfstore.getMinRowSize());
                 outs.println("\t\tCompacted partition maximum bytes: " + 
cfstore.getMaxRowSize());
                 outs.println("\t\tCompacted partition mean bytes: " + 
cfstore.getMeanRowSize());

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/utils/AlwaysPresentFilter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/AlwaysPresentFilter.java 
b/src/java/org/apache/cassandra/utils/AlwaysPresentFilter.java
index 0f5136b..0886edc 100644
--- a/src/java/org/apache/cassandra/utils/AlwaysPresentFilter.java
+++ b/src/java/org/apache/cassandra/utils/AlwaysPresentFilter.java
@@ -34,4 +34,10 @@ public class AlwaysPresentFilter implements IFilter
     public void close() throws IOException { }
 
     public long serializedSize() { return 0; }
+
+    @Override
+    public long offHeapSize()
+    {
+        return 0;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/utils/IFilter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/IFilter.java 
b/src/java/org/apache/cassandra/utils/IFilter.java
index 10f6df2..aed5f39 100644
--- a/src/java/org/apache/cassandra/utils/IFilter.java
+++ b/src/java/org/apache/cassandra/utils/IFilter.java
@@ -29,4 +29,10 @@ public interface IFilter extends Closeable
     void clear();
 
     long serializedSize();
+
+    /**
+     * Returns the amount of memory in bytes used off heap.
+     * @return the amount of memory in bytes used off heap
+     */
+    long offHeapSize();
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/utils/Murmur3BloomFilter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/Murmur3BloomFilter.java 
b/src/java/org/apache/cassandra/utils/Murmur3BloomFilter.java
index 3c2a47e..f7c7632 100644
--- a/src/java/org/apache/cassandra/utils/Murmur3BloomFilter.java
+++ b/src/java/org/apache/cassandra/utils/Murmur3BloomFilter.java
@@ -36,6 +36,12 @@ public class Murmur3BloomFilter extends BloomFilter
         return serializer.serializedSize(this, TypeSizes.NATIVE);
     }
 
+    @Override
+    public long offHeapSize()
+    {
+        return bitset.offHeapSize();
+    }
+
     protected void hash(ByteBuffer b, int position, int remaining, long seed, 
long[] result)
     {
         MurmurHash.hash3_x64_128(b, b.position(), b.remaining(), seed, result);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/utils/obs/IBitSet.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/obs/IBitSet.java 
b/src/java/org/apache/cassandra/utils/obs/IBitSet.java
index c6fbddd..47ba492 100644
--- a/src/java/org/apache/cassandra/utils/obs/IBitSet.java
+++ b/src/java/org/apache/cassandra/utils/obs/IBitSet.java
@@ -49,4 +49,10 @@ public interface IBitSet extends Closeable
     public long serializedSize(TypeSizes type);
 
     public void clear();
+
+    /**
+     * Returns the amount of memory in bytes used off heap.
+     * @return the amount of memory in bytes used off heap
+     */
+    public long offHeapSize();
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/utils/obs/OffHeapBitSet.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/obs/OffHeapBitSet.java 
b/src/java/org/apache/cassandra/utils/obs/OffHeapBitSet.java
index 29dd848..5063d80 100644
--- a/src/java/org/apache/cassandra/utils/obs/OffHeapBitSet.java
+++ b/src/java/org/apache/cassandra/utils/obs/OffHeapBitSet.java
@@ -62,6 +62,12 @@ public class OffHeapBitSet implements IBitSet
         return bytes.size() * 8;
     }
 
+    @Override
+    public long offHeapSize()
+    {
+        return bytes.size();
+    }
+
     public boolean get(long index)
     {
         long i = index >> 3;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a14a77f/src/java/org/apache/cassandra/utils/obs/OpenBitSet.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/obs/OpenBitSet.java 
b/src/java/org/apache/cassandra/utils/obs/OpenBitSet.java
index b5310fa..3e1efce 100644
--- a/src/java/org/apache/cassandra/utils/obs/OpenBitSet.java
+++ b/src/java/org/apache/cassandra/utils/obs/OpenBitSet.java
@@ -104,6 +104,12 @@ public class OpenBitSet implements IBitSet
   /** Returns the current capacity in bits (1 greater than the index of the 
last bit) */
   public long capacity() { return ((long)wlen) << 6; }
 
+  @Override
+  public long offHeapSize()
+  {
+      return 0;
+  }
+
  /**
   * Returns the current capacity of this set.  Included for
   * compatibility.  This is *not* equal to {@link #cardinality}

Reply via email to