diff options
| author | Mohit Agrawal <moagrawal@redhat.com> | 2018-11-06 16:23:51 +0530 | 
|---|---|---|
| committer | Amar Tumballi <amarts@redhat.com> | 2018-11-12 03:31:57 +0000 | 
| commit | bcf1e8b07491b48c5372924dbbbad5b8391c6d81 (patch) | |
| tree | e25b709aac97c9bdee74596c37f2aa721a0b7bc3 | |
| parent | e134ef2493e8517a6f341416c11230c2bb5bcd6c (diff) | |
core: Portmap entries showing stale brick entries when bricks are down
Problem: pmap is showing stale brick entries after down the brick
         because of glusterd_brick_rpc_notify call gf_is_service_running
         before call pmap_registry_remove to ensure about brick instance.
Solutiom: 1) Change the condition in gf_is_pid_running to ensure about
             process existence, use open instead of access to achieve
             the same
          2) Call search_brick_path_from_proc in __glusterd_brick_rpc_notify
             along with gf_is_service_running
Change-Id: Ia663ac61c01fdee6c12f47c0300cdf93f19b6a19
fixes: bz#1646892
Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
| -rw-r--r-- | libglusterfs/src/common-utils.c | 5 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 7 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 2 | 
3 files changed, 11 insertions, 3 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 5d66e8d4207..31759a3e48f 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -4015,13 +4015,16 @@ gf_is_pid_running(int pid)      char fname[32] = {          0,      }; +    int fd = -1;      snprintf(fname, sizeof(fname), "/proc/%d/cmdline", pid); -    if (sys_access(fname, R_OK) != 0) { +    fd = sys_open(fname, O_RDONLY, 0); +    if (fd < 0) {          return _gf_false;      } +    sys_close(fd);      return _gf_true;  } diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index aa8892784df..ba69a7de7be 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -6206,10 +6206,13 @@ __glusterd_brick_rpc_notify(struct rpc_clnt *rpc, void *mydata,                  /* 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 +                 * the same if the process is not running sometime +                 * gf_is_service_running true so to ensure about brick instance +                 * call search_brick_path_from_proc                   */                  GLUSTERD_GET_BRICK_PIDFILE(pidfile, volinfo, brickinfo, conf); -                if (!gf_is_service_running(pidfile, &pid)) { +                if (!gf_is_service_running(pidfile, &pid) || +                    !search_brick_path_from_proc(pid, brickinfo->path)) {                      ret = pmap_registry_remove(                          THIS, brickinfo->port, brickinfo->path,                          GF_PMAP_PORT_BRICKSERVER, NULL, _gf_true); diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index cffbebda70c..a00dc4564a5 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -873,4 +873,6 @@ glusterd_get_volinfo_from_brick(char *brick, glusterd_volinfo_t **volinfo);  gf_boolean_t  glusterd_is_profile_on(glusterd_volinfo_t *volinfo); +char * +search_brick_path_from_proc(pid_t brick_pid, char *brickpath);  #endif  | 
