[dm-devel] [PATCH] multipathd: fix daemon not really shutdown

Martin Wilck mwilck at suse.de
Thu Jan 3 10:23:02 UTC 2019


Chongyun, 

On Wed, 2018-12-26 at 06:34 +0000, Chongyun Wu wrote:
> Hi Martin and Ben,
> 
> Cloud you help to review this patch, thanks.
> 
> Test environment: 25 hosts, each host have more than 100 luns,
> each lun have two paths.
> Some times when we try to ceate new multipath will encounter "could
> not create uxsock:98" but the multipathd still running not shutdown
> and can't response any multipathd commands also.
> 
> After reproduce this issue and debug, found below fixes might work:
> (1) set_config_state() after pthread_cond_timedwait() other threads
> might changed the running_state from DAEMON_SHUTDOWN to other status
> like DAEMON_IDLE, which will make the shutdown process stopped.
> I found logs to prove this really happened, so we need add judgement
> here too.
> 
> (2) process exit signal as possible as we can.
> If we just set a flag and wait handle_signals to handle exit signal,
> there might have more 5s to wait because of ppoll maximal wait time.
> And there might haven't enouth time left for all threads to clean up
> and exit.
> 
> With this patch our tester not report this issue again.

please verify that you were using the latest upstream code,
in particular that f1c73962 "multipathd: make DAEMON_SHUTDOWN a
terminal state" and the predecessors 9de272eb, 234cab29 are
included in your code base. I made these patches
for the problem you are describing, and it worked for me.

Martin



> 
> Signed-off-by: Chongyun Wu <wu.chongyun at h3c.com>
> ---
>   multipathd/main.c | 11 +++--------
>   1 file changed, 3 insertions(+), 8 deletions(-)
> 
> diff --git a/multipathd/main.c b/multipathd/main.c
> index 991452930433..620b8264c82f 100644
> --- a/multipathd/main.c
> +++ b/multipathd/main.c
> @@ -141,7 +141,6 @@ struct udev * udev;
>   struct config *multipath_conf;
> 
>   /* Local variables */
> -static volatile sig_atomic_t exit_sig;
>   static volatile sig_atomic_t reconfig_sig;
>   static volatile sig_atomic_t log_reset_sig;
> 
> @@ -247,7 +246,7 @@ int set_config_state(enum daemon_status state)
>   			rc = pthread_cond_timedwait(&config_cond,
>   						    &config_lock, &ts);
>   		}
> -		if (!rc) {
> +		if (!rc && (running_state != DAEMON_SHUTDOWN)) {
>   			running_state = state;
>   			pthread_cond_broadcast(&config_cond);
>   #ifdef USE_SYSTEMD
> @@ -2517,11 +2516,6 @@ signal_set(int signo, void (*func) (int))
>   void
>   handle_signals(bool nonfatal)
>   {
> -	if (exit_sig) {
> -		condlog(2, "exit (signal)");
> -		exit_sig = 0;
> -		exit_daemon();
> -	}
>   	if (!nonfatal)
>   		return;
>   	if (reconfig_sig) {
> @@ -2546,7 +2540,8 @@ sighup (int sig)
>   static void
>   sigend (int sig)
>   {
> -	exit_sig = 1;
> +	condlog(2, "exit (signal)");
> +	exit_daemon();
>   }
> 
>   static void





More information about the dm-devel mailing list