Details
-
Bug
-
Status: Resolved
-
Low
-
Resolution: Fixed
-
Correctness - Transient Incorrect Response
-
Low
-
Low Hanging Fruit
-
Code Inspection
-
All
-
None
-
Description
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:
@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()); }
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)
Attachments
Issue Links
- Discovered while testing
-
CASSANDRA-18968 StartupClusterConnectivityChecker fails on upgrade from 3.X
- Resolved
- is related to
-
CASSANDRA-19243 Remove pre-4.0 compatibility code for 5.0
- Triage Needed
- links to