Isaac Reath created CASSANDRA-18999:
---------------------------------------
Summary: 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
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: [email protected]
For additional commands, e-mail: [email protected]