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 <[email protected]> Authored: Mon Aug 26 17:41:36 2013 -0500 Committer: Jonathan Ellis <[email protected]> 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; + } }
