summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-sm.c
diff options
context:
space:
mode:
authorKrishnan Parthasarathi <kp@gluster.com>2012-03-12 14:26:36 +0530
committerVijay Bellur <vijay@gluster.com>2012-03-12 05:19:23 -0700
commitc9322f64cc4b8c661cf282bf1a2b08e0d6567b16 (patch)
treef02f0eb625870eb310216dcb48a5ea145f4843ad /xlators/mgmt/glusterd/src/glusterd-sm.c
parente7d9f599ee52408819be649ef41ffc00c77e785e (diff)
glusterd: Peer(s) mustn't send updates about members not yet in cluster
Also, peerinfo is added to peers list synchoronous with the request triggering it. This ensures that atmost one request sees that the peer (in question) is not in peers list. Earlier, 'concurrent' handle_friend_update requests would see that a particular peer is not in the peers list yet, as the addition of the 'peer' into the list happened asynchronously, on the 'connect' event of the 'peer'. Change-Id: I6f017fb43079862fbe5ae7db8f9f4e4fefaa091d BUG: 801731 Signed-off-by: Krishnan Parthasarathi <kp@gluster.com> Reviewed-on: http://review.gluster.com/2918 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Amar Tumballi <amarts@redhat.com> Reviewed-by: Vijay Bellur <vijay@gluster.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-sm.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-sm.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.c b/xlators/mgmt/glusterd/src/glusterd-sm.c
index 259c247f4..a53057fab 100644
--- a/xlators/mgmt/glusterd/src/glusterd-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-sm.c
@@ -478,6 +478,9 @@ glusterd_ac_send_friend_update (glusterd_friend_sm_event_t *event, void *ctx)
goto out;
list_for_each_entry (peerinfo, &priv->peers, uuid_list) {
+ if (!peerinfo->connected || !peerinfo->peer ||
+ peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED)
+ continue;
count++;
snprintf (key, sizeof (key), "friend%d.uuid", count);
dup_buf = gf_strdup (uuid_utoa (peerinfo->uuid));
@@ -497,7 +500,8 @@ glusterd_ac_send_friend_update (glusterd_friend_sm_event_t *event, void *ctx)
goto out;
list_for_each_entry (peerinfo, &priv->peers, uuid_list) {
- if (!peerinfo->connected || !peerinfo->peer)
+ if (!peerinfo->connected || !peerinfo->peer ||
+ peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED)
continue;
ret = dict_set_static_ptr (friends, "peerinfo", peerinfo);