This is an automated email from the ASF dual-hosted git repository.
jmckenzie pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 51944c5e68 Make sure preview repairs don't optimise streams unless
configured to
51944c5e68 is described below
commit 51944c5e68bfcee0c2c8e2aeb6b572eae0167965
Author: Josh McKenzie <[email protected]>
AuthorDate: Wed Sep 7 13:12:22 2022 -0400
Make sure preview repairs don't optimise streams unless configured to
Patch by Chris Lohfink; reviewed by Josh McKenzie and Marcus Eriksson for
CASSANDRA-17865
Co-authored-by: Chris Lohfink <[email protected]>
Co-authored-by: Josh McKenzie <[email protected]>
---
CHANGES.txt | 1 +
.../cassandra/repair/messages/RepairOption.java | 20 +++----
.../repair/messages/RepairOptionTest.java | 67 ++++++++++++++++++++--
3 files changed, 73 insertions(+), 15 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index e4566fa723..9bf2063066 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
4.2
+ * Make sure preview repairs don't optimise streams unless configured to
(CASSANDRA-17865)
* Optionally avoid hint transfer during decommission (CASSANDRA-17808)
* Make disabling auto snapshot on selected tables possible (CASSANDRA-10383)
* Introduce compaction priorities to prevent upgrade compaction inability to
finish (CASSANDRA-17851)
diff --git a/src/java/org/apache/cassandra/repair/messages/RepairOption.java
b/src/java/org/apache/cassandra/repair/messages/RepairOption.java
index 6bb7fdb61f..f0508a3e42 100644
--- a/src/java/org/apache/cassandra/repair/messages/RepairOption.java
+++ b/src/java/org/apache/cassandra/repair/messages/RepairOption.java
@@ -395,22 +395,20 @@ public class RepairOption
public boolean optimiseStreams()
{
- if(optimiseStreams)
- return true;
-
- if (isPullRepair() || isForcedRepair())
+ if (isPullRepair())
return false;
- if (isIncremental() &&
DatabaseDescriptor.autoOptimiseIncRepairStreams())
- return true;
-
- if (isPreview() &&
DatabaseDescriptor.autoOptimisePreviewRepairStreams())
+ if (isPreview())
+ {
+ if (DatabaseDescriptor.autoOptimisePreviewRepairStreams())
+ return true;
+ }
+ else if (isIncremental() &&
DatabaseDescriptor.autoOptimiseIncRepairStreams())
return true;
-
- if (!isIncremental() &&
DatabaseDescriptor.autoOptimiseFullRepairStreams())
+ else if (!isIncremental() &&
DatabaseDescriptor.autoOptimiseFullRepairStreams())
return true;
- return false;
+ return optimiseStreams;
}
public boolean ignoreUnreplicatedKeyspaces()
diff --git
a/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java
b/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java
index a6ca084c28..0483fcf15c 100644
--- a/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java
+++ b/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java
@@ -23,7 +23,6 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-import org.junit.Assert;
import org.junit.Test;
import org.apache.cassandra.config.DatabaseDescriptor;
@@ -32,6 +31,7 @@ import org.apache.cassandra.dht.Murmur3Partitioner;
import org.apache.cassandra.dht.Range;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.repair.RepairParallelism;
+import org.apache.cassandra.streaming.PreviewKind;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -149,17 +149,76 @@ public class RepairOptionTest
// default value
option = RepairOption.parse(options, Murmur3Partitioner.instance);
- Assert.assertFalse(option.isForcedRepair());
+ assertFalse(option.isForcedRepair());
// explicit true
options.put(RepairOption.FORCE_REPAIR_KEY, "true");
option = RepairOption.parse(options, Murmur3Partitioner.instance);
- Assert.assertTrue(option.isForcedRepair());
+ assertTrue(option.isForcedRepair());
// explicit false
options.put(RepairOption.FORCE_REPAIR_KEY, "false");
option = RepairOption.parse(options, Murmur3Partitioner.instance);
- Assert.assertFalse(option.isForcedRepair());
+ assertFalse(option.isForcedRepair());
+ }
+
+ @Test
+ public void testOptimiseStreams()
+ {
+ boolean optFull = DatabaseDescriptor.autoOptimiseFullRepairStreams();
+ boolean optInc = DatabaseDescriptor.autoOptimiseIncRepairStreams();
+ boolean optPreview =
DatabaseDescriptor.autoOptimisePreviewRepairStreams();
+ try
+ {
+ for (PreviewKind previewKind : PreviewKind.values())
+ for (boolean inc : new boolean[] {true, false})
+ assertOptimise(previewKind, inc);
+ }
+ finally
+ {
+ setOptimise(optFull, optInc, optPreview);
+ }
+ }
+
+ private void assertHelper(Map<String, String> options, boolean full,
boolean inc, boolean preview, boolean expected)
+ {
+ setOptimise(full, inc, preview);
+ assertEquals(expected, RepairOption.parse(options,
Murmur3Partitioner.instance).optimiseStreams());
+ }
+
+ private void setOptimise(boolean full, boolean inc, boolean preview)
+ {
+ DatabaseDescriptor.setAutoOptimiseFullRepairStreams(full);
+ DatabaseDescriptor.setAutoOptimiseIncRepairStreams(inc);
+ DatabaseDescriptor.setAutoOptimisePreviewRepairStreams(preview);
+ }
+
+ private void assertOptimise(PreviewKind previewKind, boolean incremental)
+ {
+ Map<String, String> options = new HashMap<>();
+ options.put(RepairOption.PREVIEW, previewKind.toString());
+ options.put(RepairOption.INCREMENTAL_KEY,
Boolean.toString(incremental));
+ for (boolean a : new boolean[]{ true, false })
+ {
+ for (boolean b : new boolean[]{ true, false })
+ {
+ if (previewKind.isPreview())
+ {
+ assertHelper(options, a, b, true, true);
+ assertHelper(options, a, b, false, false);
+ }
+ else if (incremental)
+ {
+ assertHelper(options, a, true, b, true);
+ assertHelper(options, a, false, b, false);
+ }
+ else
+ {
+ assertHelper(options, true, a, b, true);
+ assertHelper(options, false, a, b, false);
+ }
+ }
+ }
}
private void
assertParseThrowsIllegalArgumentExceptionWithMessage(Map<String, String>
optionsToParse, String expectedErrorMessage)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]