Merge branch 'cassandra-2.2' into cassandra-3.0
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/71bca780 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/71bca780 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/71bca780 Branch: refs/heads/trunk Commit: 71bca78006829221c92cc336878da36bb846d28e Parents: 5fd6c54 96b7603 Author: Marcus Eriksson <marc...@apache.org> Authored: Thu Nov 26 08:36:33 2015 +0100 Committer: Marcus Eriksson <marc...@apache.org> Committed: Thu Nov 26 08:36:33 2015 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../db/compaction/CompactionManager.java | 6 +- .../org/apache/cassandra/db/CleanupTest.java | 77 ++++++++++++++++++++ 3 files changed, 82 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/71bca780/CHANGES.txt ---------------------------------------------------------------------- diff --cc CHANGES.txt index f95f079,a548c9f..db6c72f --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -13,8 -3,18 +13,9 @@@ Merged from 2.2 * Fix SimpleDateType type compatibility (CASSANDRA-10027) * (Hadoop) fix splits calculation (CASSANDRA-10640) * (Hadoop) ensure that Cluster instances are always closed (CASSANDRA-10058) - * (cqlsh) show partial trace if incomplete after max_trace_wait (CASSANDRA-7645) - * Use most up-to-date version of schema for system tables (CASSANDRA-10652) - * Deprecate memory_allocator in cassandra.yaml (CASSANDRA-10581,10628) - * Expose phi values from failure detector via JMX and tweak debug - and trace logging (CASSANDRA-9526) - * Fix RangeNamesQueryPager (CASSANDRA-10509) - * Deprecate Pig support (CASSANDRA-10542) - * Reduce contention getting instances of CompositeType (CASSANDRA-10433) Merged from 2.1: + * Fix the sstable-needs-cleanup check (CASSANDRA-10740) * (cqlsh) Print column names before COPY operation (CASSANDRA-8935) - * Make paging logic consistent between searcher impls (CASSANDRA-10683) * Fix CompressedInputStream for proper cleanup (CASSANDRA-10012) * (cqlsh) Support counters in COPY commands (CASSANDRA-9043) * Try next replica if not possible to connect to primary replica on http://git-wip-us.apache.org/repos/asf/cassandra/blob/71bca780/src/java/org/apache/cassandra/db/compaction/CompactionManager.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/71bca780/test/unit/org/apache/cassandra/db/CleanupTest.java ---------------------------------------------------------------------- diff --cc test/unit/org/apache/cassandra/db/CleanupTest.java index a4aca7f,0115ad9..167f3b0 --- a/test/unit/org/apache/cassandra/db/CleanupTest.java +++ b/test/unit/org/apache/cassandra/db/CleanupTest.java @@@ -32,15 -35,19 +35,17 @@@ import org.junit.Test import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; -import org.apache.cassandra.config.KSMetaData; +import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.Operator; -import org.apache.cassandra.db.filter.IDiskAtomFilter; -import org.apache.cassandra.db.columniterator.IdentityQueryFilter; import org.apache.cassandra.db.compaction.CompactionManager; -import org.apache.cassandra.db.index.SecondaryIndex; +import org.apache.cassandra.db.filter.RowFilter; import org.apache.cassandra.dht.ByteOrderedPartitioner.BytesToken; + import org.apache.cassandra.dht.Range; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.format.SSTableReader; -import org.apache.cassandra.locator.SimpleStrategy; + import org.apache.cassandra.dht.Token; import org.apache.cassandra.locator.TokenMetadata; +import org.apache.cassandra.schema.KeyspaceParams; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; @@@ -165,10 -182,83 +170,82 @@@ public class CleanupTes tmd.updateNormalToken(new BytesToken(tk2), InetAddress.getByName("127.0.0.2")); CompactionManager.instance.performCleanup(cfs); - rows = Util.getRangeSlice(cfs); - assertEquals(0, rows.size()); + assertEquals(0, Util.getAll(Util.cmd(cfs).build()).size()); } + @Test + public void testNeedsCleanup() throws Exception + { + // setup + StorageService.instance.getTokenMetadata().clearUnsafe(); + Keyspace keyspace = Keyspace.open(KEYSPACE1); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF1); - fillCF(cfs, LOOPS); ++ ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARD1); ++ fillCF(cfs, "val", LOOPS); + + // prepare SSTable and some useful tokens - SSTableReader ssTable = cfs.getSSTables().iterator().next(); ++ SSTableReader ssTable = cfs.getLiveSSTables().iterator().next(); + final Token ssTableMin = ssTable.first.getToken(); + final Token ssTableMax = ssTable.last.getToken(); + + final Token min = token((byte) 0); + final Token before1 = token((byte) 2); + final Token before2 = token((byte) 5); + final Token before3 = token((byte) 10); + final Token before4 = token((byte) 47); + final Token insideSsTable1 = token((byte) 50); + final Token insideSsTable2 = token((byte) 55); + final Token max = token((byte) 127, (byte) 127, (byte) 127, (byte) 127); + + // test sanity check + assert (min.compareTo(ssTableMin) < 0); + assert (before1.compareTo(ssTableMin) < 0); + assert (before2.compareTo(ssTableMin) < 0); + assert (before3.compareTo(ssTableMin) < 0); + assert (before4.compareTo(ssTableMin) < 0); + assert (ssTableMin.compareTo(insideSsTable1) < 0); + assert (insideSsTable1.compareTo(ssTableMax) < 0); + assert (ssTableMin.compareTo(insideSsTable2) < 0); + assert (insideSsTable2.compareTo(ssTableMax) < 0); + assert (ssTableMax.compareTo(max) < 0); + + // test cases + // key: needs cleanup? + // value: owned ranges + List<Map.Entry<Boolean, List<Range<Token>>>> testCases = new LinkedList<Map.Entry<Boolean, List<Range<Token>>>>() + { + { + add(entry(false, Arrays.asList(range(min, max)))); // SSTable owned as a whole + add(entry(true, Arrays.asList(range(min, insideSsTable1)))); // SSTable owned only partially + add(entry(true, Arrays.asList(range(insideSsTable1, max)))); // SSTable owned only partially + add(entry(true, Arrays.asList(range(min, ssTableMin)))); // SSTable not owned at all + add(entry(true, Arrays.asList(range(ssTableMax, max)))); // only last token of SSTable is owned + add(entry(true, Arrays.asList(range(min, insideSsTable1), range(insideSsTable2, max)))); // SSTable partially owned by two ranges + add(entry(true, Arrays.asList(range(ssTableMin, ssTableMax)))); // first token of SSTable is not owned + add(entry(false, Arrays.asList(range(before4, max)))); // first token of SSTable is not owned + add(entry(false, Arrays.asList(range(min, before1), range(before2, before3), range(before4, max)))); // SSTable owned by the last range + } + }; + + // check all test cases + for (Map.Entry<Boolean, List<Range<Token>>> testCase : testCases) + { + assertEquals(testCase.getKey(), CompactionManager.needsCleanup(ssTable, testCase.getValue())); + } + } + private static BytesToken token(byte ... value) + { + return new BytesToken(value); + } + private static <K, V> Map.Entry<K, V> entry(K k, V v) + { + return new AbstractMap.SimpleEntry<K, V>(k, v); + } + private static Range<Token> range(Token from, Token to) + { + return new Range<>(from, to); + } + - protected void fillCF(ColumnFamilyStore cfs, int rowsPerSSTable) + protected void fillCF(ColumnFamilyStore cfs, String colName, int rowsPerSSTable) { CompactionManager.instance.disableAutoCompaction();