http://git-wip-us.apache.org/repos/asf/cassandra/blob/d693ca12/src/java/org/apache/cassandra/tools/StandaloneScrubber.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/tools/StandaloneScrubber.java index d420218,26768f3..459df98 --- a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java +++ b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java @@@ -109,7 -121,7 +110,7 @@@ public class StandaloneScrubbe { try { - Scrubber scrubber = new Scrubber(cfs, sstable, options.skipCorrupted, handler, true); - Scrubber scrubber = new Scrubber(cfs, sstable, options.skipCorrupted, !options.noValidate, handler, true); ++ Scrubber scrubber = new Scrubber(cfs, sstable, options.skipCorrupted, handler, true, !options.noValidate); try { scrubber.scrub();
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d693ca12/test/unit/org/apache/cassandra/db/ScrubTest.java ---------------------------------------------------------------------- diff --cc test/unit/org/apache/cassandra/db/ScrubTest.java index a19c76d,94c7e34..028cf6c --- a/test/unit/org/apache/cassandra/db/ScrubTest.java +++ b/test/unit/org/apache/cassandra/db/ScrubTest.java @@@ -30,7 -30,10 +30,11 @@@ import java.util.Set import java.util.concurrent.ExecutionException; import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.db.compaction.OperationType; ++import org.apache.cassandra.db.composites.CellNameType; +import org.apache.cassandra.exceptions.ConfigurationException; + import org.apache.cassandra.db.marshal.CompositeType; + import org.apache.cassandra.db.marshal.LongType; + import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.exceptions.RequestExecutionException; import org.apache.cassandra.io.compress.CompressionMetadata; import org.apache.cassandra.utils.UUIDGen; @@@ -124,7 -123,7 +128,7 @@@ public class ScrubTest extends SchemaLo overrideWithGarbage(sstable, ByteBufferUtil.bytes("0"), ByteBufferUtil.bytes("1")); // with skipCorrupted == false, the scrub is expected to fail - Scrubber scrubber = new Scrubber(cfs, sstable, false, false); - Scrubber scrubber = new Scrubber(cfs, sstable, false, true); ++ Scrubber scrubber = new Scrubber(cfs, sstable, false, false, true); try { scrubber.scrub(); @@@ -134,9 -133,10 +138,9 @@@ // with skipCorrupted == true, the corrupt row will be skipped Scrubber.ScrubResult scrubResult; - scrubber = new Scrubber(cfs, sstable, true, false); - scrubber = new Scrubber(cfs, sstable, true, true); ++ scrubber = new Scrubber(cfs, sstable, true, false, true); scrubResult = scrubber.scrubWithResult(); scrubber.close(); - cfs.replaceCompactedSSTables(Collections.singletonList(sstable), Collections.singletonList(scrubber.getNewSSTable()), OperationType.SCRUB); assertNotNull(scrubResult); @@@ -182,7 -181,7 +186,7 @@@ overrideWithGarbage(sstable, ByteBufferUtil.bytes("0"), ByteBufferUtil.bytes("1")); // with skipCorrupted == false, the scrub is expected to fail - Scrubber scrubber = new Scrubber(cfs, sstable, false, false); - Scrubber scrubber = new Scrubber(cfs, sstable, false, true); ++ Scrubber scrubber = new Scrubber(cfs, sstable, false, false, true); try { scrubber.scrub(); @@@ -191,9 -190,10 +195,9 @@@ catch (IOError err) {} // with skipCorrupted == true, the corrupt row will be skipped - scrubber = new Scrubber(cfs, sstable, true, false); - scrubber = new Scrubber(cfs, sstable, true, true); ++ scrubber = new Scrubber(cfs, sstable, true, false, true); scrubber.scrub(); scrubber.close(); - cfs.replaceCompactedSSTables(Collections.singletonList(sstable), Collections.singletonList(scrubber.getNewSSTable()), OperationType.SCRUB); assertEquals(1, cfs.getSSTables().size()); // verify that we can read all of the rows, and there is now one less row @@@ -324,7 -324,7 +328,7 @@@ components.add(Component.TOC); SSTableReader sstable = SSTableReader.openNoValidation(desc, components, metadata); -- Scrubber scrubber = new Scrubber(cfs, sstable, false, true); ++ Scrubber scrubber = new Scrubber(cfs, sstable, false, true, true); scrubber.scrub(); cfs.loadNewSSTables(); @@@ -420,9 -420,19 +424,19 @@@ Keyspace keyspace = Keyspace.open("Keyspace1"); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("test_compact_static_columns"); - QueryProcessor.processInternal("INSERT INTO \"Keyspace1\".test_compact_static_columns (a, b, c, d) VALUES (123, c3db07e8-b602-11e3-bc6b-e0b9a54a6d93, true, 'foobar')"); + QueryProcessor.executeInternal("INSERT INTO \"Keyspace1\".test_compact_static_columns (a, b, c, d) VALUES (123, c3db07e8-b602-11e3-bc6b-e0b9a54a6d93, true, 'foobar')"); cfs.forceBlockingFlush(); - CompactionManager.instance.performScrub(cfs, false); + CompactionManager.instance.performScrub(cfs, false, true); + + QueryProcessor.process("CREATE TABLE \"Keyspace1\".test_scrub_validation (a text primary key, b int)", ConsistencyLevel.ONE); + ColumnFamilyStore cfs2 = keyspace.getColumnFamilyStore("test_scrub_validation"); - RowMutation mutation = new RowMutation("Keyspace1", UTF8Type.instance.decompose("key")); - CompositeType ct = (CompositeType) cfs2.getComparator(); - mutation.add("test_scrub_validation", ct.decompose("b"), LongType.instance.decompose(1L), System.currentTimeMillis()); ++ Mutation mutation = new Mutation("Keyspace1", UTF8Type.instance.decompose("key")); ++ CellNameType ct = cfs2.getComparator(); ++ mutation.add("test_scrub_validation", ct.makeCellName("b"), LongType.instance.decompose(1L), System.currentTimeMillis()); + mutation.apply(); + cfs2.forceBlockingFlush(); + + CompactionManager.instance.performScrub(cfs2, false, false); } /** @@@ -434,12 -444,12 +448,12 @@@ Keyspace keyspace = Keyspace.open("Keyspace1"); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("UUIDKeys"); - ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "UUIDKeys"); + ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "UUIDKeys"); cf.addColumn(column(CFMetaData.DEFAULT_KEY_ALIAS, "not a uuid", 1L)); - RowMutation rm = new RowMutation("Keyspace1", ByteBufferUtil.bytes(UUIDGen.getTimeUUID()), cf); - rm.applyUnsafe(); + Mutation mutation = new Mutation("Keyspace1", ByteBufferUtil.bytes(UUIDGen.getTimeUUID()), cf); + mutation.applyUnsafe(); cfs.forceBlockingFlush(); - CompactionManager.instance.performScrub(cfs, false); + CompactionManager.instance.performScrub(cfs, false, true); assertEquals(1, cfs.getSSTables().size()); } @@@ -456,14 -466,14 +470,14 @@@ Keyspace keyspace = Keyspace.open("Keyspace1"); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("test_compact_dynamic_columns"); - QueryProcessor.processInternal("INSERT INTO \"Keyspace1\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'a', 'foo')"); - QueryProcessor.processInternal("INSERT INTO \"Keyspace1\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'b', 'bar')"); - QueryProcessor.processInternal("INSERT INTO \"Keyspace1\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'c', 'boo')"); + QueryProcessor.executeInternal("INSERT INTO \"Keyspace1\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'a', 'foo')"); + QueryProcessor.executeInternal("INSERT INTO \"Keyspace1\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'b', 'bar')"); + QueryProcessor.executeInternal("INSERT INTO \"Keyspace1\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'c', 'boo')"); cfs.forceBlockingFlush(); - CompactionManager.instance.performScrub(cfs, true); + CompactionManager.instance.performScrub(cfs, true, true); // Scrub is silent, but it will remove broken records. So reading everything back to make sure nothing to "scrubbed away" - UntypedResultSet rs = QueryProcessor.processInternal("SELECT * FROM \"Keyspace1\".test_compact_dynamic_columns"); + UntypedResultSet rs = QueryProcessor.executeInternal("SELECT * FROM \"Keyspace1\".test_compact_dynamic_columns"); assertEquals(3, rs.size()); Iterator<UntypedResultSet.Row> iter = rs.iterator();