From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Aring Date: Thu, 2 Mar 2023 12:14:28 -0500 Subject: [Cluster-devel] [PATCH dlm-tool 01/14] dlm_tool: add fail functionality if dump failed Message-ID: <20230302171441.1509914-1-aahringo@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Currently dlm_controld sets a embedded data int value of dlm_controld dump functionality failed for e.g. if lockspace cannot be found. The dlm_tool does not parse this possible error functionality and will exit successfully. This patch will add dlm_tool fail functionality if dlm_controld sets an embedded data error value. --- dlm_controld/lib.c | 25 +++++++++------- dlm_controld/libdlmcontrol.h | 10 +++---- dlm_tool/main.c | 57 +++++++++++++++++++++++++++--------- 3 files changed, 62 insertions(+), 30 deletions(-) diff --git a/dlm_controld/lib.c b/dlm_controld/lib.c index 2888ad05..a21150f2 100644 --- a/dlm_controld/lib.c +++ b/dlm_controld/lib.c @@ -109,7 +109,7 @@ static void init_header(struct dlmc_header *h, int cmd, char *name, static char copy_buf[DLMC_DUMP_SIZE]; -static int do_dump(int cmd, char *name, char *buf) +static int do_dump(int cmd, char *name, char *buf, int *data) { struct dlmc_header h; int fd, rv, len; @@ -118,6 +118,8 @@ static int do_dump(int cmd, char *name, char *buf) init_header(&h, cmd, name, 0); + *data = 0; + fd = do_connect(DLMC_QUERY_SOCK_PATH); if (fd < 0) { rv = fd; @@ -134,6 +136,7 @@ static int do_dump(int cmd, char *name, char *buf) if (rv < 0) goto out_close; + *data = h.data; len = h.len - sizeof(h); if (len <= 0 || len > DLMC_DUMP_SIZE) @@ -150,29 +153,29 @@ static int do_dump(int cmd, char *name, char *buf) return rv; } -int dlmc_dump_debug(char *buf) +int dlmc_dump_debug(char *buf, int *data) { - return do_dump(DLMC_CMD_DUMP_DEBUG, NULL, buf); + return do_dump(DLMC_CMD_DUMP_DEBUG, NULL, buf, data); } -int dlmc_dump_config(char *buf) +int dlmc_dump_config(char *buf, int *data) { - return do_dump(DLMC_CMD_DUMP_CONFIG, NULL, buf); + return do_dump(DLMC_CMD_DUMP_CONFIG, NULL, buf, data); } -int dlmc_dump_log_plock(char *buf) +int dlmc_dump_log_plock(char *buf, int *data) { - return do_dump(DLMC_CMD_DUMP_LOG_PLOCK, NULL, buf); + return do_dump(DLMC_CMD_DUMP_LOG_PLOCK, NULL, buf, data); } -int dlmc_dump_plocks(char *name, char *buf) +int dlmc_dump_plocks(char *name, char *buf, int *data) { - return do_dump(DLMC_CMD_DUMP_PLOCKS, name, buf); + return do_dump(DLMC_CMD_DUMP_PLOCKS, name, buf, data); } -int dlmc_dump_run(char *buf) +int dlmc_dump_run(char *buf, int *data) { - return do_dump(DLMC_CMD_DUMP_RUN, NULL, buf); + return do_dump(DLMC_CMD_DUMP_RUN, NULL, buf, data); } int dlmc_reload_config(void) diff --git a/dlm_controld/libdlmcontrol.h b/dlm_controld/libdlmcontrol.h index a8654f3e..08f04c39 100644 --- a/dlm_controld/libdlmcontrol.h +++ b/dlm_controld/libdlmcontrol.h @@ -80,11 +80,11 @@ struct dlmc_lockspace { #define DLMC_STATUS_VERBOSE 0x00000001 -int dlmc_dump_debug(char *buf); -int dlmc_dump_config(char *buf); -int dlmc_dump_run(char *buf); -int dlmc_dump_log_plock(char *buf); -int dlmc_dump_plocks(char *name, char *buf); +int dlmc_dump_debug(char *buf, int *data); +int dlmc_dump_config(char *buf, int *data); +int dlmc_dump_run(char *buf, int *data); +int dlmc_dump_log_plock(char *buf, int *data); +int dlmc_dump_plocks(char *name, char *buf, int *data); int dlmc_lockspace_info(char *lsname, struct dlmc_lockspace *ls); int dlmc_node_info(char *lsname, int nodeid, struct dlmc_node *node); /* caller need to free *lss */ diff --git a/dlm_tool/main.c b/dlm_tool/main.c index 50f0cae9..52fd5b89 100644 --- a/dlm_tool/main.c +++ b/dlm_tool/main.c @@ -1466,36 +1466,51 @@ static void do_fence_ack(char *name) dlmc_fence_ack(name); } -static void do_plocks(char *name) +static int do_plocks(char *name) { char buf[DLMC_DUMP_SIZE]; + int rv, data; memset(buf, 0, sizeof(buf)); - dlmc_dump_plocks(name, buf); + rv = dlmc_dump_plocks(name, buf, &data); + if (rv) + return rv; + else if (data) + return data; buf[DLMC_DUMP_SIZE-1] = '\0'; do_write(STDOUT_FILENO, buf, strlen(buf)); + + return 0; } -static void do_dump(int op) +static int do_dump(int op) { + int rv = -EOPNOTSUPP, data; char buf[DLMC_DUMP_SIZE]; memset(buf, 0, sizeof(buf)); if (op == OP_DUMP) - dlmc_dump_debug(buf); + rv = dlmc_dump_debug(buf, &data); else if (op == OP_DUMP_CONFIG) - dlmc_dump_config(buf); + rv = dlmc_dump_config(buf, &data); else if (op == OP_DUMP_RUN) - dlmc_dump_run(buf); + rv = dlmc_dump_run(buf, &data); + + if (rv) + return rv; + else if (data) + return data; buf[DLMC_DUMP_SIZE-1] = '\0'; do_write(STDOUT_FILENO, buf, strlen(buf)); printf("\n"); + + return 0; } static void do_reload_config(void) @@ -1514,18 +1529,25 @@ static void do_set_config(void) printf("set_config done\n"); } -static void do_log_plock(void) +static int do_log_plock(void) { char buf[DLMC_DUMP_SIZE]; + int rv, data; memset(buf, 0, sizeof(buf)); - dlmc_dump_log_plock(buf); + rv = dlmc_dump_log_plock(buf, &data); + if (rv) + return rv; + else if (data) + return data; buf[DLMC_DUMP_SIZE-1] = '\0'; do_write(STDOUT_FILENO, buf, strlen(buf)); printf("\n"); + + return 0; } static int do_run(int op) @@ -1576,6 +1598,7 @@ int main(int argc, char **argv) { prog_name = argv[0]; decode_arguments(argc, argv); + int rv = 0; switch (operation) { @@ -1605,11 +1628,11 @@ int main(int argc, char **argv) break; case OP_DUMP: - do_dump(operation); + rv = do_dump(operation); break; case OP_DUMP_CONFIG: - do_dump(operation); + rv = do_dump(operation); break; case OP_RELOAD_CONFIG: @@ -1621,11 +1644,11 @@ int main(int argc, char **argv) break; case OP_LOG_PLOCK: - do_log_plock(); + rv = do_log_plock(); break; case OP_PLOCKS: - do_plocks(lsname); + rv = do_plocks(lsname); break; case OP_DEADLOCK_CHECK: @@ -1654,9 +1677,15 @@ int main(int argc, char **argv) break; case OP_DUMP_RUN: - do_dump(operation); + rv = do_dump(operation); break; } - return 0; + + if (rv < 0) { + fprintf(stderr, "failed: %s\n", strerror(-rv)); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; } -- 2.31.1