mirror of https://github.com/apache/cassandra
Merge branch 'cassandra-3.0' into cassandra-3.11
This commit is contained in:
commit
0c1e1ccfad
|
|
@ -418,7 +418,7 @@
|
|||
</dependency>
|
||||
<dependency groupId="junit" artifactId="junit" version="4.12" />
|
||||
<dependency groupId="org.mockito" artifactId="mockito-core" version="3.2.4" />
|
||||
<dependency groupId="org.apache.cassandra" artifactId="dtest-api" version="0.0.7" />
|
||||
<dependency groupId="org.apache.cassandra" artifactId="dtest-api" version="0.0.8" />
|
||||
<dependency groupId="org.reflections" artifactId="reflections" version="0.9.12" />
|
||||
<dependency groupId="org.quicktheories" artifactId="quicktheories" version="0.25" />
|
||||
<dependency groupId="org.apache.rat" artifactId="apache-rat" version="0.10">
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
|||
*
|
||||
* <p>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");
|
||||
|
|
|
|||
|
|
@ -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<int, int>, PRIMARY KEY (pk))"));
|
||||
|
||||
ICoordinator coordinator = cluster.coordinator(1);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,6 @@ public class MigrateDropColumns22To311Test extends MigrateDropColumns
|
|||
{
|
||||
public MigrateDropColumns22To311Test()
|
||||
{
|
||||
super(Versions.Major.v22, Versions.Major.v3X);
|
||||
super(v22, v3X);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,6 @@ public class MigrateDropColumns30To311Test extends MigrateDropColumns
|
|||
{
|
||||
public MigrateDropColumns30To311Test()
|
||||
{
|
||||
super(Versions.Major.v30, Versions.Major.v3X);
|
||||
super(v30, v3X);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<text, text>, PRIMARY KEY (pk, ck));");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) -> {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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<Pair<Semver,Semver>> 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);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue