diff options
| author | Vijay Bellur <vijay@gluster.com> | 2010-07-14 00:20:28 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2010-07-14 14:44:18 -0700 | 
| commit | 32451a4dd02bdd95ec800d51267d2e6be43914a4 (patch) | |
| tree | 6054625db937658faf1d451d4173a95fd76a8a86 /xlators/mgmt/glusterd/src/glusterd-sm.c | |
| parent | 9186c9e84c857a0b1bfbfa4e7b46e9eb741186fb (diff) | |
Fixes a crash seen in create volume
Also includes some re-factoring changes.
Signed-off-by: Vijay Bellur <vijay@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 1063 (gluster volume create command segfaults)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1063
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-sm.c')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-sm.c | 80 | 
1 files changed, 41 insertions, 39 deletions
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); +                }          }  | 
