You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ma...@apache.org on 2015/03/04 09:10:15 UTC

[1/2] cassandra git commit: Remove cold_reads_to_omit from STCS

Repository: cassandra
Updated Branches:
  refs/heads/trunk 89d31f3da -> b5b1af703


Remove cold_reads_to_omit from STCS

Patch by marcuse; reviewed by thobbs for CASSANDRA-8860


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

Branch: refs/heads/trunk
Commit: f6d0cf395fe33bc3d13af75d5a34cbf1a9017276
Parents: d4e3786
Author: Marcus Eriksson <ma...@apache.org>
Authored: Tue Mar 3 11:49:08 2015 +0100
Committer: Marcus Eriksson <ma...@apache.org>
Committed: Wed Mar 4 08:42:34 2015 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |   1 +
 NEWS.txt                                        |   8 ++
 pylib/cqlshlib/cql3handling.py                  |   1 -
 .../SizeTieredCompactionStrategy.java           | 136 -------------------
 .../SizeTieredCompactionStrategyOptions.java    |  13 +-
 .../SizeTieredCompactionStrategyTest.java       |  90 ------------
 6 files changed, 10 insertions(+), 239 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f6d0cf39/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 748acf8..4992d85 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.4
+ * Remove cold_reads_to_omit from STCS (CASSANDRA-8860)
  * Make EstimatedHistogram#percentile() use ceil instead of floor (CASSANDRA-8883)
  * Fix top partitions reporting wrong cardinality (CASSANDRA-8834)
  * Fix rare NPE in KeyCacheSerializer (CASSANDRA-8067)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f6d0cf39/NEWS.txt
----------------------------------------------------------------------
diff --git a/NEWS.txt b/NEWS.txt
index 602770c..06013b8 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -13,6 +13,14 @@ restore snapshots created with the previous major version using the
 'sstableloader' tool. You can upgrade the file format of your snapshots
 using the provided 'sstableupgrade' tool.
 
+2.1.4
+=====
+Upgrading
+---------
+    - The option to omit cold sstables with size tiered compaction has been
+      removed - it is almost always better to use date tiered compaction for
+      workloads that have cold data. 
+
 2.1.3
 =====
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f6d0cf39/pylib/cqlshlib/cql3handling.py
----------------------------------------------------------------------
diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py
index f089cd7..88f042e 100644
--- a/pylib/cqlshlib/cql3handling.py
+++ b/pylib/cqlshlib/cql3handling.py
@@ -468,7 +468,6 @@ def cf_prop_val_mapkey_completer(ctxt, cass):
             opts.add('min_threshold')
             opts.add('bucket_high')
             opts.add('bucket_low')
-            opts.add('cold_reads_to_omit')
         elif csc == 'LeveledCompactionStrategy':
             opts.add('sstable_size_in_mb')
         elif csc == 'DateTieredCompactionStrategy':

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f6d0cf39/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java
index 08102c1..19abd9c 100644
--- a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java
+++ b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java
@@ -82,7 +82,6 @@ public class SizeTieredCompactionStrategy extends AbstractCompactionStrategy
         int maxThreshold = cfs.getMaximumCompactionThreshold();
 
         Iterable<SSTableReader> candidates = filterSuspectSSTables(Sets.intersection(cfs.getUncompactingSSTables(), sstables));
-        candidates = filterColdSSTables(Lists.newArrayList(candidates), options.coldReadsToOmit, cfs.getMinimumCompactionThreshold());
 
         List<List<SSTableReader>> buckets = getBuckets(createSSTableAndLengthPairs(candidates), options.bucketHigh, options.bucketLow, options.minSSTableSize);
         logger.debug("Compaction buckets are {}", buckets);
@@ -106,141 +105,6 @@ public class SizeTieredCompactionStrategy extends AbstractCompactionStrategy
         return Collections.singletonList(sstablesWithTombstones.get(0));
     }
 
-    /**
-     * Removes as many cold sstables as possible while retaining at least 1-coldReadsToOmit of the total reads/sec
-     * across all sstables
-     * @param sstables all sstables to consider
-     * @param coldReadsToOmit the proportion of total reads/sec that will be omitted (0=omit nothing, 1=omit everything)
-     * @param minThreshold min compaction threshold
-     * @return a list of sstables with the coldest sstables excluded until the reads they represent reaches coldReadsToOmit
-     */
-    @VisibleForTesting
-    static List<SSTableReader> filterColdSSTables(List<SSTableReader> sstables, double coldReadsToOmit, int minThreshold)
-    {
-        if (coldReadsToOmit == 0.0)
-            return sstables;
-
-        // Sort the sstables by hotness (coldest-first). We first build a map because the hotness may change during the sort.
-        final Map<SSTableReader, Double> hotnessSnapshot = getHotnessMap(sstables);
-        Collections.sort(sstables, new Comparator<SSTableReader>()
-        {
-            public int compare(SSTableReader o1, SSTableReader o2)
-            {
-                int comparison = Double.compare(hotnessSnapshot.get(o1), hotnessSnapshot.get(o2));
-                if (comparison != 0)
-                    return comparison;
-
-                // break ties with size on disk (mainly for system tables and cold tables)
-                comparison = Long.compare(o1.bytesOnDisk(), o2.bytesOnDisk());
-                if (comparison != 0)
-                    return comparison;
-
-                // if there's still a tie, use generation, which is guaranteed to be unique.  this ensures that
-                // our filtering is deterministic, which can be useful when debugging.
-                return o1.descriptor.generation - o2.descriptor.generation;
-            }
-        });
-
-        // calculate the total reads/sec across all sstables
-        double totalReads = 0.0;
-        for (SSTableReader sstr : sstables)
-            if (sstr.getReadMeter() != null)
-                totalReads += sstr.getReadMeter().twoHourRate();
-
-        // if this is a system table with no read meters or we don't have any read rates yet, just return them all
-        if (totalReads == 0.0)
-            return sstables;
-
-        // iteratively ignore the coldest sstables until ignoring one more would put us over the coldReadsToOmit threshold
-        double maxColdReads = coldReadsToOmit * totalReads;
-
-        double totalColdReads = 0.0;
-        int cutoffIndex = 0;
-        while (cutoffIndex < sstables.size())
-        {
-            SSTableReader sstable = sstables.get(cutoffIndex);
-            if (sstable.getReadMeter() == null)
-            {
-                throw new AssertionError("If you're seeing this exception, please attach your logs to CASSANDRA-8238 to help us debug. "+sstable);
-            }
-            double reads = sstable.getReadMeter().twoHourRate();
-            if (totalColdReads + reads > maxColdReads)
-                break;
-
-            totalColdReads += reads;
-            cutoffIndex++;
-        }
-        List<SSTableReader> hotSSTables = new ArrayList<>(sstables.subList(cutoffIndex, sstables.size()));
-        List<SSTableReader> coldSSTables = sstables.subList(0, cutoffIndex);
-        logger.debug("hotSSTables={}, coldSSTables={}", hotSSTables.size(), coldSSTables.size());
-        if (hotSSTables.size() >= minThreshold)
-            return hotSSTables;
-        if (coldSSTables.size() < minThreshold)
-            return Collections.emptyList();
-
-        Map<SSTableReader, Set<SSTableReader>> overlapMap = new HashMap<>();
-        for (int i = 0; i < coldSSTables.size(); i++)
-        {
-            SSTableReader sstable = coldSSTables.get(i);
-            Set<SSTableReader> overlaps = new HashSet<>();
-            for (int j = 0; j < coldSSTables.size(); j++)
-            {
-                SSTableReader innerSSTable = coldSSTables.get(j);
-                if (ColumnNameHelper.overlaps(sstable.getSSTableMetadata().minColumnNames,
-                                              sstable.getSSTableMetadata().maxColumnNames,
-                                              innerSSTable.getSSTableMetadata().minColumnNames,
-                                              innerSSTable.getSSTableMetadata().maxColumnNames,
-                                              sstable.metadata.comparator))
-                {
-                    overlaps.add(innerSSTable);
-                }
-            }
-            overlapMap.put(sstable, overlaps);
-        }
-        List<Set<SSTableReader>> overlapChains = new ArrayList<>();
-        for (SSTableReader sstable : overlapMap.keySet())
-            overlapChains.add(createOverlapChain(sstable, overlapMap));
-
-        Collections.sort(overlapChains, new Comparator<Set<SSTableReader>>()
-        {
-            @Override
-            public int compare(Set<SSTableReader> o1, Set<SSTableReader> o2)
-            {
-                return Longs.compare(SSTableReader.getTotalBytes(o2), SSTableReader.getTotalBytes(o1));
-            }
-        });
-        for (Set<SSTableReader> overlapping : overlapChains)
-        {
-            // if we are expecting to only keep 70% of the keys after a compaction, run a compaction on these cold sstables:
-            if (SSTableReader.estimateCompactionGain(overlapping) < 0.7)
-                return new ArrayList<>(overlapping);
-        }
-        return Collections.emptyList();
-    }
-
-    /**
-     * returns a set with all overlapping sstables starting with s.
-     * if we have 3 sstables, a, b, c where a overlaps with b, but not c and b overlaps with c, all sstables would be returned.
-     *
-     * m contains an sstable -> all overlapping mapping
-     */
-    private static Set<SSTableReader> createOverlapChain(SSTableReader s, Map<SSTableReader, Set<SSTableReader>> m)
-    {
-        Deque<SSTableReader> sstables = new ArrayDeque<>();
-        Set<SSTableReader> overlapChain = new HashSet<>();
-        sstables.push(s);
-        while (!sstables.isEmpty())
-        {
-            SSTableReader sstable = sstables.pop();
-            if (overlapChain.add(sstable))
-            {
-                if (m.containsKey(sstable))
-                    sstables.addAll(m.get(sstable));
-            }
-        }
-        return overlapChain;
-    }
-
 
     /**
      * @param buckets list of buckets from which to return the most interesting, where "interesting" is the total hotness for reads

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f6d0cf39/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyOptions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyOptions.java b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyOptions.java
index 84e7d61..9a840e1 100644
--- a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyOptions.java
+++ b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyOptions.java
@@ -26,16 +26,15 @@ public final class SizeTieredCompactionStrategyOptions
     protected static final long DEFAULT_MIN_SSTABLE_SIZE = 50L * 1024L * 1024L;
     protected static final double DEFAULT_BUCKET_LOW = 0.5;
     protected static final double DEFAULT_BUCKET_HIGH = 1.5;
-    protected static final double DEFAULT_COLD_READS_TO_OMIT = 0.05;
     protected static final String MIN_SSTABLE_SIZE_KEY = "min_sstable_size";
     protected static final String BUCKET_LOW_KEY = "bucket_low";
     protected static final String BUCKET_HIGH_KEY = "bucket_high";
+    @Deprecated
     protected static final String COLD_READS_TO_OMIT_KEY = "cold_reads_to_omit";
 
     protected long minSSTableSize;
     protected double bucketLow;
     protected double bucketHigh;
-    protected double coldReadsToOmit;
 
     public SizeTieredCompactionStrategyOptions(Map<String, String> options)
     {
@@ -45,8 +44,6 @@ public final class SizeTieredCompactionStrategyOptions
         bucketLow = optionValue == null ? DEFAULT_BUCKET_LOW : Double.parseDouble(optionValue);
         optionValue = options.get(BUCKET_HIGH_KEY);
         bucketHigh = optionValue == null ? DEFAULT_BUCKET_HIGH : Double.parseDouble(optionValue);
-        optionValue = options.get(COLD_READS_TO_OMIT_KEY);
-        coldReadsToOmit = optionValue == null ? DEFAULT_COLD_READS_TO_OMIT : Double.parseDouble(optionValue);
     }
 
     public SizeTieredCompactionStrategyOptions()
@@ -54,7 +51,6 @@ public final class SizeTieredCompactionStrategyOptions
         minSSTableSize = DEFAULT_MIN_SSTABLE_SIZE;
         bucketLow = DEFAULT_BUCKET_LOW;
         bucketHigh = DEFAULT_BUCKET_HIGH;
-        coldReadsToOmit = DEFAULT_COLD_READS_TO_OMIT;
     }
 
     private static double parseDouble(Map<String, String> options, String key, double defaultValue) throws ConfigurationException
@@ -94,13 +90,6 @@ public final class SizeTieredCompactionStrategyOptions
                                                            BUCKET_HIGH_KEY, bucketHigh, BUCKET_LOW_KEY, bucketLow));
         }
 
-        double maxColdReadsRatio = parseDouble(options, COLD_READS_TO_OMIT_KEY, DEFAULT_COLD_READS_TO_OMIT);
-        if (maxColdReadsRatio < 0.0 || maxColdReadsRatio > 1.0)
-        {
-            throw new ConfigurationException(String.format("%s value (%s) should be between between 0.0 and 1.0",
-                                                           COLD_READS_TO_OMIT_KEY, optionValue));
-        }
-
         uncheckedOptions.remove(MIN_SSTABLE_SIZE_KEY);
         uncheckedOptions.remove(BUCKET_LOW_KEY);
         uncheckedOptions.remove(BUCKET_HIGH_KEY);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f6d0cf39/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
index 87b284e..1591f03 100644
--- a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
@@ -33,7 +33,6 @@ import org.apache.cassandra.utils.Pair;
 import static org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy.getBuckets;
 import static org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy.mostInterestingBucket;
 import static org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy.trimToThresholdWithHotness;
-import static org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy.filterColdSSTables;
 import static org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy.validateOptions;
 
 import static org.junit.Assert.*;
@@ -45,7 +44,6 @@ public class SizeTieredCompactionStrategyTest extends SchemaLoader
     public void testOptionsValidation() throws ConfigurationException
     {
         Map<String, String> options = new HashMap<>();
-        options.put(SizeTieredCompactionStrategyOptions.COLD_READS_TO_OMIT_KEY, "0.35");
         options.put(SizeTieredCompactionStrategyOptions.BUCKET_LOW_KEY, "0.5");
         options.put(SizeTieredCompactionStrategyOptions.BUCKET_HIGH_KEY, "1.5");
         options.put(SizeTieredCompactionStrategyOptions.MIN_SSTABLE_SIZE_KEY, "10000");
@@ -54,25 +52,6 @@ public class SizeTieredCompactionStrategyTest extends SchemaLoader
 
         try
         {
-            options.put(SizeTieredCompactionStrategyOptions.COLD_READS_TO_OMIT_KEY, "-0.5");
-            validateOptions(options);
-            fail(String.format("Negative %s should be rejected", SizeTieredCompactionStrategyOptions.COLD_READS_TO_OMIT_KEY));
-        }
-        catch (ConfigurationException e) {}
-
-        try
-        {
-            options.put(SizeTieredCompactionStrategyOptions.COLD_READS_TO_OMIT_KEY, "10.0");
-            validateOptions(options);
-            fail(String.format("%s > 1.0 should be rejected", SizeTieredCompactionStrategyOptions.COLD_READS_TO_OMIT_KEY));
-        }
-        catch (ConfigurationException e)
-        {
-            options.put(SizeTieredCompactionStrategyOptions.COLD_READS_TO_OMIT_KEY, "0.25");
-        }
-
-        try
-        {
             options.put(SizeTieredCompactionStrategyOptions.BUCKET_LOW_KEY, "1000.0");
             validateOptions(options);
             fail("bucket_low greater than bucket_high should be rejected");
@@ -186,73 +165,4 @@ public class SizeTieredCompactionStrategyTest extends SchemaLoader
         assertEquals(String.format("bucket hotness (%f) should be close to %f", bucket.right, expectedBucketHotness),
                      expectedBucketHotness, bucket.right, 1.0);
     }
-
-    @Test
-    public void testFilterColdSSTables() throws Exception
-    {
-        String ksname = "Keyspace1";
-        String cfname = "Standard1";
-        Keyspace keyspace = Keyspace.open(ksname);
-        ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname);
-        cfs.truncateBlocking();
-        cfs.disableAutoCompaction();
-
-        ByteBuffer value = ByteBuffer.wrap(new byte[100]);
-
-        // create 10 sstables
-        int numSSTables = 10;
-        for (int r = 0; r < numSSTables; r++)
-        {
-            DecoratedKey key = Util.dk(String.valueOf(r));
-            Mutation rm = new Mutation(ksname, key.getKey());
-            rm.add(cfname, Util.cellname("column"), value, 0);
-            rm.apply();
-            cfs.forceBlockingFlush();
-        }
-        cfs.forceBlockingFlush();
-
-        List<SSTableReader> filtered;
-        List<SSTableReader> sstrs = new ArrayList<>(cfs.getSSTables());
-
-        for (SSTableReader sstr : sstrs)
-            sstr.overrideReadMeter(null);
-        filtered = filterColdSSTables(sstrs, 0.05, 0);
-        assertEquals("when there are no read meters, no sstables should be filtered", sstrs.size(), filtered.size());
-
-        for (SSTableReader sstr : sstrs)
-            sstr.overrideReadMeter(new RestorableMeter(0.0, 0.0));
-        filtered = filterColdSSTables(sstrs, 0.05, 0);
-        assertEquals("when all read meters are zero, no sstables should be filtered", sstrs.size(), filtered.size());
-
-        // leave all read rates at 0 besides one
-        sstrs.get(0).overrideReadMeter(new RestorableMeter(1000.0, 1000.0));
-        filtered = filterColdSSTables(sstrs, 0.05, 0);
-        assertEquals("there should only be one hot sstable", 1, filtered.size());
-        assertEquals(1000.0, filtered.get(0).getReadMeter().twoHourRate(), 0.5);
-
-        // the total read rate is 100, and we'll set a threshold of 2.5%, so two of the sstables with read
-        // rate 1.0 should be ignored, but not the third
-        for (SSTableReader sstr : sstrs)
-            sstr.overrideReadMeter(new RestorableMeter(0.0, 0.0));
-        sstrs.get(0).overrideReadMeter(new RestorableMeter(97.0, 97.0));
-        sstrs.get(1).overrideReadMeter(new RestorableMeter(1.0, 1.0));
-        sstrs.get(2).overrideReadMeter(new RestorableMeter(1.0, 1.0));
-        sstrs.get(3).overrideReadMeter(new RestorableMeter(1.0, 1.0));
-
-        filtered = filterColdSSTables(sstrs, 0.025, 0);
-        assertEquals(2, filtered.size());
-        assertEquals(98.0, filtered.get(0).getReadMeter().twoHourRate() + filtered.get(1).getReadMeter().twoHourRate(), 0.5);
-
-        // make sure a threshold of 0.0 doesn't result in any sstables being filtered
-        for (SSTableReader sstr : sstrs)
-            sstr.overrideReadMeter(new RestorableMeter(1.0, 1.0));
-        filtered = filterColdSSTables(sstrs, 0.0, 0);
-        assertEquals(sstrs.size(), filtered.size());
-
-        // just for fun, set a threshold where all sstables are considered cold
-        for (SSTableReader sstr : sstrs)
-            sstr.overrideReadMeter(new RestorableMeter(1.0, 1.0));
-        filtered = filterColdSSTables(sstrs, 1.0, 0);
-        assertTrue(filtered.isEmpty());
-    }
 }


[2/2] cassandra git commit: Merge branch 'cassandra-2.1' into trunk

Posted by ma...@apache.org.
Merge branch 'cassandra-2.1' into trunk

Conflicts:
	NEWS.txt
	test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java


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

Branch: refs/heads/trunk
Commit: b5b1af7036d9fdb68c397027040f099ae7140d58
Parents: 89d31f3 f6d0cf3
Author: Marcus Eriksson <ma...@apache.org>
Authored: Wed Mar 4 09:08:04 2015 +0100
Committer: Marcus Eriksson <ma...@apache.org>
Committed: Wed Mar 4 09:08:04 2015 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |   1 +
 NEWS.txt                                        |   8 ++
 pylib/cqlshlib/cql3handling.py                  |   1 -
 .../SizeTieredCompactionStrategy.java           | 136 -------------------
 .../SizeTieredCompactionStrategyOptions.java    |  13 +-
 .../SizeTieredCompactionStrategyTest.java       |  90 ------------
 6 files changed, 10 insertions(+), 239 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/b5b1af70/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 45751f1,4992d85..1759f7c
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,65 -1,5 +1,66 @@@
 +3.0
 + * Add role based access control (CASSANDRA-7653, 8650, 7216, 8760, 8849)
 + * Avoid accessing partitioner through StorageProxy (CASSANDRA-8244, 8268)
 + * Upgrade Metrics library and remove depricated metrics (CASSANDRA-5657)
 + * Serializing Row cache alternative, fully off heap (CASSANDRA-7438)
 + * Duplicate rows returned when in clause has repeated values (CASSANDRA-6707)
 + * Make CassandraException unchecked, extend RuntimeException (CASSANDRA-8560)
 + * Support direct buffer decompression for reads (CASSANDRA-8464)
 + * DirectByteBuffer compatible LZ4 methods (CASSANDRA-7039)
 + * Group sstables for anticompaction correctly (CASSANDRA-8578)
 + * Add ReadFailureException to native protocol, respond
 +   immediately when replicas encounter errors while handling
 +   a read request (CASSANDRA-7886)
 + * Switch CommitLogSegment from RandomAccessFile to nio (CASSANDRA-8308)
 + * Allow mixing token and partition key restrictions (CASSANDRA-7016)
 + * Support index key/value entries on map collections (CASSANDRA-8473)
 + * Modernize schema tables (CASSANDRA-8261)
 + * Support for user-defined aggregation functions (CASSANDRA-8053)
 + * Fix NPE in SelectStatement with empty IN values (CASSANDRA-8419)
 + * Refactor SelectStatement, return IN results in natural order instead
 +   of IN value list order and ignore duplicate values in partition key IN restrictions (CASSANDRA-7981)
 + * Support UDTs, tuples, and collections in user-defined
 +   functions (CASSANDRA-7563)
 + * Fix aggregate fn results on empty selection, result column name,
 +   and cqlsh parsing (CASSANDRA-8229)
 + * Mark sstables as repaired after full repair (CASSANDRA-7586)
 + * Extend Descriptor to include a format value and refactor reader/writer
 +   APIs (CASSANDRA-7443)
 + * Integrate JMH for microbenchmarks (CASSANDRA-8151)
 + * Keep sstable levels when bootstrapping (CASSANDRA-7460)
 + * Add Sigar library and perform basic OS settings check on startup (CASSANDRA-7838)
 + * Support for aggregation functions (CASSANDRA-4914)
 + * Remove cassandra-cli (CASSANDRA-7920)
 + * Accept dollar quoted strings in CQL (CASSANDRA-7769)
 + * Make assassinate a first class command (CASSANDRA-7935)
 + * Support IN clause on any partition key column (CASSANDRA-7855)
 + * Support IN clause on any clustering column (CASSANDRA-4762)
 + * Improve compaction logging (CASSANDRA-7818)
 + * Remove YamlFileNetworkTopologySnitch (CASSANDRA-7917)
 + * Do anticompaction in groups (CASSANDRA-6851)
 + * Support user-defined functions (CASSANDRA-7395, 7526, 7562, 7740, 7781, 7929,
 +   7924, 7812, 8063, 7813, 7708)
 + * Permit configurable timestamps with cassandra-stress (CASSANDRA-7416)
 + * Move sstable RandomAccessReader to nio2, which allows using the
 +   FILE_SHARE_DELETE flag on Windows (CASSANDRA-4050)
 + * Remove CQL2 (CASSANDRA-5918)
 + * Add Thrift get_multi_slice call (CASSANDRA-6757)
 + * Optimize fetching multiple cells by name (CASSANDRA-6933)
 + * Allow compilation in java 8 (CASSANDRA-7028)
 + * Make incremental repair default (CASSANDRA-7250)
 + * Enable code coverage thru JaCoCo (CASSANDRA-7226)
 + * Switch external naming of 'column families' to 'tables' (CASSANDRA-4369) 
 + * Shorten SSTable path (CASSANDRA-6962)
 + * Use unsafe mutations for most unit tests (CASSANDRA-6969)
 + * Fix race condition during calculation of pending ranges (CASSANDRA-7390)
 + * Fail on very large batch sizes (CASSANDRA-8011)
 + * Improve concurrency of repair (CASSANDRA-6455, 8208)
 + * Select optimal CRC32 implementation at runtime (CASSANDRA-8614)
 + * Evaluate MurmurHash of Token once per query (CASSANDRA-7096)
 +
 +
  2.1.4
+  * Remove cold_reads_to_omit from STCS (CASSANDRA-8860)
   * Make EstimatedHistogram#percentile() use ceil instead of floor (CASSANDRA-8883)
   * Fix top partitions reporting wrong cardinality (CASSANDRA-8834)
   * Fix rare NPE in KeyCacheSerializer (CASSANDRA-8067)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b5b1af70/NEWS.txt
----------------------------------------------------------------------
diff --cc NEWS.txt
index 2c5366a,06013b8..b492e4c
--- a/NEWS.txt
+++ b/NEWS.txt
@@@ -13,60 -13,14 +13,68 @@@ restore snapshots created with the prev
  'sstableloader' tool. You can upgrade the file format of your snapshots
  using the provided 'sstableupgrade' tool.
  
 +3.0
 +===
 +
 +New features
 +------------
 +   - Authentication & Authorization APIs have been updated to introduce
 +     roles. Roles and Permissions granted to them are inherited, supporting
 +     role based access control. The role concept supercedes that of users
 +     and CQL constructs such as CREATE USER are deprecated but retained for
 +     compatibility. The requirement to explicitly create Roles in Cassandra
 +     even when auth is handled by an external system has been removed, so
 +     authentication & authorization can be delegated to such systems in their
 +     entirety.
 +   - In addition to the above, Roles are also first class resources and can be the
 +     subject of permissions. Users (roles) can now be granted permissions on other
 +     roles, including CREATE, ALTER, DROP & AUTHORIZE, which removesthe need for
 +     superuser privileges in order to perform user/role management operations.
 +   - Creators of database resources (Keyspaces, Tables, Roles) are now automatically
 +     granted all permissions on them (if the IAuthorizer implementation supports
 +     this).
 +   - SSTable file name is changed. Now you don't have Keyspace/CF name
 +     in file name. Also, secondary index has its own directory under parent's
 +     directory.
 +   - Support for user-defined functions and user-defined aggregates have
 +     been added to CQL.
 +
 +
 +Upgrading
 +---------
 +   - Pig's CqlStorage has been removed, use CqlNativeStorage instead
 +   - IAuthenticator been updated to remove responsibility for user/role
 +     maintenance and is now solely responsible for validating credentials,
 +     This is primarily done via SASL, though an optional method exists for
 +     systems which need support for the Thrift login() method.
 +   - IRoleManager interface has been added which takes over the maintenance
 +     functions from IAuthenticator. IAuthorizer is mainly unchanged. Auth data
 +     in systems using the stock internal implementations PasswordAuthenticator
 +     & CassandraAuthorizer will be automatically converted during upgrade,
 +     with minimal operator intervention required. Custom implementations will
 +     require modification, though these can be used in conjunction with the
 +     stock CassandraRoleManager so providing an IRoleManager implementation
 +     should not usually be necessary.
 +   - Fat client support has been removed since we have push notifications to clients
 +   - cassandra-cli has been removed. Please use cqlsh instead.
 +   - YamlFileNetworkTopologySnitch has been removed; switch to
 +     GossipingPropertyFileSnitch instead.
 +   - CQL2 has been removed entirely in this release (previously deprecated
 +     in 2.0.0). Please switch to CQL3 if you haven't already done so.
 +   - Very large batches will now be rejected (defaults to 50kb). This
 +     can be customized by modifying batch_size_fail_threshold_in_kb.
 +   - The results of CQL3 queries containing an IN restriction will be ordered
 +     in the normal order and not anymore in the order in which the column values were
 +     specified in the IN restriction.
 +
+ 2.1.4
+ =====
+ Upgrading
+ ---------
+     - The option to omit cold sstables with size tiered compaction has been
+       removed - it is almost always better to use date tiered compaction for
+       workloads that have cold data. 
+ 
  2.1.3
  =====
  

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b5b1af70/pylib/cqlshlib/cql3handling.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b5b1af70/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b5b1af70/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
----------------------------------------------------------------------