From 081f9febeec61787ebe81850a081beda17de3047 Mon Sep 17 00:00:00 2001 From: Prashanth Pai Date: Thu, 27 Apr 2017 18:26:02 +0530 Subject: glusterd: Fix removing pmap entry on rpc disconnect Problem: The following line of code intended to remove pmap entry for the connection during disconnects: pmap_registry_remove (this, 0, NULL, GF_PMAP_PORT_NONE, xprt); However, no pmap entry will have it's type set to GF_PMAP_PORT_NONE at any point in time. So a call to pmap_registry_search_by_xprt() in pmap_registry_remove() will always fail to find a match. Fix: Optionally ignore pmap entry's type in pmap_registry_search_by_xprt(). BUG: 1193929 Change-Id: I705f101739ab1647ff52a92820d478354407264a Signed-off-by: Prashanth Pai Reviewed-on: https://review.gluster.org/17129 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Jeff Darcy --- xlators/mgmt/glusterd/src/glusterd-pmap.c | 16 +++++++++------- xlators/mgmt/glusterd/src/glusterd.c | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) (limited to 'xlators') diff --git a/xlators/mgmt/glusterd/src/glusterd-pmap.c b/xlators/mgmt/glusterd/src/glusterd-pmap.c index 9b2954af64d..8c4174a3642 100644 --- a/xlators/mgmt/glusterd/src/glusterd-pmap.c +++ b/xlators/mgmt/glusterd/src/glusterd-pmap.c @@ -27,7 +27,7 @@ #include -int +static int pmap_port_isfree (int port) { struct sockaddr_in sin; @@ -155,7 +155,7 @@ pmap_registry_search (xlator_t *this, const char *brickname, return 0; } -int +static int pmap_registry_search_by_xprt (xlator_t *this, void *xprt, gf_pmap_port_type_t type) { @@ -168,10 +168,12 @@ pmap_registry_search_by_xprt (xlator_t *this, void *xprt, for (p = pmap->last_alloc; p >= pmap->base_port; p--) { if (!pmap->ports[p].xprt) continue; - if (pmap->ports[p].xprt == xprt && - pmap->ports[p].type == type) { - port = p; - break; + if (pmap->ports[p].xprt == xprt) { + if (pmap->ports[p].type == type || + type == GF_PMAP_PORT_ANY) { + port = p; + break; + } } } @@ -179,7 +181,7 @@ pmap_registry_search_by_xprt (xlator_t *this, void *xprt, } -char * +static char * pmap_registry_search_by_port (xlator_t *this, int port) { struct pmap_registry *pmap = NULL; diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index 0a2641842aa..bbd7adcac1b 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -424,7 +424,7 @@ glusterd_rpcsvc_notify (rpcsvc_t *rpc, void *xl, rpcsvc_event_t event, pthread_mutex_lock (&priv->xprt_lock); list_del (&xprt->list); pthread_mutex_unlock (&priv->xprt_lock); - pmap_registry_remove (this, 0, NULL, GF_PMAP_PORT_NONE, xprt); + pmap_registry_remove (this, 0, NULL, GF_PMAP_PORT_ANY, xprt); break; } -- cgit