summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
authorKaushal M <kaushal@redhat.com>2015-05-06 13:10:15 +0530
committerKaushal M <kaushal@redhat.com>2015-05-07 00:10:43 -0700
commit02583099a219ce327aac62af22b486c7b9fcb531 (patch)
treeeaf0c4bf9c025a6070af330b7bf8563bec50fbde /xlators
parent07e3f407b311c80e3437b1f650cae62f814d995b (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')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-handler.c8
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-handshake.c12
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-peer-utils.c38
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-peer-utils.h2
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-sm.h1
5 files changed, 53 insertions, 8 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c
index 524ce35d841..fcdfa608607 100644
--- a/xlators/mgmt/glusterd/src/glusterd-handler.c
+++ b/xlators/mgmt/glusterd/src/glusterd-handler.c
@@ -3152,6 +3152,10 @@ glusterd_friend_rpc_create (xlator_t *this, glusterd_peerinfo_t *peerinfo,
gf_uuid_copy (peerctx->peerid, peerinfo->uuid);
peerctx->peername = gf_strdup (peerinfo->hostname);
+ peerctx->peerinfo_gen = peerinfo->generation; /* A peerinfos generation
+ number can be used to
+ uniquely identify a
+ peerinfo */
ret = glusterd_transport_inet_options_build (&options,
peerinfo->hostname,
@@ -4613,7 +4617,7 @@ glusterd_friend_remove_notify (glusterd_peerctx_t *peerctx)
GF_ASSERT (peerctx);
rcu_read_lock ();
- peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername);
+ peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);
if (!peerinfo) {
gf_log (THIS->name, GF_LOG_DEBUG, "Could not find peer %s(%s). "
"Peer could have been deleted.", peerctx->peername,
@@ -4684,7 +4688,7 @@ __glusterd_peer_rpc_notify (struct rpc_clnt *rpc, void *mydata,
rcu_read_lock ();
- peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername);
+ peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);
if (!peerinfo) {
/* Peerinfo should be available at this point. Not finding it
* means that something terrible has happened
diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c
index bc00e99b62f..f1712685dcb 100644
--- a/xlators/mgmt/glusterd/src/glusterd-handshake.c
+++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c
@@ -1527,7 +1527,7 @@ glusterd_event_connected_inject (glusterd_peerctx_t *peerctx)
rcu_read_lock ();
- peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername);
+ peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);
if (!peerinfo) {
ret = -1;
gf_log (THIS->name, GF_LOG_ERROR, "Could not find peer %s(%s)",
@@ -1621,7 +1621,7 @@ __glusterd_mgmt_hndsk_version_ack_cbk (struct rpc_req *req, struct iovec *iov,
peerctx = frame->local;
rcu_read_lock ();
- peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername);
+ peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);
if (!peerinfo) {
gf_log (this->name, GF_LOG_DEBUG, "Could not find peer %s(%s)",
peerctx->peername, uuid_utoa (peerctx->peerid));
@@ -1725,7 +1725,7 @@ __glusterd_mgmt_hndsk_version_cbk (struct rpc_req *req, struct iovec *iov,
rcu_read_lock ();
- peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername);
+ peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);
if (!peerinfo) {
ret = -1;
gf_log (this->name, GF_LOG_DEBUG, "Could not find peer %s(%s)",
@@ -1859,7 +1859,7 @@ glusterd_mgmt_handshake (xlator_t *this, glusterd_peerctx_t *peerctx)
rcu_read_lock ();
- peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername);
+ peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);
if (!peerinfo) {
gf_log (THIS->name, GF_LOG_DEBUG, "Could not find peer %s(%s)",
peerctx->peername, uuid_utoa (peerctx->peerid));
@@ -1988,7 +1988,7 @@ __glusterd_peer_dump_version_cbk (struct rpc_req *req, struct iovec *iov,
rcu_read_lock ();
- peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername);
+ peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);
if (!peerinfo) {
gf_log (this->name, GF_LOG_DEBUG, "Couldn't find peer %s(%s)",
peerctx->peername, uuid_utoa (peerctx->peerid));
@@ -2109,7 +2109,7 @@ glusterd_peer_dump_version (xlator_t *this, struct rpc_clnt *rpc,
rcu_read_lock ();
- peerinfo = glusterd_peerinfo_find (peerctx->peerid, peerctx->peername);
+ peerinfo = glusterd_peerinfo_find_by_generation (peerctx->peerinfo_gen);
if (!peerinfo) {
gf_log (this->name, GF_LOG_DEBUG, "Couldn't find peer %s(%s)",
peerctx->peername, uuid_utoa (peerctx->peerid));
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;
+}
diff --git a/xlators/mgmt/glusterd/src/glusterd-peer-utils.h b/xlators/mgmt/glusterd/src/glusterd-peer-utils.h
index 3a1aee7cd15..bd30e335f69 100644
--- a/xlators/mgmt/glusterd/src/glusterd-peer-utils.h
+++ b/xlators/mgmt/glusterd/src/glusterd-peer-utils.h
@@ -82,4 +82,6 @@ gd_add_peer_hostnames_to_dict (glusterd_peerinfo_t *peerinfo, dict_t *dict,
int
gd_add_peer_detail_to_dict (glusterd_peerinfo_t *peerinfo, dict_t *friends,
int count);
+glusterd_peerinfo_t *
+glusterd_peerinfo_find_by_generation (uint32_t generation);
#endif /* _GLUSTERD_PEER_UTILS_H */
diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.h b/xlators/mgmt/glusterd/src/glusterd-sm.h
index d75baa8d128..60e7514fdae 100644
--- a/xlators/mgmt/glusterd/src/glusterd-sm.h
+++ b/xlators/mgmt/glusterd/src/glusterd-sm.h
@@ -130,6 +130,7 @@ typedef struct glusterd_peer_ctx_ {
glusterd_peerctx_args_t args;
uuid_t peerid;
char *peername;
+ uint32_t peerinfo_gen;
char *errstr;
} glusterd_peerctx_t;