Return-Path: X-Original-To: apmail-cassandra-commits-archive@www.apache.org Delivered-To: apmail-cassandra-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id CC26418982 for ; Tue, 19 May 2015 14:00:52 +0000 (UTC) Received: (qmail 23554 invoked by uid 500); 19 May 2015 14:00:52 -0000 Delivered-To: apmail-cassandra-commits-archive@cassandra.apache.org Received: (qmail 23521 invoked by uid 500); 19 May 2015 14:00:52 -0000 Mailing-List: contact commits-help@cassandra.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cassandra.apache.org Delivered-To: mailing list commits@cassandra.apache.org Received: (qmail 23242 invoked by uid 99); 19 May 2015 14:00:52 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 19 May 2015 14:00:52 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 5B590E2F6F; Tue, 19 May 2015 14:00:52 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: yukim@apache.org To: commits@cassandra.apache.org Date: Tue, 19 May 2015 14:00:53 -0000 Message-Id: In-Reply-To: <659f38df164243b8aaea6840b1f170ee@git.apache.org> References: <659f38df164243b8aaea6840b1f170ee@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [02/16] cassandra git commit: Add option to not validate atoms during scrub Add option to not validate atoms during scrub patch by Jordan West; reviewed by yukim for CASSANDRA-9406 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/be9eff57 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/be9eff57 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/be9eff57 Branch: refs/heads/cassandra-2.1 Commit: be9eff573342cd4993eb4fc8ee694dc885e8a8e4 Parents: 37d81b9 Author: Jordan West Authored: Tue May 19 08:26:27 2015 -0500 Committer: Yuki Morishita Committed: Tue May 19 08:26:27 2015 -0500 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../apache/cassandra/db/ColumnFamilyStore.java | 4 +-- .../db/compaction/CompactionManager.java | 12 +++---- .../cassandra/db/compaction/Scrubber.java | 12 ++++--- .../cassandra/service/StorageService.java | 7 +++- .../cassandra/service/StorageServiceMBean.java | 2 ++ .../org/apache/cassandra/tools/NodeCmd.java | 5 ++- .../org/apache/cassandra/tools/NodeProbe.java | 4 +-- .../cassandra/tools/StandaloneScrubber.java | 6 +++- .../unit/org/apache/cassandra/db/ScrubTest.java | 37 +++++++++++++------- 10 files changed, 60 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/be9eff57/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index a9d04d6..cf124b4 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -3,6 +3,7 @@ * Clone SliceQueryFilter in AbstractReadCommand implementations (CASSANDRA-8940) * Push correct protocol notification for DROP INDEX (CASSANDRA-9310) * token-generator - generated tokens too long (CASSANDRA-9300) + * Add option not to validate atoms during scrub (CASSANDRA-9406) 2.0.15: http://git-wip-us.apache.org/repos/asf/cassandra/blob/be9eff57/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 5ea1287..eec4044 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -1122,12 +1122,12 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean CompactionManager.instance.performCleanup(ColumnFamilyStore.this, renewer); } - public void scrub(boolean disableSnapshot, boolean skipCorrupted) throws ExecutionException, InterruptedException + public void scrub(boolean disableSnapshot, boolean skipCorrupted, boolean checkData) throws ExecutionException, InterruptedException { // skip snapshot creation during scrub, SEE JIRA 5891 if(!disableSnapshot) snapshotWithoutFlush("pre-scrub-" + System.currentTimeMillis()); - CompactionManager.instance.performScrub(ColumnFamilyStore.this, skipCorrupted); + CompactionManager.instance.performScrub(ColumnFamilyStore.this, skipCorrupted, checkData); } public void sstablesRewrite(boolean excludeCurrentVersion) throws ExecutionException, InterruptedException http://git-wip-us.apache.org/repos/asf/cassandra/blob/be9eff57/src/java/org/apache/cassandra/db/compaction/CompactionManager.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 0978ae6..207b90d 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -234,13 +234,13 @@ public class CompactionManager implements CompactionManagerMBean executor.submit(runnable).get(); } - public void performScrub(ColumnFamilyStore cfStore, final boolean skipCorrupted) throws InterruptedException, ExecutionException + public void performScrub(ColumnFamilyStore cfStore, final boolean skipCorrupted, final boolean checkData) throws InterruptedException, ExecutionException { performAllSSTableOperation(cfStore, new AllSSTablesOperation() { public void perform(ColumnFamilyStore store, Iterable sstables) throws IOException { - doScrub(store, sstables, skipCorrupted); + doScrub(store, sstables, skipCorrupted, checkData); } }); } @@ -432,16 +432,16 @@ public class CompactionManager implements CompactionManagerMBean * * @throws IOException */ - private void doScrub(ColumnFamilyStore cfs, Iterable sstables, boolean skipCorrupted) throws IOException + private void doScrub(ColumnFamilyStore cfs, Iterable sstables, boolean skipCorrupted, boolean checkData) throws IOException { assert !cfs.isIndex(); for (final SSTableReader sstable : sstables) - scrubOne(cfs, sstable, skipCorrupted); + scrubOne(cfs, sstable, skipCorrupted, checkData); } - private void scrubOne(ColumnFamilyStore cfs, SSTableReader sstable, boolean skipCorrupted) throws IOException + private void scrubOne(ColumnFamilyStore cfs, SSTableReader sstable, boolean skipCorrupted, boolean checkData) throws IOException { - Scrubber scrubber = new Scrubber(cfs, sstable, skipCorrupted); + Scrubber scrubber = new Scrubber(cfs, sstable, skipCorrupted, checkData); CompactionInfo.Holder scrubInfo = scrubber.getScrubInfo(); metrics.beginCompaction(scrubInfo); http://git-wip-us.apache.org/repos/asf/cassandra/blob/be9eff57/src/java/org/apache/cassandra/db/compaction/Scrubber.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/Scrubber.java b/src/java/org/apache/cassandra/db/compaction/Scrubber.java index f04df27..e5bcd25 100644 --- a/src/java/org/apache/cassandra/db/compaction/Scrubber.java +++ b/src/java/org/apache/cassandra/db/compaction/Scrubber.java @@ -37,6 +37,7 @@ public class Scrubber implements Closeable public final SSTableReader sstable; public final File destination; public final boolean skipCorrupted; + public final boolean validateColumns; private final CompactionController controller; private final boolean isCommutative; @@ -70,17 +71,18 @@ public class Scrubber implements Closeable }; private final SortedSet outOfOrderRows = new TreeSet<>(rowComparator); - public Scrubber(ColumnFamilyStore cfs, SSTableReader sstable, boolean skipCorrupted) throws IOException + public Scrubber(ColumnFamilyStore cfs, SSTableReader sstable, boolean skipCorrupted, boolean checkData) throws IOException { - this(cfs, sstable, skipCorrupted, new OutputHandler.LogOutput(), false); + this(cfs, sstable, skipCorrupted, checkData, new OutputHandler.LogOutput(), false); } - public Scrubber(ColumnFamilyStore cfs, SSTableReader sstable, boolean skipCorrupted, OutputHandler outputHandler, boolean isOffline) throws IOException + public Scrubber(ColumnFamilyStore cfs, SSTableReader sstable, boolean skipCorrupted, boolean checkData, OutputHandler outputHandler, boolean isOffline) throws IOException { this.cfs = cfs; this.sstable = sstable; this.outputHandler = outputHandler; this.skipCorrupted = skipCorrupted; + this.validateColumns = checkData; List toScrub = Collections.singletonList(sstable); @@ -202,7 +204,7 @@ public class Scrubber implements Closeable if (dataSize != dataSizeFromIndex) outputHandler.warn(String.format("Data file row size %d differs from index file row size %d", dataSize, dataSizeFromIndex)); - SSTableIdentityIterator atoms = new SSTableIdentityIterator(sstable, dataFile, key, dataSize, true); + SSTableIdentityIterator atoms = new SSTableIdentityIterator(sstable, dataFile, key, dataSize, validateColumns); if (prevKey != null && prevKey.compareTo(key) > 0) { saveOutOfOrderRow(prevKey, key, atoms); @@ -233,7 +235,7 @@ public class Scrubber implements Closeable { dataFile.seek(dataStartFromIndex); - SSTableIdentityIterator atoms = new SSTableIdentityIterator(sstable, dataFile, key, dataSize, true); + SSTableIdentityIterator atoms = new SSTableIdentityIterator(sstable, dataFile, key, dataSize, validateColumns); if (prevKey != null && prevKey.compareTo(key) > 0) { saveOutOfOrderRow(prevKey, key, atoms); http://git-wip-us.apache.org/repos/asf/cassandra/blob/be9eff57/src/java/org/apache/cassandra/service/StorageService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 077413f..62b0c75 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -2188,8 +2188,13 @@ public class StorageService extends NotificationBroadcasterSupport implements IE public void scrub(boolean disableSnapshot, boolean skipCorrupted, String keyspaceName, String... columnFamilies) throws IOException, ExecutionException, InterruptedException { + scrub(disableSnapshot, skipCorrupted, true, keyspaceName, columnFamilies); + } + + public void scrub(boolean disableSnapshot, boolean skipCorrupted, boolean checkData, String keyspaceName, String... columnFamilies) throws IOException, ExecutionException, InterruptedException + { for (ColumnFamilyStore cfStore : getValidColumnFamilies(false, false, keyspaceName, columnFamilies)) - cfStore.scrub(disableSnapshot, skipCorrupted); + cfStore.scrub(disableSnapshot, skipCorrupted, checkData); } public void upgradeSSTables(String keyspaceName, boolean excludeCurrentVersion, String... columnFamilies) throws IOException, ExecutionException, InterruptedException http://git-wip-us.apache.org/repos/asf/cassandra/blob/be9eff57/src/java/org/apache/cassandra/service/StorageServiceMBean.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java index 10d17fd..57780a3 100644 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@ -231,7 +231,9 @@ public interface StorageServiceMBean extends NotificationEmitter * * Scrubbed CFs will be snapshotted first, if disableSnapshot is false */ + @Deprecated public void scrub(boolean disableSnapshot, boolean skipCorrupted, String keyspaceName, String... columnFamilies) throws IOException, ExecutionException, InterruptedException; + public void scrub(boolean disableSnapshot, boolean skipCorrupted, boolean checkData, String keyspaceName, String... columnFamilies) throws IOException, ExecutionException, InterruptedException; /** * Rewrite all sstables to the latest version. http://git-wip-us.apache.org/repos/asf/cassandra/blob/be9eff57/src/java/org/apache/cassandra/tools/NodeCmd.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/NodeCmd.java b/src/java/org/apache/cassandra/tools/NodeCmd.java index bc5410f..b006d69 100644 --- a/src/java/org/apache/cassandra/tools/NodeCmd.java +++ b/src/java/org/apache/cassandra/tools/NodeCmd.java @@ -83,6 +83,7 @@ public class NodeCmd private static final Pair CFSTATS_IGNORE_OPT = Pair.create("i", "ignore"); private static final Pair RESOLVE_IP = Pair.create("r", "resolve-ip"); private static final Pair SCRUB_SKIP_CORRUPTED_OPT = Pair.create("s", "skip-corrupted"); + private static final Pair SCRUB_NO_VALIDATE = Pair.create("nv", "no-validate"); private static final Pair COMPACT_OPT = Pair.create("c", "compact"); private static final String DEFAULT_HOST = "127.0.0.1"; @@ -114,6 +115,7 @@ public class NodeCmd options.addOption(CFSTATS_IGNORE_OPT, false, "ignore the supplied list of keyspace.columnfamiles in statistics"); options.addOption(RESOLVE_IP, false, "show node domain names instead of IPs"); options.addOption(SCRUB_SKIP_CORRUPTED_OPT, false, "when scrubbing counter tables, skip corrupted rows"); + options.addOption(SCRUB_NO_VALIDATE, false, "when scrubbing do not validate columns using column validator"); options.addOption(COMPACT_OPT, false, "print histograms in a more compact format"); } @@ -1788,7 +1790,8 @@ public class NodeCmd case SCRUB : boolean disableSnapshot = cmd.hasOption(NO_SNAPSHOT.left); boolean skipCorrupted = cmd.hasOption(SCRUB_SKIP_CORRUPTED_OPT.left); - try { probe.scrub(disableSnapshot, skipCorrupted, keyspace, columnFamilies); } + boolean checkData = !cmd.hasOption(SCRUB_NO_VALIDATE.left); + try { probe.scrub(disableSnapshot, skipCorrupted, checkData, keyspace, columnFamilies); } catch (ExecutionException ee) { err(ee, "Error occurred while scrubbing keyspace " + keyspace); } break; case UPGRADESSTABLES : http://git-wip-us.apache.org/repos/asf/cassandra/blob/be9eff57/src/java/org/apache/cassandra/tools/NodeProbe.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index d66d12d..e8e087f 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -191,9 +191,9 @@ public class NodeProbe ssProxy.forceKeyspaceCleanup(keyspaceName, columnFamilies); } - public void scrub(boolean disableSnapshot, boolean skipCorrupted, String keyspaceName, String... columnFamilies) throws IOException, ExecutionException, InterruptedException + public void scrub(boolean disableSnapshot, boolean skipCorrupted, boolean checkData, String keyspaceName, String... columnFamilies) throws IOException, ExecutionException, InterruptedException { - ssProxy.scrub(disableSnapshot, skipCorrupted, keyspaceName, columnFamilies); + ssProxy.scrub(disableSnapshot, skipCorrupted, checkData, keyspaceName, columnFamilies); } public void upgradeSSTables(String keyspaceName, boolean excludeCurrentVersion, String... columnFamilies) throws IOException, ExecutionException, InterruptedException http://git-wip-us.apache.org/repos/asf/cassandra/blob/be9eff57/src/java/org/apache/cassandra/tools/StandaloneScrubber.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java index 81dfdc3..26768f3 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java +++ b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java @@ -50,6 +50,7 @@ public class StandaloneScrubber private static final String HELP_OPTION = "help"; private static final String MANIFEST_CHECK_OPTION = "manifest-check"; private static final String SKIP_CORRUPTED_OPTION = "skip-corrupted"; + private static final String NO_VALIDATE_OPTION = "no-validate"; public static void main(String args[]) { @@ -120,7 +121,7 @@ public class StandaloneScrubber { try { - Scrubber scrubber = new Scrubber(cfs, sstable, options.skipCorrupted, handler, true); + Scrubber scrubber = new Scrubber(cfs, sstable, options.skipCorrupted, !options.noValidate, handler, true); try { scrubber.scrub(); @@ -185,6 +186,7 @@ public class StandaloneScrubber public boolean verbose; public boolean manifestCheckOnly; public boolean skipCorrupted; + public boolean noValidate; private Options(String keyspaceName, String cfName) { @@ -224,6 +226,7 @@ public class StandaloneScrubber opts.verbose = cmd.hasOption(VERBOSE_OPTION); opts.manifestCheckOnly = cmd.hasOption(MANIFEST_CHECK_OPTION); opts.skipCorrupted = cmd.hasOption(SKIP_CORRUPTED_OPTION); + opts.noValidate = cmd.hasOption(NO_VALIDATE_OPTION); return opts; } @@ -249,6 +252,7 @@ public class StandaloneScrubber options.addOption("h", HELP_OPTION, "display this help message"); options.addOption("m", MANIFEST_CHECK_OPTION, "only check and repair the leveled manifest, without actually scrubbing the sstables"); options.addOption("s", SKIP_CORRUPTED_OPTION, "skip corrupt rows in counter tables"); + options.addOption("n", NO_VALIDATE_OPTION, "do not validate columns using column validator"); return options; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/be9eff57/test/unit/org/apache/cassandra/db/ScrubTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/db/ScrubTest.java b/test/unit/org/apache/cassandra/db/ScrubTest.java index 08237a4..94c7e34 100644 --- a/test/unit/org/apache/cassandra/db/ScrubTest.java +++ b/test/unit/org/apache/cassandra/db/ScrubTest.java @@ -31,6 +31,9 @@ import java.util.concurrent.ExecutionException; import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.db.compaction.OperationType; +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; @@ -89,7 +92,7 @@ public class ScrubTest extends SchemaLoader rows = cfs.getRangeSlice(Util.range("", ""), null, new IdentityQueryFilter(), 1000); assertEquals(1, rows.size()); - CompactionManager.instance.performScrub(cfs, false); + CompactionManager.instance.performScrub(cfs, false, true); // check data is still there rows = cfs.getRangeSlice(Util.range("", ""), null, new IdentityQueryFilter(), 1000); @@ -120,7 +123,7 @@ public class ScrubTest extends SchemaLoader overrideWithGarbage(sstable, ByteBufferUtil.bytes("0"), ByteBufferUtil.bytes("1")); // with skipCorrupted == false, the scrub is expected to fail - Scrubber scrubber = new Scrubber(cfs, sstable, false); + Scrubber scrubber = new Scrubber(cfs, sstable, false, true); try { scrubber.scrub(); @@ -130,7 +133,7 @@ public class ScrubTest extends SchemaLoader // with skipCorrupted == true, the corrupt row will be skipped Scrubber.ScrubResult scrubResult; - scrubber = new Scrubber(cfs, sstable, true); + scrubber = new Scrubber(cfs, sstable, true, true); scrubResult = scrubber.scrubWithResult(); scrubber.close(); cfs.replaceCompactedSSTables(Collections.singletonList(sstable), Collections.singletonList(scrubber.getNewSSTable()), OperationType.SCRUB); @@ -178,7 +181,7 @@ public class ScrubTest extends SchemaLoader overrideWithGarbage(sstable, ByteBufferUtil.bytes("0"), ByteBufferUtil.bytes("1")); // with skipCorrupted == false, the scrub is expected to fail - Scrubber scrubber = new Scrubber(cfs, sstable, false); + Scrubber scrubber = new Scrubber(cfs, sstable, false, true); try { scrubber.scrub(); @@ -187,7 +190,7 @@ public class ScrubTest extends SchemaLoader catch (IOError err) {} // with skipCorrupted == true, the corrupt row will be skipped - scrubber = new Scrubber(cfs, sstable, true); + scrubber = new Scrubber(cfs, sstable, true, true); scrubber.scrub(); scrubber.close(); cfs.replaceCompactedSSTables(Collections.singletonList(sstable), Collections.singletonList(scrubber.getNewSSTable()), OperationType.SCRUB); @@ -219,7 +222,7 @@ public class ScrubTest extends SchemaLoader SSTableReader sstable = cfs.getSSTables().iterator().next(); overrideWithGarbage(sstable, 0, 2); - CompactionManager.instance.performScrub(cfs, false); + CompactionManager.instance.performScrub(cfs, false, true); // check data is still there rows = cfs.getRangeSlice(Util.range("", ""), null, new IdentityQueryFilter(), 1000); @@ -240,7 +243,7 @@ public class ScrubTest extends SchemaLoader rm.applyUnsafe(); cfs.forceBlockingFlush(); - CompactionManager.instance.performScrub(cfs, false); + CompactionManager.instance.performScrub(cfs, false, true); assert cfs.getSSTables().isEmpty(); } @@ -259,7 +262,7 @@ public class ScrubTest extends SchemaLoader rows = cfs.getRangeSlice(Util.range("", ""), null, new IdentityQueryFilter(), 1000); assertEquals(10, rows.size()); - CompactionManager.instance.performScrub(cfs, false); + CompactionManager.instance.performScrub(cfs, false, true); // check data is still there rows = cfs.getRangeSlice(Util.range("", ""), null, new IdentityQueryFilter(), 1000); @@ -321,7 +324,7 @@ public class ScrubTest extends SchemaLoader components.add(Component.TOC); SSTableReader sstable = SSTableReader.openNoValidation(desc, components, metadata); - Scrubber scrubber = new Scrubber(cfs, sstable, false); + Scrubber scrubber = new Scrubber(cfs, sstable, false, true); scrubber.scrub(); cfs.loadNewSSTables(); @@ -419,7 +422,17 @@ public class ScrubTest extends SchemaLoader QueryProcessor.processInternal("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.apply(); + cfs2.forceBlockingFlush(); + + CompactionManager.instance.performScrub(cfs2, false, false); } /** @@ -436,7 +449,7 @@ public class ScrubTest extends SchemaLoader RowMutation rm = new RowMutation("Keyspace1", ByteBufferUtil.bytes(UUIDGen.getTimeUUID()), cf); rm.applyUnsafe(); cfs.forceBlockingFlush(); - CompactionManager.instance.performScrub(cfs, false); + CompactionManager.instance.performScrub(cfs, false, true); assertEquals(1, cfs.getSSTables().size()); } @@ -457,7 +470,7 @@ public class ScrubTest extends SchemaLoader 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')"); 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");