From a8e8a67306c0b26b8fe9c74a1fb00bacfa224cf7 Mon Sep 17 00:00:00 2001 From: Ariel Weisberg Date: Thu, 29 Oct 2015 12:36:32 -0400 Subject: [PATCH] Reject incremental repair requests combined with subrange repair Patch by Ariel Weisberg; reviewed by marcuse for CASSANDRA-10422 --- CHANGES.txt | 1 + src/java/org/apache/cassandra/service/StorageService.java | 3 +++ .../apache/cassandra/service/StorageServiceServerTest.java | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index 2eeda94721..b6b394acf6 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.1.12 + * Reject incremental repair with subrange repair (CASSANDRA-10422) * Add a nodetool command to refresh size_estimates (CASSANDRA-9579) * Shutdown compaction in drain to prevent leak (CASSANDRA-10079) * Invalidate cache after stream receive task is completed (CASSANDRA-10341) diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 665ce3a531..03c1960bd4 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -2830,6 +2830,9 @@ public class StorageService extends NotificationBroadcasterSupport implements IE public int forceRepairRangeAsync(String beginToken, String endToken, String keyspaceName, boolean isSequential, boolean isLocal, boolean fullRepair, String... columnFamilies) { + if (!fullRepair) + throw new IllegalArgumentException("Incremental repair can't be requested with subrange repair because " + + "each subrange repair would generate an anti-compacted table"); Collection> repairingRange = createRepairRangeFrom(beginToken, endToken); logger.info("starting user-requested repair of range {} for keyspace {} and column families {}", diff --git a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java index dd25b35641..564239b23b 100644 --- a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java +++ b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java @@ -508,4 +508,10 @@ public class StorageServiceServerTest repairRangeFrom = StorageService.instance.createRepairRangeFrom("2000", "2000"); assert repairRangeFrom.size() == 0; } + + @Test(expected=IllegalArgumentException.class) + public void testIncrementalRepairWithSubrangesThrows() throws Exception + { + StorageService.instance.forceRepairRangeAsync("", "", "", true, true, false, ""); + } }