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

Szymon Miezal commented on CASSANDRA-19580:
-------------------------------------------

I have tried the approach of putting the node into the shutdown state before 
the replacement starts, but it results in a node remaining in a DOWN state 
after the replacement finishes.

To work around it, we could first gossip about the shutdown status (which makes 
seed send their SYNs), and then, once the replacement is in progress, switch to 
a hibernate state. It would work only if in the time window between shutdown 
and hibernate states the seed sent his SYN message - potential race condition 
which doesn't sound good.

I have tried yet another approach. Namely, do not exclude hibernated nodes from 
unreachable gossip candidates. That seems to fix the stuck replacement as well. 
The question remains whether it has any other negative side effects. I have 
pushed the mentioned patch to 
[https://github.com/szymon-miezal/cassandra/commits/CASSANDRA-19580-4.0-alternative-approach/.|https://github.com/szymon-miezal/cassandra/commits/CASSANDRA-19580-4.0-alternative-approach/]
 Maybe we could run CI for it to double-check whether it breaks anything. I 
have run the replacement tests locally, and they seem to pass.

> Unable to contact any seeds with node in hibernate status
> ---------------------------------------------------------
>
>                 Key: CASSANDRA-19580
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-19580
>             Project: Apache Cassandra
>          Issue Type: Bug
>          Components: Cluster/Gossip
>            Reporter: Cameron Zemek
>            Priority: Normal
>             Fix For: 4.0.x, 4.1.x, 5.0.x, 5.x
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> We have customer running into the error 'Unable to contact any seeds!' . I 
> have been able to reproduce this issue if I kill Cassandra as its joining 
> which will put the node into hibernate status. Once a node is in hibernate it 
> will no longer receive any SYN messages from other nodes during startup and 
> as it sends only itself as digest in outbound SYN messages it never receives 
> any states in any of the ACK replies. So once it gets to the check 
> `seenAnySeed` in it fails as the endpointStateMap is empty.
>  
> A workaround is copying the system.peers table from other node but this is 
> less than ideal. I tested modifying maybeGossipToSeed as follows:
> {code:java}
>     /* Possibly gossip to a seed for facilitating partition healing */
>     private void maybeGossipToSeed(MessageOut<GossipDigestSyn> prod)
>     {
>         int size = seeds.size();
>         if (size > 0)
>         {
>             if (size == 1 && 
> seeds.contains(FBUtilities.getBroadcastAddress()))
>             {
>                 return;
>             }
>             if (liveEndpoints.size() == 0)
>             {
>                 List<GossipDigest> gDigests = prod.payload.gDigests;
>                 if (gDigests.size() == 1 && 
> gDigests.get(0).endpoint.equals(FBUtilities.getBroadcastAddress()))
>                 {
>                     gDigests = new ArrayList<GossipDigest>();
>                     GossipDigestSyn digestSynMessage = new 
> GossipDigestSyn(DatabaseDescriptor.getClusterName(),
>                                                                            
> DatabaseDescriptor.getPartitionerName(),
>                                                                            
> gDigests);
>                     MessageOut<GossipDigestSyn> message = new 
> MessageOut<GossipDigestSyn>(MessagingService.Verb.GOSSIP_DIGEST_SYN,
>                                                                               
>             digestSynMessage,
>                                                                               
>             GossipDigestSyn.serializer);
>                     sendGossip(message, seeds);
>                 }
>                 else
>                 {
>                     sendGossip(prod, seeds);
>                 }
>             }
>             else
>             {
>                 /* Gossip with the seed with some probability. */
>                 double probability = seeds.size() / (double) 
> (liveEndpoints.size() + unreachableEndpoints.size());
>                 double randDbl = random.nextDouble();
>                 if (randDbl <= probability)
>                     sendGossip(prod, seeds);
>             }
>         }
>     }
>  {code}
> Only problem is this is the same as SYN from shadow round. It does resolve 
> the issue however as then receive an ACK with all the states.



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

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to