summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2016-04-19 12:25:21 -0500
committerDavid Teigland <teigland@redhat.com>2016-04-19 12:25:21 -0500
commita75c8000cad20fbb9c842a966de334ad528d6a16 (patch)
tree4d9f0536e454c2ac3b7a512473d29b2345fed6ef
parent7f16452ae656f994a881acd773ce6b7170957253 (diff)
downloadlvm2-dev-dct-lvmetad-disabled-3.tar.gz
lvmetad: reconnect if connection breaksdev-dct-lvmetad-disabled-3
If the lvmetad connection breaks after it's been created, lvmetad_send() attempts to reconnect. This requires ignoring SIGPIPE, which if not ignored will kill the command when the connection breaks.
-rw-r--r--lib/cache/lvmetad.c13
-rw-r--r--tools/lvmcmdline.c1
2 files changed, 14 insertions, 0 deletions
diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
index 003c00813..201a10a0a 100644
--- a/lib/cache/lvmetad.c
+++ b/lib/cache/lvmetad.c
@@ -403,6 +403,7 @@ static daemon_reply _lvmetad_send(struct cmd_context *cmd, const char *id, ...)
unsigned int delay_usec;
unsigned int wait_sec = 0;
uint64_t now = 0, wait_start = 0;
+ int reconnect = 0;
if (!_lvmetad_connected || !_lvmetad_use) {
reply.error = ECONNRESET;
@@ -429,6 +430,18 @@ retry:
daemon_request_destroy(req);
+ if ((reply.error == ECONNRESET) && (reconnect < 2)) {
+ reconnect++;
+ daemon_reply_destroy(reply);
+ log_warn("WARNING: lvmetad connection failed, reconnecting...");
+ lvmetad_disconnect();
+ usleep(1000000);
+ if (lvmetad_connect(cmd))
+ goto retry;
+ else
+ log_warn("WARNING: lvmetad reconnected.");
+ }
+
if (reply.error == ECONNRESET)
log_warn("WARNING: lvmetad connection failed, cannot reconnect.");
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 3b2c70ab5..0e90fa62f 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -1485,6 +1485,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
/* each command should start out with sigint flag cleared */
sigint_clear();
+ signal(SIGPIPE, SIG_IGN);
/* eliminate '-' from all options starting with -- */
for (i = 1; i < argc; i++) {