summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPrashanth Pai <ppai@redhat.com>2017-04-27 18:26:02 +0530
committerJeff Darcy <jeff@pl.atyp.us>2017-04-28 17:15:30 +0000
commit081f9febeec61787ebe81850a081beda17de3047 (patch)
treea9d7aadb409b88b5ea1b39e7ca1fd9568c53d984
parent83abcba6b42f94eb5a6495a634d4055362a9d79d (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.h2
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-pmap.c16
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.c2
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;
}