At high level, StorageService#setGossipTokens set the gossip state to NORMAL blindly. Therefore, re-enabling gossip (stop and start gossip) overrides the actual gossip state.
It could happen in the below scenario.
- Bootstrap failed. The gossip state remains in BOOT / JOINING and code execution exits StorageService#initServer.
- Operator runs nodetool to stop and re-start gossip. The gossip state gets flipped to NORMAL