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/05/22 22:59:57 UTC

git commit: remove on-heap row cache

Updated Branches:
  refs/heads/trunk 2fc450a0b -> a3734e54b


remove on-heap row cache

Removed on-heap row cache
patch by jbellis; reviewed by jasobrown for CASSANDRA-5348


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

Branch: refs/heads/trunk
Commit: a3734e54bc9032dedad5d44394cca8dc7e400a43
Parents: 2fc450a
Author: Jonathan Ellis <jb...@apache.org>
Authored: Wed May 22 15:31:26 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Wed May 22 15:59:52 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 conf/cassandra.yaml                                |   18 ------
 .../cassandra/cache/ConcurrentLinkedHashCache.java |    5 --
 .../cache/ConcurrentLinkedHashCacheProvider.java   |   26 ---------
 src/java/org/apache/cassandra/cache/ICache.java    |    6 --
 .../apache/cassandra/cache/IRowCacheProvider.java  |   26 ---------
 .../apache/cassandra/cache/InstrumentingCache.java |    5 --
 .../apache/cassandra/cache/SerializingCache.java   |    5 --
 .../cassandra/cache/SerializingCacheProvider.java  |    2 +-
 src/java/org/apache/cassandra/config/Config.java   |    2 -
 .../cassandra/config/DatabaseDescriptor.java       |    8 ---
 .../apache/cassandra/db/CollationController.java   |   11 +---
 .../org/apache/cassandra/db/ColumnFamilyStore.java |   41 ++++-----------
 .../db/compaction/CompactionController.java        |   14 -----
 .../cassandra/db/compaction/CompactionTask.java    |    3 -
 .../org/apache/cassandra/service/CacheService.java |   10 ++--
 .../org/apache/cassandra/utils/FBUtilities.java    |    8 ---
 .../org/apache/cassandra/utils/StatusLogger.java   |   29 +++++-----
 .../cassandra/db/CollationControllerTest.java      |    4 +-
 19 files changed, 35 insertions(+), 189 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index fd85dab..b765896 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.0
+ * Removed on-heap row cache (CASSANDRA-5348)
  * use nanotime consistently for node-local timeouts (CASSANDRA-5581)
  * Avoid unnecessary second pass on name-based queries (CASSANDRA-5577)
  * Experimental triggers (CASSANDRA-1311)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/conf/cassandra.yaml
----------------------------------------------------------------------
diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml
index 1192442..f8cf4f7 100644
--- a/conf/cassandra.yaml
+++ b/conf/cassandra.yaml
@@ -170,24 +170,6 @@ row_cache_save_period: 0
 # Disabled by default, meaning all keys are going to be saved
 # row_cache_keys_to_save: 100
 
-# The provider for the row cache to use.
-#
-# Supported values are: ConcurrentLinkedHashCacheProvider, SerializingCacheProvider
-#
-# SerializingCacheProvider serialises the contents of the row and stores
-# it in native memory, i.e., off the JVM Heap. Serialized rows take
-# significantly less memory than "live" rows in the JVM, so you can cache
-# more rows in a given memory footprint.  And storing the cache off-heap
-# means you can use smaller heap sizes, reducing the impact of GC pauses.
-# Note however that when a row is requested from the row cache, it must be
-# deserialized into the heap for use.
-#
-# It is also valid to specify the fully-qualified class name to a class
-# that implements org.apache.cassandra.cache.IRowCacheProvider.
-#
-# Defaults to SerializingCacheProvider
-row_cache_provider: SerializingCacheProvider
-
 # The off-heap memory allocator.  Affects storage engine metadata as
 # well as caches.  Experiments show that JEMAlloc saves some memory
 # than the native GCC allocator (i.e., JEMalloc is more

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java b/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java
index af6549d..f1e0466 100644
--- a/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java
+++ b/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCache.java
@@ -130,9 +130,4 @@ public class ConcurrentLinkedHashCache<K extends IMeasurableMemory, V extends IM
     {
         return map.containsKey(key);
     }
-
-    public boolean isPutCopying()
-    {
-        return false;
-    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCacheProvider.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCacheProvider.java b/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCacheProvider.java
deleted file mode 100644
index e1e06ee..0000000
--- a/src/java/org/apache/cassandra/cache/ConcurrentLinkedHashCacheProvider.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.cache;
-
-public class ConcurrentLinkedHashCacheProvider implements IRowCacheProvider
-{
-    public ICache<RowCacheKey, IRowCacheEntry> create(long capacity)
-    {
-        return ConcurrentLinkedHashCache.create(capacity);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/cache/ICache.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/ICache.java b/src/java/org/apache/cassandra/cache/ICache.java
index 81ffe62..22dbb16 100644
--- a/src/java/org/apache/cassandra/cache/ICache.java
+++ b/src/java/org/apache/cassandra/cache/ICache.java
@@ -51,10 +51,4 @@ public interface ICache<K, V>
     public Set<K> hotKeySet(int n);
 
     public boolean containsKey(K key);
-
-    /**
-     * @return true if the cache implementation inherently copies the cached values; otherwise,
-     * the caller should copy manually before caching shared values like Thrift ByteBuffers.
-     */
-    public boolean isPutCopying();
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/cache/IRowCacheProvider.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/IRowCacheProvider.java b/src/java/org/apache/cassandra/cache/IRowCacheProvider.java
deleted file mode 100644
index 003bfae..0000000
--- a/src/java/org/apache/cassandra/cache/IRowCacheProvider.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.cache;
-
-/**
- * Provides cache objects with a requested capacity.
- */
-public interface IRowCacheProvider
-{
-    public ICache<RowCacheKey, IRowCacheEntry> create(long capacity);
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/cache/InstrumentingCache.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/InstrumentingCache.java b/src/java/org/apache/cassandra/cache/InstrumentingCache.java
index 9655e8d..311b373 100644
--- a/src/java/org/apache/cassandra/cache/InstrumentingCache.java
+++ b/src/java/org/apache/cassandra/cache/InstrumentingCache.java
@@ -125,11 +125,6 @@ public class InstrumentingCache<K, V>
         return map.containsKey(key);
     }
 
-    public boolean isPutCopying()
-    {
-        return map.isPutCopying();
-    }
-
     public CacheMetrics getMetrics()
     {
         return metrics;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/cache/SerializingCache.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/SerializingCache.java b/src/java/org/apache/cassandra/cache/SerializingCache.java
index c7430d2..2210f10 100644
--- a/src/java/org/apache/cassandra/cache/SerializingCache.java
+++ b/src/java/org/apache/cassandra/cache/SerializingCache.java
@@ -249,9 +249,4 @@ public class SerializingCache<K, V> implements ICache<K, V>
     {
         return map.containsKey(key);
     }
-
-    public boolean isPutCopying()
-    {
-        return true;
-    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java b/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java
index 1ee211d..84c948e 100644
--- a/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java
+++ b/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java
@@ -26,7 +26,7 @@ import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.ISerializer;
 import org.apache.cassandra.net.MessagingService;
 
-public class SerializingCacheProvider implements IRowCacheProvider
+public class SerializingCacheProvider
 {
     public ICache<RowCacheKey, IRowCacheEntry> create(long capacity)
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/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 31bf20e..d691681 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.config;
 
-import org.apache.cassandra.cache.SerializingCacheProvider;
 import org.apache.cassandra.config.EncryptionOptions.ClientEncryptionOptions;
 import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions;
 import org.apache.cassandra.io.util.NativeAllocator;
@@ -164,7 +163,6 @@ public class Config
     public long row_cache_size_in_mb = 0;
     public volatile int row_cache_save_period = 0;
     public int row_cache_keys_to_save = Integer.MAX_VALUE;
-    public String row_cache_provider = SerializingCacheProvider.class.getSimpleName();
     public String memory_allocator = NativeAllocator.class.getSimpleName();
     public boolean populate_io_cache_on_flush = false;
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/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 b33f6fd..7a13d13 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -30,7 +30,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.auth.*;
-import org.apache.cassandra.cache.IRowCacheProvider;
 import org.apache.cassandra.config.Config.RequestSchedulerId;
 import org.apache.cassandra.config.EncryptionOptions.ClientEncryptionOptions;
 import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions;
@@ -79,7 +78,6 @@ public class DatabaseDescriptor
     private static RequestSchedulerOptions requestSchedulerOptions;
 
     private static long keyCacheSizeInMB;
-    private static IRowCacheProvider rowCacheProvider;
     private static IAllocator memoryAllocator;
 
     private static String localDC;
@@ -428,7 +426,6 @@ public class DatabaseDescriptor
                     + conf.key_cache_size_in_mb + "', supported values are <integer> >= 0.");
         }
 
-        rowCacheProvider = FBUtilities.newCacheProvider(conf.row_cache_provider);
         memoryAllocator = FBUtilities.newOffHeapAllocator(conf.memory_allocator);
 
         if(conf.encryption_options != null)
@@ -1166,11 +1163,6 @@ public class DatabaseDescriptor
         return conf.row_cache_keys_to_save;
     }
 
-    public static IRowCacheProvider getRowCacheProvider()
-    {
-        return rowCacheProvider;
-    }
-
     public static IAllocator getoffHeapMemoryAllocator()
     {
         return memoryAllocator;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/db/CollationController.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/CollationController.java b/src/java/org/apache/cassandra/db/CollationController.java
index 0482c47..eb5192e 100644
--- a/src/java/org/apache/cassandra/db/CollationController.java
+++ b/src/java/org/apache/cassandra/db/CollationController.java
@@ -41,20 +41,15 @@ public class CollationController
 
     private final ColumnFamilyStore cfs;
     private final QueryFilter filter;
-    private final ColumnFamily.Factory factory;
     private final int gcBefore;
 
     private int sstablesIterated = 0;
 
-    public CollationController(ColumnFamilyStore cfs, boolean mutableColumns, QueryFilter filter, int gcBefore)
+    public CollationController(ColumnFamilyStore cfs, QueryFilter filter, int gcBefore)
     {
         this.cfs = cfs;
         this.filter = filter;
         this.gcBefore = gcBefore;
-
-        this.factory = mutableColumns
-                     ? AtomicSortedColumns.factory
-                     : ArrayBackedSortedColumns.factory;
     }
 
     public ColumnFamily getTopLevelColumns()
@@ -73,7 +68,7 @@ public class CollationController
     private ColumnFamily collectTimeOrderedData()
     {
         logger.trace("collectTimeOrderedData");
-        final ColumnFamily container = factory.create(cfs.metadata, filter.filter.isReversed());
+        final ColumnFamily container = ArrayBackedSortedColumns.factory.create(cfs.metadata, filter.filter.isReversed());
         List<OnDiskAtomIterator> iterators = new ArrayList<OnDiskAtomIterator>();
         Tracing.trace("Acquiring sstable references");
         ColumnFamilyStore.ViewFragment view = cfs.markReferenced(filter.key);
@@ -223,7 +218,7 @@ public class CollationController
         Tracing.trace("Acquiring sstable references");
         ColumnFamilyStore.ViewFragment view = cfs.markReferenced(filter.key);
         List<OnDiskAtomIterator> iterators = new ArrayList<OnDiskAtomIterator>(Iterables.size(view.memtables) + view.sstables.size());
-        ColumnFamily returnCF = factory.create(cfs.metadata, filter.filter.isReversed());
+        ColumnFamily returnCF = ArrayBackedSortedColumns.factory.create(cfs.metadata, filter.filter.isReversed());
 
         try
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/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 892e35f..78825cf 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -808,29 +808,13 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         FBUtilities.waitOnFuture(forceFlush());
     }
 
-    public void maybeUpdateRowCache(DecoratedKey key, ColumnFamily columnFamily)
+    public void maybeUpdateRowCache(DecoratedKey key)
     {
         if (!isRowCacheEnabled())
             return;
 
         RowCacheKey cacheKey = new RowCacheKey(metadata.cfId, key);
-
-        // always invalidate a copying cache value
-        if (CacheService.instance.rowCache.isPutCopying())
-        {
-            invalidateCachedRow(cacheKey);
-            return;
-        }
-
-        // invalidate a normal cache value if it's a sentinel, so the read will retry (and include the new update)
-        IRowCacheEntry cachedRow = CacheService.instance.rowCache.getInternal(cacheKey);
-        if (cachedRow != null)
-        {
-            if (cachedRow instanceof RowCacheSentinel)
-                invalidateCachedRow(cacheKey);
-            else
-                ((ColumnFamily) cachedRow).addAll(columnFamily, HeapAllocator.instance);
-        }
+        invalidateCachedRow(cacheKey);
     }
 
     /**
@@ -846,7 +830,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
 
         Memtable mt = getMemtableThreadSafe();
         mt.put(key, columnFamily, indexer);
-        maybeUpdateRowCache(key, columnFamily);
+        maybeUpdateRowCache(key);
         metric.writeLatency.addNano(System.nanoTime() - start);
 
         // recompute liveRatio, if we have doubled the number of ops since last calculated
@@ -1239,7 +1223,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
             {
                 // Some other read is trying to cache the value, just do a normal non-caching read
                 Tracing.trace("Row cache miss (race)");
-                return getTopLevelColumns(filter, Integer.MIN_VALUE, false);
+                return getTopLevelColumns(filter, Integer.MIN_VALUE);
             }
             Tracing.trace("Row cache hit");
             return (ColumnFamily) cached;
@@ -1251,9 +1235,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
 
         try
         {
-            ColumnFamily data = getTopLevelColumns(QueryFilter.getIdentityFilter(filter.key, name),
-                                                   Integer.MIN_VALUE,
-                                                   true);
+            ColumnFamily data = getTopLevelColumns(QueryFilter.getIdentityFilter(filter.key, name), Integer.MIN_VALUE);
             if (sentinelSuccess && data != null)
                 CacheService.instance.rowCache.replace(key, sentinel, data);
 
@@ -1295,7 +1277,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
             }
             else
             {
-                ColumnFamily cf = getTopLevelColumns(filter, gcBefore, false);
+                ColumnFamily cf = getTopLevelColumns(filter, gcBefore);
 
                 if (cf == null)
                     return null;
@@ -1462,13 +1444,10 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         }
     }
 
-    public ColumnFamily getTopLevelColumns(QueryFilter filter, int gcBefore, boolean forCache)
+    public ColumnFamily getTopLevelColumns(QueryFilter filter, int gcBefore)
     {
         Tracing.trace("Executing single-partition query on {}", name);
-        CollationController controller = new CollationController(this,
-                                                                 forCache && !CacheService.instance.rowCache.isPutCopying(),
-                                                                 filter,
-                                                                 gcBefore);
+        CollationController controller = new CollationController(this, filter, gcBefore);
         ColumnFamily columns = controller.getTopLevelColumns();
         metric.updateSSTableIterated(controller.getSstablesIterated());
         return columns;
@@ -1727,8 +1706,8 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
      */
     public ColumnFamily getRawCachedRow(DecoratedKey key)
     {
-        if (!isRowCacheEnabled() || metadata.cfId == null)
-            return null; // secondary index
+        if (!isRowCacheEnabled())
+            return null;
 
         IRowCacheEntry cached = CacheService.instance.rowCache.getInternal(new RowCacheKey(metadata.cfId, key));
         return cached == null || cached instanceof RowCacheSentinel ? null : (ColumnFamily) cached;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/db/compaction/CompactionController.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionController.java b/src/java/org/apache/cassandra/db/compaction/CompactionController.java
index fd23882..15878c5 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionController.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionController.java
@@ -177,20 +177,6 @@ public class CompactionController
         cfs.invalidateCachedRow(key);
     }
 
-    public void removeDeletedInCache(DecoratedKey key)
-    {
-        // For the copying cache, we'd need to re-serialize the updated cachedRow, which would be racy
-        // vs other updates.  We'll just ignore it instead, since the next update to this row will invalidate it
-        // anyway, so the odds of a "tombstones consuming memory indefinitely" problem are minimal.
-        // See https://issues.apache.org/jira/browse/CASSANDRA-3921 for more discussion.
-        if (CacheService.instance.rowCache.isPutCopying())
-            return;
-
-        ColumnFamily cachedRow = cfs.getRawCachedRow(key);
-        if (cachedRow != null)
-            ColumnFamilyStore.removeDeleted(cachedRow, gcBefore);
-    }
-
     /**
      * @return an AbstractCompactedRow implementation to write the merged rows in question.
      *

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
index 13fc11d..d6fd171 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
@@ -165,9 +165,6 @@ public class CompactionTask extends AbstractCompactionTask
                     continue;
                 }
 
-                // If the row is cached, we call removeDeleted on at read time it to have coherent query returns,
-                // but if the row is not pushed out of the cache, obsolete tombstones will persist indefinitely.
-                controller.removeDeletedInCache(row.key);
                 totalkeysWritten++;
 
                 if (DatabaseDescriptor.getPreheatKeyCache())

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/service/CacheService.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/CacheService.java b/src/java/org/apache/cassandra/service/CacheService.java
index 5eff28a..d301507 100644
--- a/src/java/org/apache/cassandra/service/CacheService.java
+++ b/src/java/org/apache/cassandra/service/CacheService.java
@@ -130,14 +130,12 @@ public class CacheService implements CacheServiceMBean
      */
     private AutoSavingCache<RowCacheKey, IRowCacheEntry> initRowCache()
     {
-        logger.info("Initializing row cache with capacity of {} MBs and provider {}",
-                    DatabaseDescriptor.getRowCacheSizeInMB(),
-                    DatabaseDescriptor.getRowCacheProvider().getClass().getName());
+        logger.info("Initializing row cache with capacity of {} MBs", DatabaseDescriptor.getRowCacheSizeInMB());
 
         long rowCacheInMemoryCapacity = DatabaseDescriptor.getRowCacheSizeInMB() * 1024 * 1024;
 
         // cache object
-        ICache<RowCacheKey, IRowCacheEntry> rc = DatabaseDescriptor.getRowCacheProvider().create(rowCacheInMemoryCapacity);
+        ICache<RowCacheKey, IRowCacheEntry> rc = new SerializingCacheProvider().create(rowCacheInMemoryCapacity);
         AutoSavingCache<RowCacheKey, IRowCacheEntry> rowCache = new AutoSavingCache<RowCacheKey, IRowCacheEntry>(rc, CacheType.ROW_CACHE, new RowCacheSerializer());
 
         int rowCacheKeysToSave = DatabaseDescriptor.getRowCacheKeysToSave();
@@ -302,7 +300,7 @@ public class CacheService implements CacheServiceMBean
                 public Pair<RowCacheKey, IRowCacheEntry> call() throws Exception
                 {
                     DecoratedKey key = cfs.partitioner.decorateKey(buffer);
-                    ColumnFamily data = cfs.getTopLevelColumns(QueryFilter.getIdentityFilter(key, cfs.name), Integer.MIN_VALUE, true);
+                    ColumnFamily data = cfs.getTopLevelColumns(QueryFilter.getIdentityFilter(key, cfs.name), Integer.MIN_VALUE);
                     return Pair.create(new RowCacheKey(cfs.metadata.cfId, key), (IRowCacheEntry) data);
                 }
             });
@@ -313,7 +311,7 @@ public class CacheService implements CacheServiceMBean
             for (ByteBuffer key : buffers)
             {
                 DecoratedKey dk = cfs.partitioner.decorateKey(key);
-                ColumnFamily data = cfs.getTopLevelColumns(QueryFilter.getIdentityFilter(dk, cfs.name), Integer.MIN_VALUE, true);
+                ColumnFamily data = cfs.getTopLevelColumns(QueryFilter.getIdentityFilter(dk, cfs.name), Integer.MIN_VALUE);
                 if (data != null)
                     rowCache.put(new RowCacheKey(cfs.metadata.cfId, dk), data);
             }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/utils/FBUtilities.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java
index eeeb41f..027f74a 100644
--- a/src/java/org/apache/cassandra/utils/FBUtilities.java
+++ b/src/java/org/apache/cassandra/utils/FBUtilities.java
@@ -41,7 +41,6 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.cache.IRowCacheProvider;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
@@ -500,13 +499,6 @@ public class FBUtilities
         return field;
     }
 
-    public static IRowCacheProvider newCacheProvider(String cache_provider) throws ConfigurationException
-    {
-        if (!cache_provider.contains("."))
-            cache_provider = "org.apache.cassandra.cache." + cache_provider;
-        return FBUtilities.construct(cache_provider, "row cache provider");
-    }
-
     public static <T> CloseableIterator<T> closeableIterator(Iterator<T> iterator)
     {
         return new WrappedCloseableIterator<T>(iterator);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/src/java/org/apache/cassandra/utils/StatusLogger.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/StatusLogger.java b/src/java/org/apache/cassandra/utils/StatusLogger.java
index b7266cb..94f045e 100644
--- a/src/java/org/apache/cassandra/utils/StatusLogger.java
+++ b/src/java/org/apache/cassandra/utils/StatusLogger.java
@@ -26,10 +26,8 @@ import javax.management.ObjectName;
 
 import com.google.common.collect.Iterables;
 
-import org.apache.cassandra.cache.AutoSavingCache;
-import org.apache.cassandra.cache.IRowCacheEntry;
-import org.apache.cassandra.cache.KeyCacheKey;
-import org.apache.cassandra.cache.RowCacheKey;
+import org.apache.cassandra.cache.*;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -92,18 +90,19 @@ public class StatusLogger
         int keyCacheKeysToSave = DatabaseDescriptor.getKeyCacheKeysToSave();
         int rowCacheKeysToSave = DatabaseDescriptor.getRowCacheKeysToSave();
 
-        logger.info(String.format("%-25s%10s%25s%25s%65s", "Cache Type", "Size", "Capacity", "KeysToSave", "Provider"));
-        logger.info(String.format("%-25s%10s%25s%25s%65s", "KeyCache",
-                                                           keyCache.weightedSize(),
-                                                           keyCache.getCapacity(),
-                                                           keyCacheKeysToSave == Integer.MAX_VALUE ? "all" : keyCacheKeysToSave,
-                                                           ""));
+        logger.info(String.format("%-25s%10s%25s%25s",
+                                  "Cache Type", "Size", "Capacity", "KeysToSave"));
+        logger.info(String.format("%-25s%10s%25s%25s",
+                                  "KeyCache",
+                                  keyCache.weightedSize(),
+                                  keyCache.getCapacity(),
+                                  keyCacheKeysToSave == Integer.MAX_VALUE ? "all" : keyCacheKeysToSave));
 
-        logger.info(String.format("%-25s%10s%25s%25s%65s", "RowCache",
-                                                           rowCache.weightedSize(),
-                                                           rowCache.getCapacity(),
-                                                           rowCacheKeysToSave == Integer.MAX_VALUE ? "all" : rowCacheKeysToSave,
-                                                           DatabaseDescriptor.getRowCacheProvider().getClass().getName()));
+        logger.info(String.format("%-25s%10s%25s%25s",
+                                  "RowCache",
+                                  rowCache.weightedSize(),
+                                  rowCache.getCapacity(),
+                                  rowCacheKeysToSave == Integer.MAX_VALUE ? "all" : rowCacheKeysToSave));
 
         // per-CF stats
         logger.info(String.format("%-25s%20s", "ColumnFamily", "Memtable ops,data"));

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a3734e54/test/unit/org/apache/cassandra/db/CollationControllerTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/CollationControllerTest.java b/test/unit/org/apache/cassandra/db/CollationControllerTest.java
index 4ef8d64..f835ad3 100644
--- a/test/unit/org/apache/cassandra/db/CollationControllerTest.java
+++ b/test/unit/org/apache/cassandra/db/CollationControllerTest.java
@@ -70,7 +70,7 @@ public class CollationControllerTest extends SchemaLoader
         // A NamesQueryFilter goes down one code path (through collectTimeOrderedData())
         // It should only iterate the last flushed sstable, since it probably contains the most recent value for Column1
         QueryFilter filter = QueryFilter.getNamesFilter(dk, "Standard1", ByteBufferUtil.bytes("Column1"));
-        CollationController controller = new CollationController(store, false, filter, Integer.MIN_VALUE);
+        CollationController controller = new CollationController(store, filter, Integer.MIN_VALUE);
         controller.getTopLevelColumns();
         assertEquals(1, controller.getSstablesIterated());
 
@@ -78,7 +78,7 @@ public class CollationControllerTest extends SchemaLoader
         // We will read "only" the last sstable in that case, but because the 2nd sstable has a tombstone that is more
         // recent than the maxTimestamp of the very first sstable we flushed, we should only read the 2 first sstables.
         filter = QueryFilter.getIdentityFilter(dk, "Standard1");
-        controller = new CollationController(store, false, filter, Integer.MIN_VALUE);
+        controller = new CollationController(store, filter, Integer.MIN_VALUE);
         controller.getTopLevelColumns();
         assertEquals(2, controller.getSstablesIterated());
     }