64 lines
2.1 KiB
Diff
64 lines
2.1 KiB
Diff
|
|
From 61358d92cbf202dbb483d63a63d5adf0463bb934 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Zdenek Kabelac <zkabelac@redhat.com>
|
||
|
|
Date: Wed, 25 Sep 2019 17:22:49 +0200
|
||
|
|
Subject: [PATCH 127/180] lvmetad: fix timeout on shutdown
|
||
|
|
|
||
|
|
When lvmetad is going to be shutdown - there were 2 issue:
|
||
|
|
If there was endless stream of command contacting lvmetad - the process
|
||
|
|
would never finish - so now when we recieved SIGTERM - we are no longer
|
||
|
|
accepting new connections and we just wait till the existing ones are
|
||
|
|
finished.
|
||
|
|
|
||
|
|
2nd. issue is that actually when we are waiting for finish of all client
|
||
|
|
threads - we basically want an usleep() and check if all threads
|
||
|
|
are already finished - proper solution would be to singal from a thread
|
||
|
|
there is some work to do for master thread - but that would be a bigger
|
||
|
|
change and since lvmetad is no longer developed - keep the change
|
||
|
|
minimal and just use pselect() as our '1sec.' sleeping call once
|
||
|
|
we are in 'shutdown' mode.
|
||
|
|
|
||
|
|
Reported-by: wangjufeng@huawei.com
|
||
|
|
---
|
||
|
|
libdaemon/server/daemon-server.c | 11 +++++++++--
|
||
|
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
|
||
|
|
index 71f7fae..90bf055 100644
|
||
|
|
--- a/libdaemon/server/daemon-server.c
|
||
|
|
+++ b/libdaemon/server/daemon-server.c
|
||
|
|
@@ -89,6 +89,13 @@ static int _is_idle(daemon_state s)
|
||
|
|
|
||
|
|
static struct timespec *_get_timeout(daemon_state s)
|
||
|
|
{
|
||
|
|
+ static struct timespec _tm = { 0 };
|
||
|
|
+
|
||
|
|
+ if (_shutdown_requested) {
|
||
|
|
+ _tm.tv_sec = 1;
|
||
|
|
+ return &_tm;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
return s.idle ? s.idle->ptimeout : NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
@@ -506,7 +513,7 @@ static int _handle_connect(daemon_state s)
|
||
|
|
socklen_t sl = sizeof(sockaddr);
|
||
|
|
|
||
|
|
client.socket_fd = accept(s.socket_fd, (struct sockaddr *) &sockaddr, &sl);
|
||
|
|
- if (client.socket_fd < 0) {
|
||
|
|
+ if (client.socket_fd < 0 || _shutdown_requested) {
|
||
|
|
if (errno != EAGAIN || !_shutdown_requested)
|
||
|
|
ERROR(&s, "Failed to accept connection: %s.", strerror(errno));
|
||
|
|
return 0;
|
||
|
|
@@ -671,7 +678,7 @@ void daemon_start(daemon_state s)
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
- if (FD_ISSET(s.socket_fd, &in)) {
|
||
|
|
+ if (!_shutdown_requested && FD_ISSET(s.socket_fd, &in)) {
|
||
|
|
timeout_count = 0;
|
||
|
|
_handle_connect(s);
|
||
|
|
}
|
||
|
|
--
|
||
|
|
2.19.1
|
||
|
|
|