Chrissie, thanks for comments. I've included changes you've suggested (0x%x), changed comment and changed name of function (remove_zombie is just brilliant, thanks) and pushed into master. Thanks, Honza Christine Caulfield napsal(a): > ACK > > Maybe add the commit comment above the function (or something similar) > so it's clear why it is needed. Soemthing like: > > "Remove processes that might have left the group while we were > suspended". If you're going to keep the existing comment then "exists" > should be "exist" > > Suggested name for the function, errr ... > joinlist_remove_zombie_entries() ?? > > Chrissie > > On 17/02/14 16:45, Jan Friesse wrote: >> When node is paused and other nodes has in meantime exited cpg process, >> paused node after resume doesn't update it's membership correctly so on >> previously paused node exited cpg process is still visible. >> >> Solution is to compare join list with cpd and remove all pids which are >> not included in join list. >> >> Signed-off-by: Jan Friesse <jfriesse@xxxxxxxxxx> >> --- >> exec/cpg.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 files changed, 52 insertions(+), 0 deletions(-) >> >> diff --git a/exec/cpg.c b/exec/cpg.c >> index ff4b7e5..5b3ad9b 100644 >> --- a/exec/cpg.c >> +++ b/exec/cpg.c >> @@ -931,6 +931,56 @@ static void downlist_master_choose_and_send (void) >> qb_map_destroy(group_map); >> } >> >> +/* >> + * Remove process info which doesn't exists in received joinlist >> + */ >> +static void joinlist_gc_process_info (void) >> +{ >> + struct list_head *pi_iter; >> + struct list_head *jl_iter; >> + struct process_info *pi; >> + struct joinlist_msg *stored_msg; >> + int found; >> + >> + for (pi_iter = process_info_list_head.next; pi_iter != >> &process_info_list_head; ) { >> + pi = list_entry (pi_iter, struct process_info, list); >> + pi_iter = pi_iter->next; >> + >> + /* >> + * Ignore local node >> + */ >> + if (pi->nodeid == api->totem_nodeid_get()) { >> + continue ; >> + } >> + >> + /* >> + * Try to find message in joinlist messages >> + */ >> + found = 0; >> + for (jl_iter = joinlist_messages_head.next; >> + jl_iter != &joinlist_messages_head; >> + jl_iter = jl_iter->next) { >> + >> + stored_msg = list_entry(jl_iter, struct joinlist_msg, list); >> + >> + if (stored_msg->sender_nodeid == api->totem_nodeid_get()) { >> + continue ; >> + } >> + >> + if (pi->nodeid == stored_msg->sender_nodeid && >> + pi->pid == stored_msg->pid && >> + mar_name_compare (&pi->group, >> &stored_msg->group_name) == 0) { >> + found = 1; >> + break ; >> + } >> + } >> + >> + if (!found) { >> + do_proc_leave(&pi->group, pi->pid, pi->nodeid, >> CONFCHG_CPG_REASON_PROCDOWN); >> + } >> + } >> +} >> + >> static void joinlist_inform_clients (void) >> { >> struct joinlist_msg *stored_msg; >> @@ -957,6 +1007,8 @@ static void joinlist_inform_clients (void) >> do_proc_join (&stored_msg->group_name, stored_msg->pid, >> stored_msg->sender_nodeid, >> CONFCHG_CPG_REASON_NODEUP); >> } >> + >> + joinlist_gc_process_info (); >> } >> >> static void downlist_messages_delete (void) >> > > _______________________________________________ > discuss mailing list > discuss@xxxxxxxxxxxx > http://lists.corosync.org/mailman/listinfo/discuss _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss