[ https://issues.apache.org/jira/browse/CASSANDRA-19740?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
ConfX updated CASSANDRA-19740: ------------------------------ Description: h2. What happened In the Cassandra dtest framework, when {{newInstanceConfig()}} is explicitly called in the test code for generating a new instance configuration, it will throw an unexpected index out-of-bound exception when getting tokens from tokenSupplier. h2. How to reproduce Put the following test under cassandra/test/distributed/org/apache/cassandra/distributed/upgrade/, and build dtest jars. I'm using version pair [5.0-alpha1, 5.0-alpha2], and this failure happens also in older versions. {code:java} package org.apache.cassandra.distributed.upgrade; public class demoUpgradeTest extends UpgradeTestBase @Test public void demoTest() throws Throwable { new TestCase() .nodes(2) .nodesToUpgrade(1) .withConfig(config -> config.with(Feature.GOSSIP, Feature.NETWORK)) .upgradesToCurrentFrom(v3X) .setup((cluster) -> { // do nothing. }) .runAfterNodeUpgrade((cluster, node) -> { IInstanceConfig config = cluster.newInstanceConfig(); }).run(); } } {code} Run the test with {code:java} $ ant test-jvm-dtest-some-Duse.jdk11=true -Dtest.name=org.apache.cassandra.distributed.upgrade.demoUpgradeTest {code} You will see the following failure: {code:java} [junit-timeout] Testcase: demoUpgradeTest(org.apache.cassandra.distributed.upgrade.demoUpgradeTest)-_jdk11: FAILED [junit-timeout] Error in test '5.0-alpha2 -> [5.0-alpha2]' while upgrading to '5.0-alpha2'; successful upgrades [] [junit-timeout] junit.framework.AssertionFailedError: Error in test '5.0-alpha2 -> [5.0-alpha2]' while upgrading to '5.0-alpha2'; successful upgrades [] [junit-timeout] at org.apache.cassandra.distributed.upgrade.UpgradeTestBase$TestCase.run(UpgradeTestBase.java:442) [junit-timeout] at org.apache.cassandra.distributed.upgrade.demoUpgradeTest.demoTest(demoUpgradeTest.java:104) [junit-timeout] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [junit-timeout] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [junit-timeout] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [junit-timeout] Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2 [junit-timeout] at org.apache.cassandra.distributed.api.TokenSupplier.lambda$evenlyDistributedTokens$0(TokenSupplier.java:59) [junit-timeout] at org.apache.cassandra.distributed.impl.AbstractCluster.createInstanceConfig(AbstractCluster.java:589) [junit-timeout] at org.apache.cassandra.distributed.impl.AbstractCluster.newInstanceConfig(AbstractCluster.java:582) [junit-timeout] at org.apache.cassandra.distributed.upgrade.demoUpgradeTest.lambda$demoTest$2(demoUpgradeTest.java:103) [junit-timeout] at org.apache.cassandra.distributed.upgrade.UpgradeTestBase$TestCase.run(UpgradeTestBase.java:433) {code} The failure is caused by the code below in [AbstractCluster.java|https://github.com/apache/cassandra/blob/trunk/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java#L589] {code:java} public InstanceConfig newInstanceConfig() { return createInstanceConfig(size() + 1); // here in our example -> 2 + 1 } @VisibleForTesting InstanceConfig createInstanceConfig(int nodeNum) // nodeNum = 3 in the example { INodeProvisionStrategy provisionStrategy = nodeProvisionStrategy.create(subnet, portMap); Collection<String> tokens = tokenSupplier.tokens(nodeNum); // however, here, tokenSupplier only has 2 tokens; we are trying to get the index of 3, which triggers the out-of-bound exception. ... } {code} The code should carefully check the length of the tokenSupplier before actually fetching elements from it. was: h2. What happened In the Cassandra dtest framework, when {{newInstanceConfig()}} is explicitly called in the test code for generating a new instance configuration, it will throw an unexpected index out-of-bound exception when getting tokens from tokenSupplier. h2. How to reproduce Put the following test under cassandra/test/distributed/org/apache/cassandra/distributed/upgrade/, and build dtest jars. I'm using version pair [5.0-alpha1, 5.0-alpha2], and this failure happens also in older versions. {code:java} package org.apache.cassandra.distributed.upgrade; public class demoUpgradeTest extends UpgradeTestBase @Test public void demoTest() throws Throwable { new TestCase() .nodes(2) .nodesToUpgrade(1) .withConfig(config -> config.with(Feature.GOSSIP, Feature.NETWORK)) .upgradesToCurrentFrom(v3X) .setup((cluster) -> { // do nothing. }) .runAfterNodeUpgrade((cluster, node) -> { IInstanceConfig config = cluster.newInstanceConfig(); }).run(); } } {code} Run the test with {code:java} $ ant test-jvm-dtest-some-Duse.jdk11=true -Dtest.name=org.apache.cassandra.distributed.upgrade.demoUpgradeTest {code} You will see the following failure: {code:java} [junit-timeout] Testcase: demoUpgradeTest(org.apache.cassandra.distributed.upgrade.demoUpgradeTest)-_jdk11: FAILED [junit-timeout] Error in test '5.0-alpha2 -> [5.0-alpha2]' while upgrading to '5.0-alpha2'; successful upgrades [] [junit-timeout] junit.framework.AssertionFailedError: Error in test '5.0-alpha2 -> [5.0-alpha2]' while upgrading to '5.0-alpha2'; successful upgrades [] [junit-timeout] at org.apache.cassandra.distributed.upgrade.UpgradeTestBase$TestCase.run(UpgradeTestBase.java:442) [junit-timeout] at org.apache.cassandra.distributed.upgrade.demoUpgradeTest.demoTest(demoUpgradeTest.java:104) [junit-timeout] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [junit-timeout] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [junit-timeout] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [junit-timeout] Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2 [junit-timeout] at org.apache.cassandra.distributed.api.TokenSupplier.lambda$evenlyDistributedTokens$0(TokenSupplier.java:59) [junit-timeout] at org.apache.cassandra.distributed.impl.AbstractCluster.createInstanceConfig(AbstractCluster.java:589) [junit-timeout] at org.apache.cassandra.distributed.impl.AbstractCluster.newInstanceConfig(AbstractCluster.java:582) [junit-timeout] at org.apache.cassandra.distributed.upgrade.demoUpgradeTest.lambda$demoTest$2(demoUpgradeTest.java:103) [junit-timeout] at org.apache.cassandra.distributed.upgrade.UpgradeTestBase$TestCase.run(UpgradeTestBase.java:433) {code} The failure is caused by the code below in [AbstractCluster.java|https://github.com/apache/cassandra/blob/trunk/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java#L589] {code:java} public InstanceConfig newInstanceConfig() { return createInstanceConfig(size() + 1); // here in our example -> 2 + 1 } @VisibleForTesting InstanceConfig createInstanceConfig(int nodeNum) // nodeNum = 3 in the example { INodeProvisionStrategy provisionStrategy = nodeProvisionStrategy.create(subnet, portMap); Collection<String> tokens = tokenSupplier.tokens(nodeNum); // however, here, tokenSupplier only has 2 tokens; we are trying to get the index of 3, which triggers the out-of-bound exception. ... } {code} The code should carefully check the length of the tokenSupplier before actually fetching elements from it. > Cassandra Dtest AbstractCluster failed to create new instance config > -------------------------------------------------------------------- > > Key: CASSANDRA-19740 > URL: https://issues.apache.org/jira/browse/CASSANDRA-19740 > Project: Cassandra > Issue Type: Bug > Components: Test/dtest/java > Reporter: ConfX > Priority: Normal > > h2. What happened > In the Cassandra dtest framework, when {{newInstanceConfig()}} is explicitly > called in the test code for generating a new instance configuration, it will > throw an unexpected index out-of-bound exception when getting tokens from > tokenSupplier. > h2. How to reproduce > Put the following test under > cassandra/test/distributed/org/apache/cassandra/distributed/upgrade/, and > build dtest jars. I'm using version pair [5.0-alpha1, 5.0-alpha2], and this > failure happens also in older versions. > {code:java} > package org.apache.cassandra.distributed.upgrade; > public class demoUpgradeTest extends UpgradeTestBase > @Test > public void demoTest() throws Throwable > { > new TestCase() > .nodes(2) > .nodesToUpgrade(1) > .withConfig(config -> config.with(Feature.GOSSIP, > Feature.NETWORK)) > .upgradesToCurrentFrom(v3X) > .setup((cluster) -> { > // do nothing. > }) > .runAfterNodeUpgrade((cluster, node) -> { > IInstanceConfig config = cluster.newInstanceConfig(); > }).run(); > } > } {code} > Run the test with > {code:java} > $ ant test-jvm-dtest-some-Duse.jdk11=true > -Dtest.name=org.apache.cassandra.distributed.upgrade.demoUpgradeTest {code} > You will see the following failure: > {code:java} > [junit-timeout] Testcase: > demoUpgradeTest(org.apache.cassandra.distributed.upgrade.demoUpgradeTest)-_jdk11: > FAILED > [junit-timeout] Error in test '5.0-alpha2 -> [5.0-alpha2]' while upgrading to > '5.0-alpha2'; successful upgrades [] > [junit-timeout] junit.framework.AssertionFailedError: Error in test > '5.0-alpha2 -> [5.0-alpha2]' while upgrading to '5.0-alpha2'; successful > upgrades [] > [junit-timeout] at > org.apache.cassandra.distributed.upgrade.UpgradeTestBase$TestCase.run(UpgradeTestBase.java:442) > [junit-timeout] at > org.apache.cassandra.distributed.upgrade.demoUpgradeTest.demoTest(demoUpgradeTest.java:104) > [junit-timeout] at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > [junit-timeout] at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > [junit-timeout] at > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > [junit-timeout] Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 2 > out of bounds for length 2 > [junit-timeout] at > org.apache.cassandra.distributed.api.TokenSupplier.lambda$evenlyDistributedTokens$0(TokenSupplier.java:59) > [junit-timeout] at > org.apache.cassandra.distributed.impl.AbstractCluster.createInstanceConfig(AbstractCluster.java:589) > [junit-timeout] at > org.apache.cassandra.distributed.impl.AbstractCluster.newInstanceConfig(AbstractCluster.java:582) > [junit-timeout] at > org.apache.cassandra.distributed.upgrade.demoUpgradeTest.lambda$demoTest$2(demoUpgradeTest.java:103) > [junit-timeout] at > org.apache.cassandra.distributed.upgrade.UpgradeTestBase$TestCase.run(UpgradeTestBase.java:433) > {code} > The failure is caused by the code below in > [AbstractCluster.java|https://github.com/apache/cassandra/blob/trunk/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java#L589] > {code:java} > public InstanceConfig newInstanceConfig() > { > return createInstanceConfig(size() + 1); // here in our example > -> 2 + 1 > } @VisibleForTesting > InstanceConfig createInstanceConfig(int nodeNum) // nodeNum = 3 in the > example > { > INodeProvisionStrategy provisionStrategy = > nodeProvisionStrategy.create(subnet, portMap); > Collection<String> tokens = tokenSupplier.tokens(nodeNum); // > however, here, tokenSupplier only has 2 tokens; we are trying to get the > index of 3, which triggers the out-of-bound exception. > ... > } {code} > The code should carefully check the length of the tokenSupplier before > actually fetching elements from it. -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org