diff --git a/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java b/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java
index 2ded71c42a..b6b402bc4a 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java
@@ -19,10 +19,8 @@
package org.apache.cassandra.distributed.impl;
import java.io.File;
-import java.lang.reflect.Field;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
-import java.util.Arrays;
import java.util.Collections;
import java.util.EnumSet;
import java.util.Map;
@@ -30,15 +28,15 @@ import java.util.TreeMap;
import java.util.UUID;
import java.util.function.Function;
+import com.vdurmont.semver4j.Semver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.cassandra.config.YamlConfigurationLoader;
import org.apache.cassandra.distributed.api.Feature;
import org.apache.cassandra.distributed.api.IInstanceConfig;
import org.apache.cassandra.distributed.shared.NetworkTopology;
import org.apache.cassandra.distributed.shared.Shared;
-import org.apache.cassandra.distributed.shared.Versions;
+import org.apache.cassandra.distributed.upgrade.UpgradeTestBase;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.locator.SimpleSeedProvider;
@@ -266,15 +264,11 @@ public class InstanceConfig implements IInstanceConfig
return datadirs;
}
- public InstanceConfig forVersion(Versions.Major major)
+ public InstanceConfig forVersion(Semver version)
{
- switch (major)
- {
- case v4: return this;
- default: return new InstanceConfig(this)
+ return new InstanceConfig(this)
.set("seed_provider", new ParameterizedClass(SimpleSeedProvider.class.getName(),
Collections.singletonMap("seeds", "127.0.0.1")));
- }
}
public String toString()
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStorage2to3UpgradeTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStorage2to3UpgradeTest.java
index b0bbe6432f..7235c728d1 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStorage2to3UpgradeTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStorage2to3UpgradeTest.java
@@ -44,7 +44,7 @@ public class CompactStorage2to3UpgradeTest extends UpgradeTestBase
public void multiColumn() throws Throwable
{
new TestCase()
- .upgrade(Versions.Major.v22, Versions.Major.v3X)
+ .upgradesFrom(v22)
.setup(cluster -> {
assert cluster.size() == 3;
int rf = cluster.size() - 1;
@@ -78,7 +78,7 @@ public class CompactStorage2to3UpgradeTest extends UpgradeTestBase
public void singleColumn() throws Throwable
{
new TestCase()
- .upgrade(Versions.Major.v22, Versions.Major.v3X)
+ .upgradesFrom(v22)
.setup(cluster -> {
assert cluster.size() == 3;
int rf = cluster.size() - 1;
@@ -119,7 +119,7 @@ public class CompactStorage2to3UpgradeTest extends UpgradeTestBase
final ResultsRecorder recorder = new ResultsRecorder();
new TestCase()
.nodes(2)
- .upgrade(Versions.Major.v22, Versions.Major.v3X)
+ .upgradesFrom(v22)
.withConfig(config -> config.with(GOSSIP, NETWORK, NATIVE_PROTOCOL))
.setup(cluster -> {
cluster.schemaChange(String.format(
@@ -209,7 +209,7 @@ public class CompactStorage2to3UpgradeTest extends UpgradeTestBase
new TestCase()
.nodes(2)
- .upgrade(Versions.Major.v22, Versions.Major.v3X)
+ .upgradesFrom(v22)
.withConfig(config -> config.with(GOSSIP, NETWORK, NATIVE_PROTOCOL).set("enable_drop_compact_storage", true))
.setup(cluster -> {
cluster.schemaChange(String.format(
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/DropCompactStorageTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/DropCompactStorageTest.java
index ed763cc9c1..80ce02afe0 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/DropCompactStorageTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/DropCompactStorageTest.java
@@ -18,6 +18,7 @@
package org.apache.cassandra.distributed.upgrade;
+import com.vdurmont.semver4j.Semver;
import org.junit.Test;
import org.apache.cassandra.distributed.api.ConsistencyLevel;
@@ -34,7 +35,7 @@ public class DropCompactStorageTest extends UpgradeTestBase
@Test
public void dropCompactStorageBeforeUpgradesstablesTo3X() throws Throwable
{
- dropCompactStorageBeforeUpgradeSstables(Versions.Major.v3X);
+ dropCompactStorageBeforeUpgradeSstables(v3X);
}
/**
@@ -43,11 +44,11 @@ public class DropCompactStorageTest extends UpgradeTestBase
*
* This test reproduces the issue from CASSANDRA-15897.
*/
- public void dropCompactStorageBeforeUpgradeSstables(Versions.Major upgradeTo) throws Throwable
+ public void dropCompactStorageBeforeUpgradeSstables(Semver upgradeTo) throws Throwable
{
new TestCase()
.nodes(1)
- .upgrade(Versions.Major.v22, upgradeTo)
+ .singleUpgrade(v22, upgradeTo)
.withConfig(config -> config.with(GOSSIP, NETWORK, NATIVE_PROTOCOL).set("enable_drop_compact_storage", true))
.setup((cluster) -> {
cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (id int, ck int, v int, PRIMARY KEY (id, ck)) WITH COMPACT STORAGE");
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns.java
index dfa1884e36..4c94433156 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns.java
@@ -25,6 +25,7 @@ import java.util.Objects;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
+import com.vdurmont.semver4j.Semver;
import org.junit.Assert;
import org.junit.Test;
@@ -49,22 +50,25 @@ public abstract class MigrateDropColumns extends UpgradeTestBase
{
private static final MapType MAP_TYPE = MapType.getInstance(Int32Type.instance, Int32Type.instance, true);
- private final Versions.Major initial;
- private final Versions.Major[] upgrade;
+ private final Semver initial;
+ private final Semver[] upgrades;
- protected MigrateDropColumns(Versions.Major initial, Versions.Major... upgrade)
+ protected MigrateDropColumns(Semver initial, Semver... upgrade)
{
this.initial = Objects.requireNonNull(initial, "initial");
- this.upgrade = Objects.requireNonNull(upgrade, "upgrade");
+ this.upgrades = Objects.requireNonNull(upgrade, "upgrade");
}
@Test
public void dropColumns() throws Throwable
{
- new TestCase()
- .upgrade(initial, upgrade)
- .withConfig(c -> c.with(Feature.NATIVE_PROTOCOL))
- .setup(cluster -> {
+ TestCase testcase = new TestCase();
+ for (Semver upgrade : upgrades)
+ testcase = testcase.singleUpgrade(initial, upgrade);
+
+ testcase
+ .withConfig(c -> c.with(Feature.NATIVE_PROTOCOL))
+ .setup(cluster -> {
cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl(pk int, tables map, PRIMARY KEY (pk))"));
ICoordinator coordinator = cluster.coordinator(1);
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns22To30To311Test.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns22To30To311Test.java
index e68f97969f..2407dc5fa3 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns22To30To311Test.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns22To30To311Test.java
@@ -24,6 +24,6 @@ public class MigrateDropColumns22To30To311Test extends MigrateDropColumns
{
public MigrateDropColumns22To30To311Test()
{
- super(Versions.Major.v22, Versions.Major.v30, Versions.Major.v3X);
+ super(v22, v30, v3X);
}
}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns22To311Test.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns22To311Test.java
index 5de5458c7a..1235907ecd 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns22To311Test.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns22To311Test.java
@@ -24,6 +24,6 @@ public class MigrateDropColumns22To311Test extends MigrateDropColumns
{
public MigrateDropColumns22To311Test()
{
- super(Versions.Major.v22, Versions.Major.v3X);
+ super(v22, v3X);
}
}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns30To311Test.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns30To311Test.java
index 1ec460f210..4a19698bb1 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns30To311Test.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MigrateDropColumns30To311Test.java
@@ -24,6 +24,6 @@ public class MigrateDropColumns30To311Test extends MigrateDropColumns
{
public MigrateDropColumns30To311Test()
{
- super(Versions.Major.v30, Versions.Major.v3X);
+ super(v30, v3X);
}
}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeRangeTombstoneTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeRangeTombstoneTest.java
index e4b3a178b2..cd2c9f9f09 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeRangeTombstoneTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeRangeTombstoneTest.java
@@ -55,7 +55,7 @@ public class MixedModeRangeTombstoneTest extends UpgradeTestBase
new TestCase()
.nodes(2)
- .upgrade(Versions.Major.v22, Versions.Major.v30)
+ .singleUpgrade(v22, v30)
.setup(cluster -> {
cluster.schemaChange(schema);
cluster.coordinator(1).execute(format("DELETE FROM %s USING TIMESTAMP 1 WHERE k = 0 AND c1 = 'A'", tableName), ConsistencyLevel.ALL);
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadRepairTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadRepairTest.java
index e9391e0fa5..b8b648b009 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadRepairTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadRepairTest.java
@@ -38,7 +38,7 @@ public class MixedModeReadRepairTest extends UpgradeTestBase
{
new TestCase()
.nodes(2)
- .upgrade(Versions.Major.v22, Versions.Major.v30)
+ .singleUpgrade(v22, v30)
.setup((cluster) -> cluster.schemaChange("CREATE TABLE " + DistributedTestBase.KEYSPACE + ".tbl (pk ascii, b boolean, v blob, PRIMARY KEY (pk)) WITH COMPACT STORAGE"))
.runAfterNodeUpgrade((cluster, node) -> {
if (node != 1)
@@ -75,7 +75,7 @@ public class MixedModeReadRepairTest extends UpgradeTestBase
new TestCase()
.nodes(2)
- .upgrade(Versions.Major.v22, Versions.Major.v30)
+ .singleUpgrade(v22, v30)
.setup((cluster) ->
{
cluster.schemaChange("CREATE TABLE " + DistributedTestBase.KEYSPACE + ".tbl (pk int, ck int, v map, PRIMARY KEY (pk, ck));");
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadTest.java
index d908cd5099..756f894533 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadTest.java
@@ -37,7 +37,7 @@ public class MixedModeReadTest extends UpgradeTestBase
new TestCase()
.nodes(2)
.nodesToUpgrade(1)
- .upgrade(Versions.Major.v30, Versions.Major.v3X)
+ .singleUpgrade(v30, v3X)
.withConfig(config -> config.with(Feature.GOSSIP, Feature.NETWORK))
.setup(cluster -> {
cluster.schemaChange(CREATE_TABLE);
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/PagingTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/PagingTest.java
index 1af5856806..30e248d2b2 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/PagingTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/PagingTest.java
@@ -48,7 +48,7 @@ public class PagingTest extends UpgradeTestBase
{
new UpgradeTestBase.TestCase()
.nodes(2)
- .upgrade(Versions.Major.v22, Versions.Major.v30)
+ .upgrades(v22, v30)
.nodesToUpgrade(2)
.withConfig(config -> config.with(GOSSIP, NETWORK, NATIVE_PROTOCOL))
.setup((cluster) -> {
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java
index badfd3f0f2..0932eb1789 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java
@@ -37,7 +37,7 @@ public class UpgradeTest extends UpgradeTestBase
public void upgradeTest() throws Throwable
{
new TestCase()
- .upgrade(Versions.Major.v22, Versions.Major.v30, Versions.Major.v3X)
+ .upgradesFrom(v22)
.setup((cluster) -> {
cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
@@ -59,7 +59,7 @@ public class UpgradeTest extends UpgradeTestBase
public void mixedModePagingTest() throws Throwable
{
new TestCase()
- .upgrade(Versions.Major.v22, Versions.Major.v30)
+ .singleUpgrade(v22, v30)
.nodes(2)
.nodesToUpgrade(2)
.setup((cluster) -> {
@@ -88,26 +88,4 @@ public class UpgradeTest extends UpgradeTestBase
}).run();
}
- @Test
- public void simpleUpgradeWithNetworkAndGossipTest() throws Throwable
- {
- new TestCase()
- .nodes(2)
- .nodesToUpgrade(1)
- .withConfig((cfg) -> cfg.with(Feature.NETWORK, Feature.GOSSIP))
- .upgrade(Versions.Major.v3X, Versions.Major.v4)
- .setup((cluster) -> {
- cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
- cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, 1, 1)", ConsistencyLevel.ALL);
- })
- .runAfterNodeUpgrade((cluster, node) -> {
- for (int i : new int[]{ 1, 2 })
- {
- assertRows(cluster.coordinator(i).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = ?",
- ConsistencyLevel.ALL,
- 1),
- row(1, 1, 1));
- }
- }).run();
- }
}
\ No newline at end of file
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTestBase.java b/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTestBase.java
index 4c9dbab03f..6aa6f614d9 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTestBase.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTestBase.java
@@ -19,12 +19,16 @@
package org.apache.cassandra.distributed.upgrade;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
+import com.google.common.collect.ImmutableList;
+import com.vdurmont.semver4j.Semver;
+import com.vdurmont.semver4j.Semver.SemverType;
+
+import com.google.common.collect.ImmutableList;
import org.junit.After;
import org.junit.BeforeClass;
@@ -35,11 +39,13 @@ import org.apache.cassandra.distributed.api.IUpgradeableInstance;
import org.apache.cassandra.distributed.impl.Instance;
import org.apache.cassandra.distributed.shared.DistributedTestBase;
import org.apache.cassandra.distributed.shared.Versions;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.Pair;
-import static org.apache.cassandra.distributed.shared.Versions.Major;
import static org.apache.cassandra.distributed.shared.Versions.Version;
import static org.apache.cassandra.distributed.shared.Versions.find;
+
public class UpgradeTestBase extends DistributedTestBase
{
@After
@@ -71,12 +77,24 @@ public class UpgradeTestBase extends DistributedTestBase
public void run(UpgradeableCluster cluster, int node) throws Throwable;
}
+ public static final Semver v22 = new Semver("2.2.0-beta1", SemverType.LOOSE);
+ public static final Semver v30 = new Semver("3.0.0-alpha1", SemverType.LOOSE);
+ public static final Semver v3X = new Semver("3.11.0", SemverType.LOOSE);
+
+ protected static final List> SUPPORTED_UPGRADE_PATHS = ImmutableList.of(
+ Pair.create(v22, v30),
+ Pair.create(v22, v3X),
+ Pair.create(v30, v3X));
+
+ // the last is always the current
+ public static final Semver CURRENT = SUPPORTED_UPGRADE_PATHS.get(SUPPORTED_UPGRADE_PATHS.size() - 1).right;
+
public static class TestVersions
{
final Version initial;
- final Version[] upgrade;
+ final Version upgrade;
- public TestVersions(Version initial, Version ... upgrade)
+ public TestVersions(Version initial, Version upgrade)
{
this.initial = initial;
this.upgrade = upgrade;
@@ -111,18 +129,29 @@ public class UpgradeTestBase extends DistributedTestBase
return this;
}
- public TestCase upgrade(Major initial, Major ... upgrade)
+ /** performs all supported upgrade paths that exist in between from and CURRENT (inclusive) **/
+ public TestCase upgradesFrom(Semver from)
{
- this.upgrade.add(new TestVersions(versions.getLatest(initial),
- Arrays.stream(upgrade)
- .map(versions::getLatest)
- .toArray(Version[]::new)));
+ return upgrades(from, CURRENT);
+ }
+
+ /** performs all supported upgrade paths that exist in between from and to (inclusive) **/
+ public TestCase upgrades(Semver from, Semver to)
+ {
+ SUPPORTED_UPGRADE_PATHS.stream()
+ .filter(upgradePath -> (upgradePath.left.compareTo(from) >= 0 && upgradePath.right.compareTo(to) <= 0))
+ .forEachOrdered(upgradePath ->
+ {
+ this.upgrade.add(
+ new TestVersions(versions.getLatest(upgradePath.left), versions.getLatest(upgradePath.right)));
+ });
return this;
}
- public TestCase upgrade(Version initial, Version ... upgrade)
+ /** Will test this specific upgrade path **/
+ public TestCase singleUpgrade(Semver from, Semver to)
{
- this.upgrade.add(new TestVersions(initial, upgrade));
+ this.upgrade.add(new TestVersions(versions.getLatest(from), versions.getLatest(to)));
return this;
}
@@ -161,7 +190,7 @@ public class UpgradeTestBase extends DistributedTestBase
if (setup == null)
throw new AssertionError();
if (upgrade.isEmpty())
- throw new AssertionError();
+ throw new AssertionError("no upgrade paths have been specified (or exist)");
if (runAfterClusterUpgrade == null && runAfterNodeUpgrade == null)
throw new AssertionError();
if (runBeforeNodeRestart == null)
@@ -176,23 +205,21 @@ public class UpgradeTestBase extends DistributedTestBase
for (TestVersions upgrade : this.upgrade)
{
+ System.out.printf("testing upgrade from %s to %s%n", upgrade.initial.version, upgrade.upgrade.version);
try (UpgradeableCluster cluster = init(UpgradeableCluster.create(nodeCount, upgrade.initial, configConsumer)))
{
setup.run(cluster);
- for (Version version : upgrade.upgrade)
+ for (int n : nodesToUpgrade)
{
- for (int n=1; n<=nodesToUpgrade.size(); n++)
- {
- cluster.get(n).shutdown().get();
- cluster.get(n).setVersion(version);
- runBeforeNodeRestart.run(cluster, n);
- cluster.get(n).startup();
- runAfterNodeUpgrade.run(cluster, n);
- }
-
- runAfterClusterUpgrade.run(cluster);
+ cluster.get(n).shutdown().get();
+ cluster.get(n).setVersion(upgrade.upgrade);
+ runBeforeNodeRestart.run(cluster, n);
+ cluster.get(n).startup();
+ runAfterNodeUpgrade.run(cluster, n);
}
+
+ runAfterClusterUpgrade.run(cluster);
}
}
@@ -205,6 +232,13 @@ public class UpgradeTestBase extends DistributedTestBase
}
return this;
}
+ }
+
+ protected TestCase allUpgrades(int nodes, int... toUpgrade)
+ {
+ return new TestCase().nodes(nodes)
+ .upgradesFrom(v22)
+ .nodesToUpgrade(toUpgrade);
}
}
\ No newline at end of file