1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

daemon-server: handle reaping threads better

Avoid sleeping in pselect when thread missed reap() handling.
This speedup handling of daemon shutdown sequences.
This commit is contained in:
Zdenek Kabelac 2021-04-01 11:32:47 +02:00
parent fe4f83171d
commit 1f17b1c565

View File

@ -551,9 +551,14 @@ static void _reap(daemon_state s, int waiting)
while (ts) {
if (waiting || !ts->active) {
if (ts->client.thread_id &&
(errno = pthread_join(ts->client.thread_id, &rv)))
ERROR(&s, "pthread_join failed: %s", strerror(errno));
if (ts->client.thread_id) {
if ((errno = pthread_kill(ts->client.thread_id, SIGTERM)) &&
(errno != ESRCH))
ERROR(&s, "pthread_kill failed for pid %ld",
(long)ts->client.thread_id);
if ((errno = pthread_join(ts->client.thread_id, &rv)))
ERROR(&s, "pthread_join failed: %s", strerror(errno));
}
last->next = ts->next;
free(ts);
} else
@ -659,19 +664,13 @@ void daemon_start(daemon_state s)
if (sigprocmask(SIG_SETMASK, NULL, &old_set))
perror("sigprocmask error");
while (!failed) {
while (!failed && !_shutdown_requested) {
_reset_timeout(s);
FD_ZERO(&in);
FD_SET(s.socket_fd, &in);
if (sigprocmask(SIG_SETMASK, &new_set, NULL))
perror("sigprocmask error");
if (_shutdown_requested && !s.threads->next) {
if (sigprocmask(SIG_SETMASK, &old_set, NULL))
perror("sigprocmask error");
INFO(&s, "%s shutdown requested", s.name);
break;
}
ret = pselect(s.socket_fd + 1, &in, NULL, NULL, _get_timeout(s), &old_set);
if (sigprocmask(SIG_SETMASK, &old_set, NULL))
perror("sigprocmask error");
@ -679,6 +678,7 @@ void daemon_start(daemon_state s)
if (ret < 0) {
if ((errno != EINTR) && (errno != EAGAIN))
perror("select error");
_reap(s, 0);
continue;
}
@ -698,6 +698,9 @@ void daemon_start(daemon_state s)
}
}
if (_shutdown_requested)
INFO(&s, "%s shutdown requested", s.name);
INFO(&s, "%s waiting for client threads to finish", s.name);
_reap(s, 1);
out: