[
https://issues.apache.org/jira/browse/CASSANDRA-8138?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14178512#comment-14178512
]
Oleg Anastasyev commented on CASSANDRA-8138:
--------------------------------------------
This is because info about tokens, host id and DC:RACK of the dead node from
system tables are loaded only into TokenMetadata on startup, but not to
gossip's state. Loading code only calls Gossip.addSavedEndpoint(InetAddr) ,
which only adds an inet address of the dead node with generation 0.
If dead node did not participated in gossip since restart, there are no TOKENS,
HOST_ID, etc app states for it in EndpointState.
But replace_node, uses gossip shadow round to detect neccessary information
about dead node, so it can replace it. And all it can get from gossip - is just
its inet address. And actually there is a bug in Gossip.examineGossiper, which
prevents this info to be sent to a replacing node as well, so in fact replacing
node gets no information on this dead node at all, like it never existed
before.
I believe the same would apply to a bootrsrapping node, if there was full
cluster restart after some node gone dead and a new node is being added to a
cluster. And it would lead to wrong token metadata at freshly bootsrapped node
(did not tested this case, through).
> replace_address cannot find node to be replaced node after seed node restart
> ----------------------------------------------------------------------------
>
> Key: CASSANDRA-8138
> URL: https://issues.apache.org/jira/browse/CASSANDRA-8138
> Project: Cassandra
> Issue Type: Bug
> Reporter: Oleg Anastasyev
> Attachments: ReplaceAfterSeedRestart.txt
>
>
> If a node failed and a cluster was restarted (which is common case on massive
> outages), replace_address fails with
> {code}
> Caused by: java.lang.RuntimeException: Cannot replace_address /172.19.56.97
> because it doesn't exist in gossip
> jvm 1 | at
> org.apache.cassandra.service.StorageService.prepareReplacementInfo(StorageService.java:472)
> jvm 1 | at
> org.apache.cassandra.service.StorageService.joinTokenRing(StorageService.java:724)
> jvm 1 | at
> org.apache.cassandra.service.StorageService.initServer(StorageService.java:686)
> jvm 1 | at
> org.apache.cassandra.service.StorageService.initServer(StorageService.java:562)
> {code}
> Although neccessary information is saved in system tables on seed nodes, it
> is not loaded to gossip on seed node, so a replacement node cannot get this
> info.
> Attached patch loads all information from system tables to gossip with
> generation 0 and fixes some bugs around this info on shadow gossip round.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)