mirror of
https://git.proxmox.com/git/mirror_corosync
synced 2025-08-04 23:00:17 +00:00
Cpg join with undelivered leave message
Patch handles situation, when on one node, one process: - join cpg - do same actions - leave cpg - join cpg again Following sequence can (racy) end with broken process_info list. To solve this problem, one more check is done in message_handler_req_lib_cpg_join so if process_info with same pid and group as new join request exists, CPG_ERR_TRY_AGAIN is returned. git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2675 fd59a12c-fef9-0310-b244-a6a79926bd2f
This commit is contained in:
parent
ec09a97867
commit
7e8da9a6fc
@ -1067,6 +1067,21 @@ static void message_handler_req_lib_cpg_join (void *conn, const void *message)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Same check must be done in process info list, because there may be not yet delivered
|
||||
* leave of client.
|
||||
*/
|
||||
for (iter = process_info_list_head.next; iter != &process_info_list_head; iter = iter->next) {
|
||||
struct process_info *pi = list_entry (iter, struct process_info, list);
|
||||
|
||||
if (pi->nodeid == api->totem_nodeid_get () && pi->pid == req_lib_cpg_join->pid &&
|
||||
mar_name_compare(&req_lib_cpg_join->group_name, &pi->group) == 0) {
|
||||
/* We have same pid and group name joined -> return error */
|
||||
error = CPG_ERR_TRY_AGAIN;
|
||||
goto response_send;
|
||||
}
|
||||
}
|
||||
|
||||
switch (cpd->cpd_state) {
|
||||
case CPD_STATE_UNJOINED:
|
||||
error = CPG_OK;
|
||||
|
Loading…
Reference in New Issue
Block a user