[ 
https://issues.apache.org/jira/browse/CASSANDRA-18999?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17798298#comment-17798298
 ] 

Paulo Motta commented on CASSANDRA-18999:
-----------------------------------------

{quote}I think we should keep some version of hasMajorVersion3Nodes still 
around, something like this:
{quote}
Where will this method be ever used if we're removing 
{{Gossiper::hasMajorVersion3Nodes}} and all references to it? There is no place 
in the code that requires checking if there are unknown nodes in gossip, except 
inside 
[upgradeFromVersionSupplier|https://github.com/apache/cassandra/blob/cassandra-5.0/src/java/org/apache/cassandra/gms/Gossiper.java#L219],
 where the check will be kept.


{quote}I just dont understand that when the original version was dealing with 
unknown versions and it could evaluate that method as returning true, then us 
removing the unknown check will change behavior in 5.0 as well.
{quote}
As far as I understand the objective of hasMajorVersion3Nodes methods is to 
*not* do things when a cluster node is identified to be in version 3.x. It was 
not possible to know if a node with unknown version was on 3.x or not, so 
hasMajorVersion3Nodes returned true if a node version was not known (since it 
could potentially be a 3.x nodes).

On 5.x we no longer need to identify if a node is on version 3.x since direct 
upgrade from 3.x is not supported, so there is no reason to keep 
hasMajorVersion3Nodes or hasUnknownNodes around.

> 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.x
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> 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-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to