Corosync is running on faulty (or rate limited) network
Message packets can be lost. This is no problem, because corosync is ready for lost/duplicate packets. If one message is lost for failed_to_recv times (configurable in config file), corosync will log "FAILED TO RECEIVE" and begin new round of membership algorithm. Very often (like 75% chance) is that corosync will segfault.
There is assert inside function which compare membership. Because packets may be lost in this, we can result in situation where: failed_list is same as membership_list. This is normally problem (and doesn't happen) and unspecified, so there is assert. But for FAILED TO RECEIVE case, we can ignore that assert, because right after calling this function, we will create single node membership anyway.