diff --git a/darshan-runtime/lib/darshan-dxt.c b/darshan-runtime/lib/darshan-dxt.c index 7412b4e4c..fd2407353 100644 --- a/darshan-runtime/lib/darshan-dxt.c +++ b/darshan-runtime/lib/darshan-dxt.c @@ -108,6 +108,7 @@ static struct dxt_file_record_ref *dxt_posix_track_new_file_record( darshan_record_id rec_id); static struct dxt_file_record_ref *dxt_mpiio_track_new_file_record( darshan_record_id rec_id); +void annotate_trace_segment(char *extra_info_str); /* DXT output/cleanup routines for darshan-core */ static void dxt_posix_output( @@ -262,6 +263,7 @@ void dxt_posix_write(darshan_record_id rec_id, int64_t offset, rec_ref->write_traces[file_rec->write_count].length = length; rec_ref->write_traces[file_rec->write_count].start_time = start_time; rec_ref->write_traces[file_rec->write_count].end_time = end_time; + annotate_trace_segment(rec_ref->write_traces[file_rec->write_count].extra_info); file_rec->write_count += 1; DXT_UNLOCK(); @@ -307,6 +309,7 @@ void dxt_posix_read(darshan_record_id rec_id, int64_t offset, rec_ref->read_traces[file_rec->read_count].length = length; rec_ref->read_traces[file_rec->read_count].start_time = start_time; rec_ref->read_traces[file_rec->read_count].end_time = end_time; + annotate_trace_segment(rec_ref->read_traces[file_rec->read_count].extra_info); file_rec->read_count += 1; DXT_UNLOCK(); @@ -352,6 +355,7 @@ void dxt_mpiio_write(darshan_record_id rec_id, int64_t offset, rec_ref->write_traces[file_rec->write_count].offset = offset; rec_ref->write_traces[file_rec->write_count].start_time = start_time; rec_ref->write_traces[file_rec->write_count].end_time = end_time; + annotate_trace_segment(rec_ref->write_traces[file_rec->write_count].extra_info); file_rec->write_count += 1; DXT_UNLOCK(); @@ -397,6 +401,7 @@ void dxt_mpiio_read(darshan_record_id rec_id, int64_t offset, rec_ref->read_traces[file_rec->read_count].offset = offset; rec_ref->read_traces[file_rec->read_count].start_time = start_time; rec_ref->read_traces[file_rec->read_count].end_time = end_time; + annotate_trace_segment(rec_ref->read_traces[file_rec->read_count].extra_info); file_rec->read_count += 1; DXT_UNLOCK(); @@ -760,6 +765,23 @@ static struct dxt_file_record_ref *dxt_mpiio_track_new_file_record( return(rec_ref); } +void annotate_trace_segment(char *extra_info_str) +{ + char *extra_info_env = getenv("DARSHAN_DXT_EXTRA_INFO"); + if (extra_info_env != NULL) { + strncpy(extra_info_str, extra_info_env, EXTRA_INFO_LEN-1); + } else { + extra_info_str[0] = '\0'; + } + unsigned long pthread_id = (unsigned long)pthread_self(); + if(strlen(extra_info_str)) + strcat(extra_info_str, " "); + snprintf(extra_info_str + strlen(extra_info_str), EXTRA_INFO_LEN-1-strlen(extra_info_str), + "pthread_id=%lu", pthread_id); + + return; +} + static void dxt_free_record_data(void *rec_ref_p, void *user_ptr) { struct dxt_file_record_ref *dxt_rec_ref = (struct dxt_file_record_ref *)rec_ref_p; diff --git a/darshan-util/darshan-dxt-logutils.c b/darshan-util/darshan-dxt-logutils.c index af1520e38..950c024e9 100644 --- a/darshan-util/darshan-dxt-logutils.c +++ b/darshan-util/darshan-dxt-logutils.c @@ -294,6 +294,7 @@ void dxt_log_print_posix_file(void *posix_file_rec, char *file_name, int64_t length; double start_time; double end_time; + char *extra_info; int i, j; darshan_record_id f_id = file_rec->base_rec.id; @@ -362,8 +363,9 @@ void dxt_log_print_posix_file(void *posix_file_rec, char *file_name, length = io_trace[i].length; start_time = io_trace[i].start_time; end_time = io_trace[i].end_time; + extra_info = io_trace[i].extra_info; - printf("%8s%8" PRId64 "%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f ", "X_POSIX", rank, "write", i, offset, length, start_time, end_time); + printf("%8s%8" PRId64 "%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f\t%s", "X_POSIX", rank, "write", i, offset, length, start_time, end_time, extra_info); if (lustreFS) { cur_file_offset = offset; @@ -408,8 +410,9 @@ void dxt_log_print_posix_file(void *posix_file_rec, char *file_name, length = io_trace[i].length; start_time = io_trace[i].start_time; end_time = io_trace[i].end_time; + extra_info = io_trace[i].extra_info; - printf("%8s%8" PRId64 "%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f ", "X_POSIX", rank, "read", (int)(i - write_count), offset, length, start_time, end_time); + printf("%8s%8" PRId64 "%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f\t%s", "X_POSIX", rank, "read", (int)(i - write_count), offset, length, start_time, end_time, extra_info); if (lustreFS) { cur_file_offset = offset; @@ -461,6 +464,7 @@ void dxt_log_print_mpiio_file(void *mpiio_file_rec, char *file_name, int64_t offset; double start_time; double end_time; + char * extra_info; int i; darshan_record_id f_id = file_rec->base_rec.id; @@ -489,8 +493,10 @@ void dxt_log_print_mpiio_file(void *mpiio_file_rec, char *file_name, length = io_trace[i].length; start_time = io_trace[i].start_time; end_time = io_trace[i].end_time; + extra_info = io_trace[i].extra_info; + if (extra_info == NULL) extra_info = ""; - printf("%8s%8" PRId64 "%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f\n", "X_MPIIO", rank, "write", i, offset, length, start_time, end_time); + printf("%8s%8" PRId64 "%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f\t%s\n", "X_MPIIO", rank, "write", i, offset, length, start_time, end_time, extra_info); } for (i = write_count; i < write_count + read_count; i++) { @@ -499,7 +505,7 @@ void dxt_log_print_mpiio_file(void *mpiio_file_rec, char *file_name, start_time = io_trace[i].start_time; end_time = io_trace[i].end_time; - printf("%8s%8" PRId64 "%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f\n", "X_MPIIO", rank, "read", (int)(i - write_count), offset, length, start_time, end_time); + printf("%8s%8" PRId64 "%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f\t%s\n", "X_MPIIO", rank, "read", (int)(i - write_count), offset, length, start_time, end_time, extra_info); } return; diff --git a/darshan-util/pydarshan/darshan/backend/api_def_c.py b/darshan-util/pydarshan/darshan/backend/api_def_c.py index d0cb6be3a..b457f5096 100644 --- a/darshan-util/pydarshan/darshan/backend/api_def_c.py +++ b/darshan-util/pydarshan/darshan/backend/api_def_c.py @@ -205,6 +205,7 @@ int64_t length; double start_time; double end_time; + char extra_info[64]; } segment_info; /* counter names */ diff --git a/darshan-util/pydarshan/darshan/backend/cffi_backend.py b/darshan-util/pydarshan/darshan/backend/cffi_backend.py index 34fcfa580..52fed0bdd 100644 --- a/darshan-util/pydarshan/darshan/backend/cffi_backend.py +++ b/darshan-util/pydarshan/darshan/backend/cffi_backend.py @@ -626,7 +626,8 @@ def log_get_dxt_record(log, mod_name, reads=True, writes=True, dtype='dict'): "offset": segments[i].offset, "length": segments[i].length, "start_time": segments[i].start_time, - "end_time": segments[i].end_time + "end_time": segments[i].end_time, + "extra_info": ffi.string(segments[i].extra_info).decode("utf-8") } rec['write_segments'].append(seg) @@ -637,7 +638,8 @@ def log_get_dxt_record(log, mod_name, reads=True, writes=True, dtype='dict'): "offset": segments[i].offset, "length": segments[i].length, "start_time": segments[i].start_time, - "end_time": segments[i].end_time + "end_time": segments[i].end_time, + "extra_info": ffi.string(segments[i].extra_info).decode("utf-8") } rec['read_segments'].append(seg) diff --git a/include/darshan-dxt-log-format.h b/include/darshan-dxt-log-format.h index b31fc9928..5f40ae837 100644 --- a/include/darshan-dxt-log-format.h +++ b/include/darshan-dxt-log-format.h @@ -10,6 +10,7 @@ #define DXT_POSIX_VER 1 #define DXT_MPIIO_VER 2 +#define EXTRA_INFO_LEN 64 #define HOSTNAME_SIZE 64 /* @@ -21,6 +22,7 @@ typedef struct segment_info { int64_t length; double start_time; double end_time; + char extra_info[EXTRA_INFO_LEN]; } segment_info; #define X(a) a,