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 2013/08/27 01:02:04 UTC

[07/15] git commit: Allow disabling SlabAllocator patch by jbellis; reviewed by jasobrown for CASSANDRA-5935

Allow disabling SlabAllocator
patch by jbellis; reviewed by jasobrown for CASSANDRA-5935


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

Branch: refs/heads/cassandra-1.2
Commit: 4b805adc54007498d7ddd63ce0de43bfe126675f
Parents: 6164d01
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Aug 26 17:41:36 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Aug 26 17:41:36 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  4 ++++
 .../org/apache/cassandra/config/Config.java     |  2 ++
 .../cassandra/config/DatabaseDescriptor.java    | 24 ++++++++++++++++++++
 src/java/org/apache/cassandra/db/Memtable.java  | 17 +++++++-------
 .../org/apache/cassandra/utils/Allocator.java   |  4 ++++
 .../apache/cassandra/utils/HeapAllocator.java   | 16 ++++++++++++-
 6 files changed, 57 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b805adc/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index afb0836..13b4214 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,7 @@
+1.2.10
+ * Allow disabling SlabAllocator (CASSANDRA-5935)
+
+
 1.2.9
  * Fix getBloomFilterDiskSpaceUsed for AlwaysPresentFilter (CASSANDRA-5900)
  * migrate 1.1 schema_columnfamilies.key_alias column to key_aliases

http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b805adc/src/java/org/apache/cassandra/config/Config.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java
index 7fbd019..74b941d 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -170,6 +170,8 @@ public class Config
 
     public boolean inter_dc_tcp_nodelay = true;
 
+    public String memtable_allocator = "SlabAllocator";
+
     private static boolean loadYaml = true;
     private static boolean outboundBindAny = false;
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b805adc/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index c1ced94..1412888 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -51,6 +51,7 @@ import org.apache.cassandra.scheduler.IRequestScheduler;
 import org.apache.cassandra.scheduler.NoScheduler;
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.service.MigrationManager;
+import org.apache.cassandra.utils.Allocator;
 import org.apache.cassandra.utils.FBUtilities;
 import org.yaml.snakeyaml.Loader;
 import org.yaml.snakeyaml.TypeDescription;
@@ -91,6 +92,8 @@ public class DatabaseDescriptor
     private static String localDC;
     private static Comparator<InetAddress> localComparator;
 
+    private static Class<? extends Allocator> memtableAllocator;
+
     /**
      * Inspect the classpath to find storage configuration file
      */
@@ -467,6 +470,11 @@ public class DatabaseDescriptor
                 conf.server_encryption_options = conf.encryption_options;
             }
 
+            String allocatorClass = conf.memtable_allocator;
+            if (!allocatorClass.contains("."))
+                allocatorClass = "org.apache.cassandra.utils." + allocatorClass;
+            memtableAllocator = FBUtilities.classForName(allocatorClass, "allocator");
+
             // Hardcoded system tables
             List<KSMetaData> systemKeyspaces = Arrays.asList(KSMetaData.systemKeyspace(), KSMetaData.traceKeyspace());
             assert systemKeyspaces.size() == Schema.systemKeyspaceNames.size();
@@ -1286,4 +1294,20 @@ public class DatabaseDescriptor
     {
         return conf.inter_dc_tcp_nodelay;
     }
+
+    public static Allocator getMemtableAllocator()
+    {
+        try
+        {
+            return memtableAllocator.newInstance();
+        }
+        catch (InstantiationException e)
+        {
+            throw new RuntimeException(e);
+        }
+        catch (IllegalAccessException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b805adc/src/java/org/apache/cassandra/db/Memtable.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/Memtable.java b/src/java/org/apache/cassandra/db/Memtable.java
index 282acd2..df06cfb 100644
--- a/src/java/org/apache/cassandra/db/Memtable.java
+++ b/src/java/org/apache/cassandra/db/Memtable.java
@@ -25,30 +25,29 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import com.google.common.base.Function;
 import com.google.common.base.Throwables;
-
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
-import org.apache.cassandra.concurrent.StageManager;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.index.SecondaryIndexManager;
-import org.apache.cassandra.io.util.DiskAwareRunnable;
 import org.cliffc.high_scale_lib.NonBlockingHashSet;
-import org.github.jamm.MemoryMeter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
+import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
 import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.StageManager;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.columniterator.OnDiskAtomIterator;
 import org.apache.cassandra.db.columniterator.SimpleAbstractColumnIterator;
 import org.apache.cassandra.db.commitlog.ReplayPosition;
 import org.apache.cassandra.db.filter.AbstractColumnIterator;
 import org.apache.cassandra.db.filter.NamesQueryFilter;
 import org.apache.cassandra.db.filter.SliceQueryFilter;
+import org.apache.cassandra.db.index.SecondaryIndexManager;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.io.sstable.SSTableMetadata;
 import org.apache.cassandra.io.sstable.SSTableReader;
 import org.apache.cassandra.io.sstable.SSTableWriter;
-import org.apache.cassandra.utils.SlabAllocator;
+import org.apache.cassandra.io.util.DiskAwareRunnable;
+import org.apache.cassandra.utils.Allocator;
+import org.github.jamm.MemoryMeter;
 
 public class Memtable
 {
@@ -114,7 +113,7 @@ public class Memtable
     public final ColumnFamilyStore cfs;
     private final long creationTime;
 
-    private final SlabAllocator allocator = new SlabAllocator();
+    private final Allocator allocator = DatabaseDescriptor.getMemtableAllocator();
     // We really only need one column by allocator but one by memtable is not a big waste and avoids needing allocators to know about CFS
     private final Function<IColumn, IColumn> localCopyFunction = new Function<IColumn, IColumn>()
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b805adc/src/java/org/apache/cassandra/utils/Allocator.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/Allocator.java b/src/java/org/apache/cassandra/utils/Allocator.java
index e9679eb..d11815d 100644
--- a/src/java/org/apache/cassandra/utils/Allocator.java
+++ b/src/java/org/apache/cassandra/utils/Allocator.java
@@ -36,4 +36,8 @@ public abstract class Allocator
     }
 
     public abstract ByteBuffer allocate(int size);
+
+    public abstract long getMinimumSize();
+
+    public abstract long getMaximumSize();
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/4b805adc/src/java/org/apache/cassandra/utils/HeapAllocator.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/HeapAllocator.java b/src/java/org/apache/cassandra/utils/HeapAllocator.java
index ce8e448..efe55dd 100644
--- a/src/java/org/apache/cassandra/utils/HeapAllocator.java
+++ b/src/java/org/apache/cassandra/utils/HeapAllocator.java
@@ -23,10 +23,24 @@ public final class HeapAllocator extends Allocator
 {
     public static final HeapAllocator instance = new HeapAllocator();
 
-    private HeapAllocator() {}
+    /**
+     * Normally you should use HeapAllocator.instance, since there is no per-Allocator state.
+     * This is exposed so that the reflection done by Memtable works when SlabAllocator is disabled.
+     */
+    public HeapAllocator() {}
 
     public ByteBuffer allocate(int size)
     {
         return ByteBuffer.allocate(size);
     }
+
+    public long getMinimumSize()
+    {
+        return 0;
+    }
+
+    public long getMaximumSize()
+    {
+        return Long.MAX_VALUE;
+    }
 }