diff options
author | Prashanth Pai <ppai@redhat.com> | 2017-04-27 18:26:02 +0530 |
---|---|---|
committer | Jeff Darcy <jeff@pl.atyp.us> | 2017-04-28 17:15:30 +0000 |
commit | 081f9febeec61787ebe81850a081beda17de3047 (patch) | |
tree | a9d7aadb409b88b5ea1b39e7ca1fd9568c53d984 | |
parent | 83abcba6b42f94eb5a6495a634d4055362a9d79d (diff) |
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 <ppai@redhat.com>
Reviewed-on: https://review.gluster.org/17129
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
-rw-r--r-- | rpc/rpc-lib/src/protocol-common.h | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-pmap.c | 16 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 2 |
3 files changed, 11 insertions, 9 deletions
diff --git a/rpc/rpc-lib/src/protocol-common.h b/rpc/rpc-lib/src/protocol-common.h index b5f5bdee50e..ee98f3d4959 100644 --- a/rpc/rpc-lib/src/protocol-common.h +++ b/rpc/rpc-lib/src/protocol-common.h @@ -106,7 +106,7 @@ enum gf_pmap_port_type { GF_PMAP_PORT_FREE = 0, GF_PMAP_PORT_FOREIGN, /* it actually means, not sure who is using it, but it is in-use */ GF_PMAP_PORT_LEASED, - GF_PMAP_PORT_NONE, + GF_PMAP_PORT_ANY, GF_PMAP_PORT_BRICKSERVER, /* port used by brick process */ }; typedef enum gf_pmap_port_type gf_pmap_port_type_t; 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 <netinet/in.h> -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; } |