glusterfsd: Multiple shd processes are spawned on brick_mux environment

Problem: Multiple shd processes are spawned while starting volumes
         in the loop on brick_mux environment.glusterd spawn a process
         based on a pidfile and shd daemon is taking some time to
         update pid in pidfile due to that glusterd is not able to
         get shd pid

Solution: Commit cd249f4cb7 changed
          the code to update pidfile in parent for any gluster daemon
          after getting the status of forking child in parent.To resolve
          the same correct the condition update pidfile in parent only
          for glusterd and for rest of the daemon pidfile is updated in
          child

> Change-Id: Ifd14797fa949562594a285ec82d58384ad717e81
> fixes: bz#1684404
> (Cherry pick from commit 66986594a9023c49e61b32769b7e6b260b600626)
> (Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22290/)

Change-Id: I9a68064d2da1acd0ec54b4071a9995ece0c3320c
fixes: bz#1683880
Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
This commit is contained in:
Mohit Agrawal 2019-03-01 13:41:24 +05:30 committed by Shyamsundar Ranganathan
parent 9b58cfc83c
commit 36c75523c1
2 changed files with 18 additions and 7 deletions

View File

@ -2474,9 +2474,6 @@ daemonize(glusterfs_ctx_t *ctx)
goto out;
if (cmd_args->no_daemon_mode) {
ret = glusterfs_pidfile_update(ctx, getpid());
if (ret)
goto out;
goto postfork;
}
@ -2532,13 +2529,26 @@ daemonize(glusterfs_ctx_t *ctx)
will be available to parent process on calling exit() */
if (err)
_exit(abs(err));
ret = glusterfs_pidfile_update(ctx, child_pid);
if (ret)
_exit(1);
/* Update pid in parent only for glusterd process */
if (ctx->process_mode == GF_GLUSTERD_PROCESS) {
ret = glusterfs_pidfile_update(ctx, child_pid);
if (ret)
exit(1);
}
_exit(0);
}
postfork:
/* Update pid in child either process_mode is not belong to glusterd
or process is spawned in no daemon mode
*/
if ((ctx->process_mode != GF_GLUSTERD_PROCESS) ||
(cmd_args->no_daemon_mode)) {
ret = glusterfs_pidfile_update(ctx, getpid());
if (ret)
goto out;
}
ret = gf_log_inject_timer_event(ctx);
glusterfs_signals_setup(ctx);

View File

@ -4133,7 +4133,6 @@ gf_is_service_running(char *pidfile, int *pid)
ret = lockf(fno, F_TEST, 0);
if (ret == -1) {
running = _gf_true;
goto out;
}
ret = fscanf(file, "%d", pid);
@ -4141,6 +4140,8 @@ gf_is_service_running(char *pidfile, int *pid)
gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,
"Unable to read pidfile: %s", pidfile);
*pid = -1;
running = _gf_false;
goto out;
}
running = gf_is_pid_running(*pid);