You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Isaac Reath (Jira)" <ji...@apache.org> on 2023/11/08 22:08:00 UTC

[jira] [Assigned] (CASSANDRA-18999) Gossiper::hasMajorVersion3Nodes returns true when a cluster is upgrading patch version without Cassandra 3 nodes.

     [ https://issues.apache.org/jira/browse/CASSANDRA-18999?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Isaac Reath reassigned CASSANDRA-18999:
---------------------------------------

    Assignee: Isaac Reath

> Gossiper::hasMajorVersion3Nodes returns true when a cluster is upgrading patch version without Cassandra 3 nodes.
> -----------------------------------------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-18999
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-18999
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Legacy/Distributed Metadata
>            Reporter: Isaac Reath
>            Assignee: Isaac Reath
>            Priority: Low
>              Labels: lhf
>             Fix For: 4.0.x, 4.1.x, 5.0-beta, 5.x
>
>
> When working on https://issues.apache.org/jira/browse/CASSANDRA-18968 we found that {{Gossiper::hasMajorVersion3Nodes}} will return true when the cluster is undergoing an upgrade from a patch version even if the cluster has no Cassandra 3 nodes in it.
> This can be reproduced by running this Gossiper test:
> {code:java}
>     @Test
>     public void testHasVersion3NodesShouldReturnFalseWhenNoVersion3NodesDetectedAndCassandra4UpgradeInProgress() throws Exception
>     {
>         Gossiper.instance.start(0);
>         Gossiper.instance.expireUpgradeFromVersion();
>         VersionedValue.VersionedValueFactory factory = new VersionedValue.VersionedValueFactory(null);
>         EndpointState es = new EndpointState((HeartBeatState) null);
>         es.addApplicationState(ApplicationState.RELEASE_VERSION, factory.releaseVersion(CURRENT_VERSION.toString()));
>         Gossiper.instance.endpointStateMap.put(InetAddressAndPort.getByName("127.0.0.1"), es);
>         Gossiper.instance.liveEndpoints.add(InetAddressAndPort.getByName("127.0.0.1"));
>         es = new EndpointState((HeartBeatState) null);
>         String previousPatchVersion = String.valueOf(CURRENT_VERSION.major) + '.' + (CURRENT_VERSION.minor) + '.' + (CURRENT_VERSION.patch - 1);
>         es.addApplicationState(ApplicationState.RELEASE_VERSION, factory.releaseVersion(previousPatchVersion));
>         Gossiper.instance.endpointStateMap.put(InetAddressAndPort.getByName("127.0.0.2"), es);
>         Gossiper.instance.liveEndpoints.add(InetAddressAndPort.getByName("127.0.0.2"));
>         assertFalse(Gossiper.instance.hasMajorVersion3Nodes());
>     }
> {code}
> This seems to be because of [https://github.com/apache/cassandra/blob/cassandra-4.1/src/java/org/apache/cassandra/gms/Gossiper.java#L2360], where an upgrade in progress is possible but we are not upgrading from a lower family version (i.e from 4.1.1 to 4.1.2).
> From the comment in this function, it seems instead of the existing check, we would want to iterate over all known endpoints in gossip and return true if any of them do not have a version (similar to [https://github.com/apache/cassandra/blob/cassandra-4.1/src/java/org/apache/cassandra/gms/Gossiper.java#L227-L236) |https://github.com/apache/cassandra/blob/cassandra-4.1/src/java/org/apache/cassandra/gms/Gossiper.java#L227-L236).]



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org