[Cluster-devel] [PATCH 02/10] dlm_tool: add run_(check|cancel) all feature

Heming Zhao heming.zhao at suse.com
Sun Sep 19 06:43:14 UTC 2021


Current run_check and run_cancel require uuid for executing.
If users want to check/cancel all commands, they must input every
command uuid, which is a boring action.
This commit add a new option "-A", which makes one time travel
all the command without uuid.

Signed-off-by: Heming Zhao <heming.zhao at suse.com>
---
 dlm_tool/dlm_tool.8 |  5 ++-
 dlm_tool/main.c     | 80 ++++++++++++++++++++++++++++++++-------------
 2 files changed, 62 insertions(+), 23 deletions(-)

diff --git a/dlm_tool/dlm_tool.8 b/dlm_tool/dlm_tool.8
index 056c4af0213c..086596c67dbf 100644
--- a/dlm_tool/dlm_tool.8
+++ b/dlm_tool/dlm_tool.8
@@ -110,6 +110,9 @@ Wide lockdebug output
 .B \-M
 Include MSTCPY locks in lockdump output
 
+.B \-A
+Include all uuid in run_check and run_cancel
+
 .B \-h
 Print help, then exit
 
@@ -177,7 +180,7 @@ dlm_tool run|run_start [-n] \fIcommand\fP
 
 -
 
-dlm_tool run_check|run_cancel [-i "sec"] \fIuuid\fP
+dlm_tool run_check|run_cancel [-A] [-i "sec"] \fIuuid\fP
 
 -
 
diff --git a/dlm_tool/main.c b/dlm_tool/main.c
index 53d9336d59c6..37f381f6d980 100644
--- a/dlm_tool/main.c
+++ b/dlm_tool/main.c
@@ -53,6 +53,7 @@ static char *lsname;
 static int operation;
 static int opt_ind;
 static int ls_all_nodes = 0;
+static int opt_all_uuid = 0;
 static int opt_excl = 0;
 static int opt_fs = 0;
 static int dump_mstcpy = 0;
@@ -215,7 +216,7 @@ static void print_usage(void)
 	printf("\n");
 }
 
-#define OPTION_STRING "MhVnm:e:f:vwsi:"
+#define OPTION_STRING "MhVAnm:e:f:vwsi:"
 
 static void decode_arguments(int argc, char **argv)
 {
@@ -254,6 +255,10 @@ static void decode_arguments(int argc, char **argv)
 			ls_all_nodes = 1;
 			break;
 
+		case 'A':
+			opt_all_uuid = 1;
+			break;
+
 		case 's':
 			summarize = 1;
 			break;
@@ -456,8 +461,10 @@ static void decode_arguments(int argc, char **argv)
 		fprintf(stderr, "command required\n");
 		exit(EXIT_FAILURE);
 	} else if (need_uuid) {
-		fprintf(stderr, "uuid required\n");
-		exit(EXIT_FAILURE);
+		if (!opt_all_uuid) {
+			fprintf(stderr, "uuid required\n");
+			exit(EXIT_FAILURE);
+		}
 	} else {
 		fprintf(stderr, "missing arg\n");
 		exit(EXIT_FAILURE);
@@ -1486,14 +1493,42 @@ static void do_log_plock(void)
 	printf("\n");
 }
 
+static int check_or_cancel(int do_cancel)
+{
+	uint32_t flags = 0;
+	uint32_t check_status = 0;
+	int rv = 0;
+
+	if (do_cancel)
+		flags = DLMC_FLAG_RUN_CHECK_CANCEL;
+	else
+		flags = DLMC_FLAG_RUN_CHECK_CLEAR;
+
+	rv = dlmc_run_check(run_uuid, strlen(run_uuid), wait_sec, flags,
+			&check_status);
+
+	printf("check_status: ");
+
+	if (check_status & DLMC_RUN_STATUS_WAITING)
+		printf("waiting ");
+	if (check_status & DLMC_RUN_STATUS_DONE)
+		printf("done ");
+	if (check_status & DLMC_RUN_STATUS_FAILED)
+		printf("failed ");
+	printf("\n");
+	return rv;
+}
+
 static int do_run(int op)
 {
 	int do_start = (op == OP_RUN) || (op == OP_RUN_START);
 	int do_check = (op == OP_RUN) || (op == OP_RUN_CHECK);
 	int do_cancel = (op == OP_RUN_CANCEL);
 	uint32_t flags = 0;
-	uint32_t check_status = 0;
-	int rv = 0;
+	int rv = 0, pos = 0;
+	char buf[DLMC_DUMP_SIZE];
+	char *p;
+
 
 	if (do_start) {
 		/* FIXME: use proper option to specify */
@@ -1508,23 +1543,24 @@ static int do_run(int op)
 	}
 
 	if (do_check || do_cancel) {
-		if (do_cancel)
-			flags = DLMC_FLAG_RUN_CHECK_CANCEL;
-		else
-			flags = DLMC_FLAG_RUN_CHECK_CLEAR;
-
-		rv = dlmc_run_check(run_uuid, strlen(run_uuid), wait_sec, flags,
-				    &check_status);
-
-		printf("check_status: ");
-
-		if (check_status & DLMC_RUN_STATUS_WAITING)
-			printf("waiting ");
-		if (check_status & DLMC_RUN_STATUS_DONE)
-			printf("done ");
-		if (check_status & DLMC_RUN_STATUS_FAILED)
-			printf("failed ");
-		printf("\n");
+		if (opt_all_uuid) {
+			memset(buf, 0, sizeof(buf));
+			dlmc_dump_run(buf);
+			buf[DLMC_DUMP_SIZE-1] = '\0';
+			while (1) {
+				p = strstr(buf + pos, "run_uuid ");
+				if (!p)
+					break;
+				pos = p - buf;
+				sscanf(buf + pos, "run_uuid %s start_nodeid", run_uuid);
+				pos += 10 + strlen(run_uuid); /* 10: "run_uuid" + 2 spaces */
+				printf("uuid: %s\n", run_uuid);
+				rv += check_or_cancel(do_cancel);
+			}
+			return rv;
+		} else {
+			rv = check_or_cancel(do_cancel);
+		}
 	}
 
 	return rv;
-- 
2.32.0





More information about the Cluster-devel mailing list