[ 
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

Reply via email to