ConfX created CASSANDRA-19740:
---------------------------------

             Summary: 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


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

Reply via email to