libmultipath: fix race in stop_io_err_stat_thread
authorMartin Wilck <mwilck@suse.com>
Tue, 6 Mar 2018 21:18:41 +0000 (22:18 +0100)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Wed, 7 Mar 2018 09:42:24 +0000 (10:42 +0100)
It's wrong, and unnecessary, to call pthread_kill after
pthread_cancel. I have observed cases where the io_err checker
thread hung in libpthread after receiving the USR2 signal, in particular
when multipathd is run under strace. (If multipathd is killed with
SIGINT under strace, and the io_error thread is running, it happens
almost every time). If this happens, the io_err thread
tries to obtain a mutex in the urcu code (presumably rcu_unregister_thread())
and the main thread hangs in pthread_join().

With the change from this patch, the thread is shut down cleanly. I haven't
observed the hang under strace with the patch.

Signed-off-by: Martin Wilck <mwilck@suse.com>
libmultipath/io_err_stat.c

index 00bac9e..536ba87 100644 (file)
@@ -749,7 +749,6 @@ destroy_ctx:
 void stop_io_err_stat_thread(void)
 {
        pthread_cancel(io_err_stat_thr);
-       pthread_kill(io_err_stat_thr, SIGUSR2);
        pthread_join(io_err_stat_thr, NULL);
        free_io_err_pathvec(paths);
        io_destroy(ioctx);