diff --git a/build.xml b/build.xml index e40d62b918..a2a59d8d16 100644 --- a/build.xml +++ b/build.xml @@ -418,7 +418,7 @@ - + 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