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;
+ }
}