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;          }  | 
