From 32451a4dd02bdd95ec800d51267d2e6be43914a4 Mon Sep 17 00:00:00 2001 From: Vijay Bellur Date: Wed, 14 Jul 2010 00:20:28 +0000 Subject: Fixes a crash seen in create volume Also includes some re-factoring changes. Signed-off-by: Vijay Bellur Signed-off-by: Anand V. Avati BUG: 1063 (gluster volume create command segfaults) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1063 --- xlators/mgmt/glusterd/src/glusterd-sm.c | 80 +++++++++++++++++---------------- 1 file changed, 41 insertions(+), 39 deletions(-) (limited to 'xlators/mgmt/glusterd/src/glusterd-sm.c') diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.c b/xlators/mgmt/glusterd/src/glusterd-sm.c index b55fdd5678a..ba9c75872c0 100644 --- a/xlators/mgmt/glusterd/src/glusterd-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-sm.c @@ -430,9 +430,9 @@ glusterd_sm_t *glusterd_friend_state_table [] = { glusterd_state_req_sent, glusterd_state_req_rcvd, glusterd_state_befriended, + glusterd_state_req_accepted, glusterd_state_req_sent_rcvd, glusterd_state_rejected, - glusterd_state_req_accepted, glusterd_state_unfriend_sent, }; @@ -481,54 +481,56 @@ glusterd_friend_sm () glusterd_peerinfo_t *peerinfo = NULL; glusterd_friend_sm_event_type_t event_type = 0; - list_for_each_entry_safe (event, tmp, &gd_friend_sm_queue, list) { - - list_del_init (&event->list); - peerinfo = event->peerinfo; - event_type = event->event; - - if (!peerinfo && - (GD_FRIEND_EVENT_PROBE == event_type || - GD_FRIEND_EVENT_RCVD_FRIEND_REQ == event_type)) { - ret = glusterd_friend_add (NULL, - GD_FRIEND_STATE_DEFAULT, - NULL, NULL, &peerinfo); - - if (ret) { - gf_log ("glusterd", GF_LOG_ERROR, "Unable to add peer, " - "ret = %d", ret); - continue; + while (!list_empty (&gd_friend_sm_queue)) { + list_for_each_entry_safe (event, tmp, &gd_friend_sm_queue, list) { + + list_del_init (&event->list); + peerinfo = event->peerinfo; + event_type = event->event; + + if (!peerinfo && + (GD_FRIEND_EVENT_PROBE == event_type || + GD_FRIEND_EVENT_RCVD_FRIEND_REQ == event_type)) { + ret = glusterd_friend_add (NULL, + GD_FRIEND_STATE_DEFAULT, + NULL, NULL, &peerinfo); + + if (ret) { + gf_log ("glusterd", GF_LOG_ERROR, "Unable to add peer, " + "ret = %d", ret); + continue; + } + GF_ASSERT (peerinfo); + event->peerinfo = peerinfo; } - GF_ASSERT (peerinfo); - event->peerinfo = peerinfo; - } - state = glusterd_friend_state_table[peerinfo->state.state]; + state = glusterd_friend_state_table[peerinfo->state.state]; - GF_ASSERT (state); + GF_ASSERT (state); - handler = state[event_type].handler; - GF_ASSERT (handler); + handler = state[event_type].handler; + GF_ASSERT (handler); - ret = handler (event, event->ctx); + ret = handler (event, event->ctx); - if (ret) { - gf_log ("glusterd", GF_LOG_ERROR, "handler returned: " - "%d", ret); - return ret; - } + if (ret) { + gf_log ("glusterd", GF_LOG_ERROR, "handler returned: " + "%d", ret); + return ret; + } - ret = glusterd_friend_sm_transition_state (peerinfo, state, event_type); + ret = glusterd_friend_sm_transition_state (peerinfo, state, event_type); - if (ret) { - gf_log ("glusterd", GF_LOG_ERROR, "Unable to transition" - "state from %d to %d", peerinfo->state.state, - state[event_type].next_state); - return ret; - } + if (ret) { + gf_log ("glusterd", GF_LOG_ERROR, "Unable to transition" + "state from %d to %d", peerinfo->state.state, + state[event_type].next_state); + return ret; + } - GF_FREE (event); + GF_FREE (event); + } } -- cgit