From 3a433b14f232b4a5ad88dcdbf57370aa935267f5 Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Thu, 11 Apr 2024 23:26:46 +0200 Subject: [PATCH] dmeventd: rework _restart_dmeventd Use _restart_dmeventd() with return values 0,1,2. Also let's use already created fifos struct. Make sure the _systemd_activation variable is properly initialized from _systemd_handover before calling _restart_dmeventd() as this variable is used there to decide where 1 or 2 should be returned - aka either letting systemd to initilize or restart dmeventd itself. --- WHATS_NEW_DM | 1 + daemons/dmeventd/dmeventd.c | 50 +++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM index cc48832c7..feb004a89 100644 --- a/WHATS_NEW_DM +++ b/WHATS_NEW_DM @@ -1,5 +1,6 @@ Version 1.02.198 - =================== + Correct dmeventd -R for systemd environment. Restart of dmeventd -R checks pid file to detect running dmeventd first. Query with dmeventd -i quickly ends when there is no running dmeventd. Enhance dm_get_status_raid to handle mismatching status or reported legs. diff --git a/daemons/dmeventd/dmeventd.c b/daemons/dmeventd/dmeventd.c index e3f7395f8..2c2816ef2 100644 --- a/daemons/dmeventd/dmeventd.c +++ b/daemons/dmeventd/dmeventd.c @@ -2139,15 +2139,9 @@ out: return ret; } -static void _restart_dmeventd(void) +/* Return 0 - fail, 1 - success, 2 - continue */ +static int _restart_dmeventd(struct dm_event_fifos *fifos) { - struct dm_event_fifos fifos = { - .client = -1, - .server = -1, - /* FIXME Make these either configurable or depend directly on dmeventd_path */ - .client_path = DM_EVENT_FIFO_CLIENT, - .server_path = DM_EVENT_FIFO_SERVER - }; struct dm_event_daemon_message msg = { 0 }; int i, count = 0; char *message; @@ -2156,16 +2150,16 @@ static void _restart_dmeventd(void) if (!dm_daemon_is_running(DMEVENTD_PIDFILE)) { fprintf(stderr, "WARNING: Coult not find running dmeventd associated with pid file %s.\n", DMEVENTD_PIDFILE); - exit(EXIT_FAILURE); + return 0; } /* Get the list of registrations from the running daemon. */ - if (!init_fifos(&fifos)) { + if (!init_fifos(fifos)) { fprintf(stderr, "WARNING: Could not initiate communication with existing dmeventd.\n"); - exit(EXIT_FAILURE); + return 0; } - if (!dm_event_get_version(&fifos, &version)) { + if (!dm_event_get_version(fifos, &version)) { fprintf(stderr, "WARNING: Could not communicate with existing dmeventd.\n"); goto bad; } @@ -2177,7 +2171,7 @@ static void _restart_dmeventd(void) goto bad; } - if (daemon_talk(&fifos, &msg, DM_EVENT_CMD_GET_STATUS, "-", "-", 0, 0)) + if (daemon_talk(fifos, &msg, DM_EVENT_CMD_GET_STATUS, "-", "-", 0, 0)) goto bad; message = strchr(msg.data, ' ') + 1; @@ -2201,7 +2195,7 @@ static void _restart_dmeventd(void) } if (version >= 2) { - if (daemon_talk(&fifos, &msg, DM_EVENT_CMD_GET_PARAMETERS, "-", "-", 0, 0)) { + if (daemon_talk(fifos, &msg, DM_EVENT_CMD_GET_PARAMETERS, "-", "-", 0, 0)) { fprintf(stderr, "Failed to acquire parameters from old dmeventd.\n"); goto bad; } @@ -2221,7 +2215,7 @@ static void _restart_dmeventd(void) } #endif - if (daemon_talk(&fifos, &msg, DM_EVENT_CMD_DIE, "-", "-", 0, 0)) { + if (daemon_talk(fifos, &msg, DM_EVENT_CMD_DIE, "-", "-", 0, 0)) { fprintf(stderr, "Old dmeventd refused to die.\n"); goto bad; } @@ -2230,30 +2224,30 @@ static void _restart_dmeventd(void) ((e = getenv(SD_ACTIVATION_ENV_VAR_NAME)) && strcmp(e, "1"))) _systemd_activation = 1; - fini_fifos(&fifos); + fini_fifos(fifos); /* Give a few seconds dmeventd to finish */ _wait_for_new_pid(); if (!_systemd_activation) - return; + return 2; // continue with dmeventd start up /* Reopen fifos. */ - if (!init_fifos(&fifos)) { + if (!init_fifos(fifos)) { fprintf(stderr, "Could not initiate communication with new instance of dmeventd.\n"); - exit(EXIT_FAILURE); + return 0; } - if (!_reinstate_registrations(&fifos)) { + if (!_reinstate_registrations(fifos)) { fprintf(stderr, "Failed to reinstate monitoring with new instance of dmeventd.\n"); goto bad; } - fini_fifos(&fifos); - exit(EXIT_SUCCESS); + fini_fifos(fifos); + return 1; bad: - fini_fifos(&fifos); - exit(EXIT_FAILURE); + fini_fifos(fifos); + return 0; } static void _usage(char *prog, FILE *file) @@ -2334,13 +2328,15 @@ int main(int argc, char *argv[]) if (setenv("LC_ALL", "C", 1)) perror("Cannot set LC_ALL to C"); - if (_restart) - _restart_dmeventd(); - #ifdef __linux__ _systemd_activation = _systemd_handover(&fifos); #endif + if (_restart) { + if ((_restart = _restart_dmeventd(&fifos)) < 2) + return restart ? EXIT_SUCCESS : EXIT_FAILURE; + } + if (!_foreground) _daemonize();