diff options
author | Kaushal M <kaushal@redhat.com> | 2015-05-06 13:10:15 +0530 |
---|---|---|
committer | Kaushal M <kaushal@redhat.com> | 2015-05-07 00:10:43 -0700 |
commit | 02583099a219ce327aac62af22b486c7b9fcb531 (patch) | |
tree | eaf0c4bf9c025a6070af330b7bf8563bec50fbde /xlators/mgmt/glusterd/src/glusterd-peer-utils.c | |
parent | 07e3f407b311c80e3437b1f650cae62f814d995b (diff) |
glusterd: Use generation number to find peerinfo in RPC notifications
The generation number for each peerinfo object is unique. It can be used
to find the exact peerinfo object, which is required for peer RPC
notifications.
Using hostname and uuid matching to find peerinfos can return incorrect
peerinfos to be returned in certain cases like multi network peer probe.
This could cause updates to happen to incorrect peerinfos.
Change-Id: Ia0aada8214fd6d43381e5afd282e08d53a277251
BUG: 1215018
Signed-off-by: Kaushal M <kaushal@redhat.com>
Reviewed-on: http://review.gluster.org/10495
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Tested-by: NetBSD Build System
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-peer-utils.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-peer-utils.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-peer-utils.c b/xlators/mgmt/glusterd/src/glusterd-peer-utils.c index f3241e918f7..9a05941a3f3 100644 --- a/xlators/mgmt/glusterd/src/glusterd-peer-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-peer-utils.c @@ -949,3 +949,41 @@ gd_add_peer_detail_to_dict (glusterd_peerinfo_t *peerinfo, dict_t *friends, out: return ret; } + +/* glusterd_peerinfo_find_by_generation searches for a peer which has the + * generation number @generation and if found returns the pointer to peerinfo + * object. Returns NULL otherwise. + */ +glusterd_peerinfo_t * +glusterd_peerinfo_find_by_generation (uint32_t generation) { + glusterd_conf_t *priv = NULL; + glusterd_peerinfo_t *entry = NULL; + glusterd_peerinfo_t *found = NULL; + xlator_t *this = NULL; + + this = THIS; + GF_ASSERT (this); + + priv = this->private; + + GF_ASSERT (priv); + + rcu_read_lock (); + cds_list_for_each_entry_rcu (entry, &priv->peers, uuid_list) { + if (entry->generation == generation) { + + gf_log (this->name, GF_LOG_DEBUG, + "Friend found... state: %s", + glusterd_friend_sm_state_name_get (entry->state.state)); + found = entry; /* Probably should be rcu_dereferenced */ + break; + } + } + rcu_read_unlock (); + + if (!found) + gf_log (this->name, GF_LOG_DEBUG, + "Friend with generation: %"PRIu32", not found", + generation); + return found; +} |