diff options
Diffstat (limited to 'xlators/mgmt')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 25 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-pmap.c | 38 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-pmap.h | 3 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 3 |
4 files changed, 53 insertions, 16 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index b3e1ec3a362..6d006c063d8 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -5607,6 +5607,8 @@ __glusterd_brick_rpc_notify (struct rpc_clnt *rpc, void *mydata, glusterd_brickinfo_t *brickinfo = NULL; glusterd_volinfo_t *volinfo = NULL; xlator_t *this = NULL; + int32_t pid = -1; + char pidfile[PATH_MAX] = {0}; brickid = mydata; if (!brickid) @@ -5707,6 +5709,29 @@ __glusterd_brick_rpc_notify (struct rpc_clnt *rpc, void *mydata, "peer=%s;volume=%s;brick=%s", brickinfo->hostname, volinfo->volname, brickinfo->path); + /* In case of an abrupt shutdown of a brick PMAP_SIGNOUT + * event is not received by glusterd which can lead to a + * stale port entry in glusterd, so forcibly clean up + * the same if the process is not running + */ + GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo, + brickinfo, conf); + if (!gf_is_service_running (pidfile, &pid)) { + ret = pmap_registry_remove ( + THIS, brickinfo->port, + brickinfo->path, + GF_PMAP_PORT_BRICKSERVER, + NULL, _gf_true); + if (ret) { + gf_msg (this->name, GF_LOG_WARNING, + GD_MSG_PMAP_REGISTRY_REMOVE_FAIL, + 0, "Failed to remove pmap " + "registry for port %d for " + "brick %s", brickinfo->port, + brickinfo->path); + ret = 0; + } + } } glusterd_set_brick_status (brickinfo, GF_BRICK_STOPPED); diff --git a/xlators/mgmt/glusterd/src/glusterd-pmap.c b/xlators/mgmt/glusterd/src/glusterd-pmap.c index aa34ce4900e..bbbd18b9ad9 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) { + 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; @@ -237,7 +239,8 @@ pmap_assign_port (xlator_t *this, int old_port, const char *path) if (old_port) { ret = pmap_registry_remove (this, 0, path, - GF_PMAP_PORT_BRICKSERVER, NULL); + GF_PMAP_PORT_BRICKSERVER, NULL, + _gf_false); if (ret) { gf_msg (this->name, GF_LOG_WARNING, GD_MSG_PMAP_REGISTRY_REMOVE_FAIL, 0, "Failed to" @@ -340,7 +343,8 @@ pmap_registry_extend (xlator_t *this, int port, const char *brickname) int pmap_registry_remove (xlator_t *this, int port, const char *brickname, - gf_pmap_port_type_t type, void *xprt) + gf_pmap_port_type_t type, void *xprt, + gf_boolean_t brick_disconnect) { struct pmap_registry *pmap = NULL; int p = 0; @@ -387,11 +391,16 @@ remove: * can delete the entire entry. */ if (!pmap->ports[p].xprt) { - brick_str = pmap->ports[p].brickname; - if (brick_str) { - while (*brick_str != '\0') { - if (*(brick_str++) != ' ') { - goto out; + /* If the signout call is being triggered by brick disconnect + * then clean up all the bricks (in case of brick mux) + */ + if (!brick_disconnect) { + brick_str = pmap->ports[p].brickname; + if (brick_str) { + while (*brick_str != '\0') { + if (*(brick_str++) != ' ') { + goto out; + } } } } @@ -542,14 +551,15 @@ __gluster_pmap_signout (rpcsvc_request_t *req) goto fail; } rsp.op_ret = pmap_registry_remove (THIS, args.port, args.brick, - GF_PMAP_PORT_BRICKSERVER, req->trans); + GF_PMAP_PORT_BRICKSERVER, req->trans, + _gf_false); ret = glusterd_get_brickinfo (THIS, args.brick, args.port, &brickinfo); if (args.rdma_port) { snprintf(brick_path, PATH_MAX, "%s.rdma", args.brick); rsp.op_ret = pmap_registry_remove (THIS, args.rdma_port, brick_path, GF_PMAP_PORT_BRICKSERVER, - req->trans); + req->trans, _gf_false); } /* Clean up the pidfile for this brick given glusterfsd doesn't clean it * any more. This is required to ensure we don't end up with having diff --git a/xlators/mgmt/glusterd/src/glusterd-pmap.h b/xlators/mgmt/glusterd/src/glusterd-pmap.h index 9965a9577b5..253b4ccc85d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-pmap.h +++ b/xlators/mgmt/glusterd/src/glusterd-pmap.h @@ -42,7 +42,8 @@ int pmap_registry_bind (xlator_t *this, int port, const char *brickname, gf_pmap_port_type_t type, void *xprt); int pmap_registry_extend (xlator_t *this, int port, const char *brickname); int pmap_registry_remove (xlator_t *this, int port, const char *brickname, - gf_pmap_port_type_t type, void *xprt); + gf_pmap_port_type_t type, void *xprt, + gf_boolean_t brick_disconnect); int pmap_registry_search (xlator_t *this, const char *brickname, gf_pmap_port_type_t type, gf_boolean_t destroy); struct pmap_registry *pmap_registry_get (xlator_t *this); diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index a5738919c79..c4661d6be4d 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -424,7 +424,8 @@ 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, + _gf_false); break; } |