From 7b6aa92859e62041a7a8c39c38ba1c273ceeaadf Mon Sep 17 00:00:00 2001
From: Morris Jette <jette@schedmd.com>
Date: Thu, 28 Jul 2011 14:01:54 -0700
Subject: [PATCH] sinfo: Fix incorrect timestamp in sinfo -R output

sinfo does not check for differing reason timestamps when coalescing output
for sinfo -R and -Rl. This leads to incorrect timestamps in output if two
nodes are down with the same reason string but at a different time.

This fix adds a timestamp_reason_flag and a test to determine if
timestamps are equivalent before coalescing lines of output.

(Note: This patch is not an ideal fix for this issue. It would be much
better if the sinfo output handlers (_print_* in sinfo/print.c) could
also be called by sinfo to see if two lines of output were going
to be equivalent and could be coalesced. This would do away with the
separately kept "match_flags" which (as is seen here) are cumbersome
to maintain.)
Patch from Mark Grondona, LLNL.
---
 src/sinfo/opts.c  | 3 +++
 src/sinfo/sinfo.c | 5 +++++
 src/sinfo/sinfo.h | 1 +
 3 files changed, 9 insertions(+)

diff --git a/src/sinfo/opts.c b/src/sinfo/opts.c
index a2fdf82f2dd..b1fc5f2921f 100644
--- a/src/sinfo/opts.c
+++ b/src/sinfo/opts.c
@@ -565,6 +565,7 @@ _parse_format( char* format )
 					right_justify,
 					suffix );
 		} else if (field[0] == 'H') {
+			params.match_flags.reason_timestamp_flag = true;
 			format_add_timestamp( params.format_list,
 					      field_size,
 					      right_justify,
@@ -811,6 +812,8 @@ void _print_options( void )
 			"true" : "false");
 	printf("reason_flag     = %s\n", params.match_flags.reason_flag ?
 			"true" : "false");
+	printf("reason_timestamp_flag = %s\n",
+			params.match_flags.reason_timestamp_flag ?  "true" : "false");
 	printf("root_flag       = %s\n", params.match_flags.root_flag ?
 			"true" : "false");
 	printf("share_flag      = %s\n", params.match_flags.share_flag ?
diff --git a/src/sinfo/sinfo.c b/src/sinfo/sinfo.c
index df687fc1bb1..c054e26c717 100644
--- a/src/sinfo/sinfo.c
+++ b/src/sinfo/sinfo.c
@@ -514,6 +514,11 @@ static bool _match_node_data(sinfo_data_t *sinfo_ptr, node_info_t *node_ptr)
 	    (_strcmp(node_ptr->reason, sinfo_ptr->reason)))
 		return false;
 
+	if (sinfo_ptr->nodes &&
+	    params.match_flags.reason_timestamp_flag &&
+	    (node_ptr->reason_time != sinfo_ptr->reason_time))
+		return false;
+
 	if (params.match_flags.state_flag) {
 		char *state1, *state2;
 		state1 = node_state_string(node_ptr->node_state);
diff --git a/src/sinfo/sinfo.h b/src/sinfo/sinfo.h
index 8e9dcef8ade..e0cdb2cfc69 100644
--- a/src/sinfo/sinfo.h
+++ b/src/sinfo/sinfo.h
@@ -141,6 +141,7 @@ struct sinfo_match_flags {
 	bool share_flag;
 	bool state_flag;
 	bool weight_flag;
+	bool reason_timestamp_flag;
 };
 
 /* Input parameters */
-- 
GitLab