diff --git a/darshan-runtime/lib/darshan-dxt.c b/darshan-runtime/lib/darshan-dxt.c index 7412b4e4c..b9b4845cb 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); +static void annotate_trace_segment(char *extra_info_str); /* DXT output/cleanup routines for darshan-core */ static void dxt_posix_output( @@ -262,6 +263,8 @@ 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; + rec_ref->write_traces[file_rec->write_count].pthread_id = (unsigned long)pthread_self(); + annotate_trace_segment(rec_ref->write_traces[file_rec->write_count].extra_info); file_rec->write_count += 1; DXT_UNLOCK(); @@ -307,6 +310,8 @@ 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; + rec_ref->read_traces[file_rec->read_count].pthread_id = (unsigned long)pthread_self(); + annotate_trace_segment(rec_ref->read_traces[file_rec->read_count].extra_info); file_rec->read_count += 1; DXT_UNLOCK(); @@ -352,6 +357,8 @@ 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; + rec_ref->write_traces[file_rec->write_count].pthread_id = (unsigned long)pthread_self(); + annotate_trace_segment(rec_ref->write_traces[file_rec->write_count].extra_info); file_rec->write_count += 1; DXT_UNLOCK(); @@ -397,6 +404,8 @@ 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; + rec_ref->read_traces[file_rec->read_count].pthread_id = (unsigned long)pthread_self(); + annotate_trace_segment(rec_ref->read_traces[file_rec->read_count].extra_info); file_rec->read_count += 1; DXT_UNLOCK(); @@ -760,6 +769,18 @@ static struct dxt_file_record_ref *dxt_mpiio_track_new_file_record( return(rec_ref); } +static 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'; + } + + 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..7ff889787 100644 --- a/darshan-util/darshan-dxt-logutils.c +++ b/darshan-util/darshan-dxt-logutils.c @@ -70,7 +70,7 @@ static void dxt_swap_segments(struct dxt_file_record *file_rec) int i; segment_info *tmp_seg; - tmp_seg = (segment_info *)((void *)file_rec + sizeof(struct dxt_file_record)); + tmp_seg = (segment_info *)((char *)file_rec + sizeof(struct dxt_file_record)); for(i = 0; i < (file_rec->write_count + file_rec->read_count); i++) { DARSHAN_BSWAP64(&tmp_seg->offset); @@ -86,7 +86,7 @@ static int dxt_log_get_posix_file(darshan_fd fd, void** dxt_posix_buf_p) struct dxt_file_record *rec = *((struct dxt_file_record **)dxt_posix_buf_p); struct dxt_file_record tmp_rec; int ret; - int64_t io_trace_size; + size_t rw_count; if(fd->mod_map[DXT_POSIX_MOD].len == 0) return(0); @@ -112,27 +112,52 @@ static int dxt_log_get_posix_file(darshan_fd fd, void** dxt_posix_buf_p) dxt_swap_file_record(&tmp_rec); } - io_trace_size = (tmp_rec.write_count + tmp_rec.read_count) * - sizeof(segment_info); + rw_count = tmp_rec.write_count + tmp_rec.read_count; if (*dxt_posix_buf_p == NULL) { - rec = malloc(sizeof(struct dxt_file_record) + io_trace_size); + rec = malloc(sizeof(struct dxt_file_record) + rw_count * sizeof(segment_info)); if (!rec) return(-1); } + + /* copy over the metadta of dxt_file_record */ memcpy(rec, &tmp_rec, sizeof(struct dxt_file_record)); - if (io_trace_size > 0) + if (rw_count > 0) { - void *tmp_p = (void *)rec + sizeof(struct dxt_file_record); + char *buf; + int64_t io_trace_size; + + /* Check POSIX DXT format version. When > 1, segment_info contains extra info */ + if (fd->mod_ver[DXT_POSIX_MOD] == 1) { + io_trace_size = rw_count * (sizeof(segment_info) - sizeof(unsigned long) - EXTRA_INFO_LEN); + buf = (char*) malloc(io_trace_size); + if (!buf) return(-1); + } + else { + io_trace_size = rw_count * sizeof(segment_info); + buf = (char *)rec + sizeof(struct dxt_file_record); + } - ret = darshan_log_get_mod(fd, DXT_POSIX_MOD, tmp_p, - io_trace_size); + ret = darshan_log_get_mod(fd, DXT_POSIX_MOD, buf, io_trace_size); if (ret < io_trace_size) ret = -1; else { + if (fd->mod_ver[DXT_POSIX_MOD] == 1) { + /* copy record data over to rec */ + size_t j; + char *src = buf; + char *dest = (char *)rec + sizeof(struct dxt_file_record); + size_t rec_size = sizeof(segment_info) - sizeof(unsigned long) - EXTRA_INFO_LEN; + for (j=0; jswap_flag) { @@ -140,6 +165,9 @@ static int dxt_log_get_posix_file(darshan_fd fd, void** dxt_posix_buf_p) dxt_swap_segments(rec); } } + + if (fd->mod_ver[DXT_POSIX_MOD] == 1) + free(buf); } else { @@ -147,7 +175,7 @@ static int dxt_log_get_posix_file(darshan_fd fd, void** dxt_posix_buf_p) } if(*dxt_posix_buf_p == NULL) - { + { if(ret == 1) *dxt_posix_buf_p = rec; else @@ -163,7 +191,7 @@ static int dxt_log_get_mpiio_file(darshan_fd fd, void** dxt_mpiio_buf_p) struct dxt_file_record tmp_rec; int i; int ret; - int64_t io_trace_size; + size_t rw_count; if(fd->mod_map[DXT_MPIIO_MOD].len == 0) return(0); @@ -189,27 +217,52 @@ static int dxt_log_get_mpiio_file(darshan_fd fd, void** dxt_mpiio_buf_p) dxt_swap_file_record(&tmp_rec); } - io_trace_size = (tmp_rec.write_count + tmp_rec.read_count) * - sizeof(segment_info); + rw_count = tmp_rec.write_count + tmp_rec.read_count; if (*dxt_mpiio_buf_p == NULL) { - rec = malloc(sizeof(struct dxt_file_record) + io_trace_size); + rec = malloc(sizeof(struct dxt_file_record) + rw_count * sizeof(segment_info)); if (!rec) return(-1); } + + /* copy over the metadta of dxt_file_record */ memcpy(rec, &tmp_rec, sizeof(struct dxt_file_record)); - if (io_trace_size > 0) + if (rw_count > 0) { - void *tmp_p = (void *)rec + sizeof(struct dxt_file_record); + char *buf; + int64_t io_trace_size; + + /* Check MPIIO DXT format version. When > 2, segment_info contains extra info */ + if (fd->mod_ver[DXT_MPIIO_MOD] < 3) { + io_trace_size = rw_count * (sizeof(segment_info) - sizeof(unsigned long) - EXTRA_INFO_LEN); + buf = (char*) malloc(io_trace_size); + if (!buf) return(-1); + } + else { + io_trace_size = rw_count * sizeof(segment_info); + buf = (char *)rec + sizeof(struct dxt_file_record); + } - ret = darshan_log_get_mod(fd, DXT_MPIIO_MOD, tmp_p, - io_trace_size); + ret = darshan_log_get_mod(fd, DXT_MPIIO_MOD, buf, io_trace_size); if (ret < io_trace_size) ret = -1; else { + if (fd->mod_ver[DXT_MPIIO_MOD] < 3) { + /* copy record data over to rec */ + size_t j; + char *src = buf; + char *dest = (char *)rec + sizeof(struct dxt_file_record); + size_t rec_size = sizeof(segment_info) - sizeof(unsigned long) - EXTRA_INFO_LEN; + for (j=0; jswap_flag) { @@ -220,12 +273,16 @@ static int dxt_log_get_mpiio_file(darshan_fd fd, void** dxt_mpiio_buf_p) if(fd->mod_ver[DXT_MPIIO_MOD] == 1) { /* make sure to indicate offsets are invalid in version 1 */ - for(i = 0; i < (tmp_rec.write_count + tmp_rec.read_count); i++) + segment_info *tmp_p = (segment_info*)((char *)rec + sizeof(struct dxt_file_record)); + for(i = 0; i < rw_count; i++) { - ((segment_info *)tmp_p)[i].offset = -1; + tmp_p[i].offset = -1; } } } + + if (fd->mod_ver[DXT_MPIIO_MOD] < 3) + free(buf); } else { @@ -286,7 +343,7 @@ static void dxt_log_print_mpiio_file_darshan(void *file_rec, char *file_name, } void dxt_log_print_posix_file(void *posix_file_rec, char *file_name, - char *mnt_pt, char *fs_type, struct lustre_record_ref *lustre_rec_ref) + char *mnt_pt, char *fs_type, struct lustre_record_ref *lustre_rec_ref, uint32_t *mod_ver) { struct dxt_file_record *file_rec = (struct dxt_file_record *)posix_file_rec; @@ -294,6 +351,8 @@ void dxt_log_print_posix_file(void *posix_file_rec, char *file_name, int64_t length; double start_time; double end_time; + unsigned long pthread_id; + char *extra_info; int i, j; darshan_record_id f_id = file_rec->base_rec.id; @@ -303,7 +362,7 @@ void dxt_log_print_posix_file(void *posix_file_rec, char *file_name, int64_t write_count = file_rec->write_count; int64_t read_count = file_rec->read_count; segment_info *io_trace = (segment_info *) - ((void *)file_rec + sizeof(struct dxt_file_record)); + ((char *)file_rec + sizeof(struct dxt_file_record)); /* Lustre File System */ struct darshan_lustre_record *rec; @@ -349,11 +408,16 @@ void dxt_log_print_posix_file(void *posix_file_rec, char *file_name, } /* Print header */ - printf("# Module Rank Wt/Rd Segment Offset Length Start(s) End(s)"); + if (mod_ver[DXT_POSIX_MOD] > 1) + printf("# Module Rank Pthread-ID Wt/Rd Segment Offset Length Start(s) End(s)"); + else + printf("# Module Rank Wt/Rd Segment Offset Length Start(s) End(s)"); if (lustreFS) { printf(" [OST]"); } + if (mod_ver[DXT_POSIX_MOD] > 1) + printf(" Extra info"); printf("\n"); /* Print IO Traces information */ @@ -362,8 +426,14 @@ 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; + pthread_id = io_trace[i].pthread_id; + extra_info = io_trace[i].extra_info; + if (extra_info == NULL || *extra_info == '\0') extra_info = "None"; - 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); + if (mod_ver[DXT_POSIX_MOD] > 1) + printf("%8s%8" PRId64 "%18lu%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f ", "X_POSIX", rank, pthread_id, "write", i, offset, length, start_time, end_time); + else + 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); if (lustreFS) { cur_file_offset = offset; @@ -398,9 +468,12 @@ void dxt_log_print_posix_file(void *posix_file_rec, char *file_name, } cur_ost_offset += stripe_count; } + if (rec->num_comps) printf(" "); } - - printf("\n"); + if (mod_ver[DXT_POSIX_MOD] > 1) + printf("%s\n", extra_info); + else + printf("\n"); } for (i = write_count; i < write_count + read_count; i++) { @@ -408,8 +481,14 @@ 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; + pthread_id = io_trace[i].pthread_id; + extra_info = io_trace[i].extra_info; + if (extra_info == NULL || *extra_info == '\0') extra_info = "None"; - 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); + if (mod_ver[DXT_POSIX_MOD] > 1) + printf("%8s%8" PRId64 "%18lu%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f ", "X_POSIX", rank, pthread_id, "read", (int)(i - write_count), offset, length, start_time, end_time); + else + 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); if (lustreFS) { cur_file_offset = offset; @@ -444,15 +523,19 @@ void dxt_log_print_posix_file(void *posix_file_rec, char *file_name, } cur_ost_offset += stripe_count; } + if (rec->num_comps) printf(" "); } - printf("\n"); + if (mod_ver[DXT_POSIX_MOD] > 1) + printf("%s\n", extra_info); + else + printf("\n"); } return; } void dxt_log_print_mpiio_file(void *mpiio_file_rec, char *file_name, - char *mnt_pt, char *fs_type) + char *mnt_pt, char *fs_type, uint32_t *mod_ver) { struct dxt_file_record *file_rec = (struct dxt_file_record *)mpiio_file_rec; @@ -461,6 +544,8 @@ void dxt_log_print_mpiio_file(void *mpiio_file_rec, char *file_name, int64_t offset; double start_time; double end_time; + unsigned long pthread_id; + char * extra_info; int i; darshan_record_id f_id = file_rec->base_rec.id; @@ -471,7 +556,7 @@ void dxt_log_print_mpiio_file(void *mpiio_file_rec, char *file_name, int64_t read_count = file_rec->read_count; segment_info *io_trace = (segment_info *) - ((void *)file_rec + sizeof(struct dxt_file_record)); + ((char *)file_rec + sizeof(struct dxt_file_record)); printf("\n# DXT, file_id: %" PRIu64 ", file_name: %s\n", f_id, file_name); printf("# DXT, rank: %" PRId64 ", hostname: %s\n", rank, hostname); @@ -481,7 +566,10 @@ void dxt_log_print_mpiio_file(void *mpiio_file_rec, char *file_name, printf("# DXT, mnt_pt: %s, fs_type: %s\n", mnt_pt, fs_type); /* Print header */ - printf("# Module Rank Wt/Rd Segment Offset Length Start(s) End(s)\n"); + if (mod_ver[DXT_MPIIO_MOD] > 2) + printf("# Module Rank Pthread-ID Wt/Rd Segment Offset Length Start(s) End(s) Extra info\n"); + else + printf("# Module Rank Wt/Rd Segment Offset Length Start(s) End(s)\n"); /* Print IO Traces information */ for (i = 0; i < write_count; i++) { @@ -489,8 +577,14 @@ 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; + pthread_id = io_trace[i].pthread_id; + extra_info = io_trace[i].extra_info; + if (extra_info == NULL || *extra_info == '\0') extra_info = "None"; - 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); + if (mod_ver[DXT_MPIIO_MOD] > 2) + printf("%8s%8" PRId64 "%18lu%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f %s\n", "X_MPIIO", rank, pthread_id, "write", i, offset, length, start_time, end_time, extra_info); + else + 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); } for (i = write_count; i < write_count + read_count; i++) { @@ -498,8 +592,14 @@ 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; + pthread_id = io_trace[i].pthread_id; + extra_info = io_trace[i].extra_info; + if (extra_info == NULL || *extra_info == '\0') extra_info = "None"; - 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); + if (mod_ver[DXT_MPIIO_MOD] > 2) + printf("%8s%8" PRId64 "%18lu%7s%9d%16" PRId64 "%16" PRId64 "%12.4f%12.4f %s\n", "X_MPIIO", rank, pthread_id, "read", (int)(i - write_count), offset, length, start_time, end_time, extra_info); + else + 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); } return; diff --git a/darshan-util/darshan-dxt-logutils.h b/darshan-util/darshan-dxt-logutils.h index f58df8e39..098accc28 100644 --- a/darshan-util/darshan-dxt-logutils.h +++ b/darshan-util/darshan-dxt-logutils.h @@ -12,8 +12,8 @@ extern struct darshan_mod_logutil_funcs dxt_posix_logutils; extern struct darshan_mod_logutil_funcs dxt_mpiio_logutils; void dxt_log_print_posix_file(void *file_rec, char *file_name, - char *mnt_pt, char *fs_type, struct lustre_record_ref *rec_ref); + char *mnt_pt, char *fs_type, struct lustre_record_ref *rec_ref, uint32_t *mod_ver); void dxt_log_print_mpiio_file(void *file_rec, - char *file_name, char *mnt_pt, char *fs_type); + char *file_name, char *mnt_pt, char *fs_type, uint32_t *mod_ver); #endif diff --git a/darshan-util/darshan-dxt-parser.c b/darshan-util/darshan-dxt-parser.c index dbab3f055..1d723b515 100644 --- a/darshan-util/darshan-dxt-parser.c +++ b/darshan-util/darshan-dxt-parser.c @@ -48,7 +48,7 @@ int main(int argc, char **argv) char *token; char *save; char buffer[DARSHAN_JOB_METADATA_LEN]; - struct lustre_record_ref *lustre_rec_ref, *tmp_lustre_rec_ref; + struct lustre_record_ref *lustre_rec_ref=NULL, *tmp_lustre_rec_ref; struct lustre_record_ref *lustre_rec_hash = NULL; char *mod_buf = NULL; @@ -316,11 +316,11 @@ int main(int argc, char **argv) HASH_FIND(hlink, lustre_rec_hash, &(base_rec->id), sizeof(darshan_record_id), lustre_rec_ref); - dxt_log_print_posix_file(mod_buf, rec_name, - mnt_pt, fs_type, lustre_rec_ref); + dxt_log_print_posix_file(mod_buf, rec_name, mnt_pt, fs_type, + lustre_rec_ref, fd->mod_ver); } else if (i == DXT_MPIIO_MOD){ - dxt_log_print_mpiio_file(mod_buf, rec_name, - mnt_pt, fs_type); + dxt_log_print_mpiio_file(mod_buf, rec_name, mnt_pt, fs_type, + fd->mod_ver); } free(mod_buf); diff --git a/darshan-util/pydarshan/darshan/backend/api_def_c.py b/darshan-util/pydarshan/darshan/backend/api_def_c.py index d0cb6be3a..32e2b4fae 100644 --- a/darshan-util/pydarshan/darshan/backend/api_def_c.py +++ b/darshan-util/pydarshan/darshan/backend/api_def_c.py @@ -200,11 +200,15 @@ int64_t read_count; }; +#define EXTRA_INFO_LEN 64 + typedef struct segment_info { int64_t offset; int64_t length; double start_time; double end_time; + unsigned long pthread_id; + char extra_info[EXTRA_INFO_LEN]; } 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..7c38acf04 100644 --- a/darshan-util/pydarshan/darshan/backend/cffi_backend.py +++ b/darshan-util/pydarshan/darshan/backend/cffi_backend.py @@ -595,6 +595,25 @@ def log_get_dxt_record(log, mod_name, reads=True, writes=True, dtype='dict'): mod_type = _structdefs[mod_name] #name_records = log_get_name_records(log) + if 'DXT_POSIX' in log['modules']: + # retrieve file's DXT_POSIX version number + dxt_posix_ver = log['modules']['DXT_POSIX']['ver'] + + if 'DXT_MPIIO' in log['modules']: + # retrieve file's DXT_MPIIO version number + dxt_mpiio_ver = log['modules']['DXT_MPIIO']['ver'] + + append_pthread_id = True + append_extra_info = True + if mod_name == 'DXT_POSIX' and dxt_posix_ver < 2: + # DXT_POSIX_VER 2 and later has pthread_id and extra_info field added + append_pthread_id = False + append_extra_info = False + elif mod_name == 'DXT_MPIIO' and dxt_mpiio_ver < 3: + # DXT_MPIIO_VER 3 and later has pthread_id and extra_info field added + append_pthread_id = False + append_extra_info = False + rec = {} buf = ffi.new("void **") r = libdutil.darshan_log_get_record(log['handle'], modules[mod_name]['idx'], buf) @@ -620,7 +639,6 @@ def log_get_dxt_record(log, mod_name, reads=True, writes=True, dtype='dict'): size_of = ffi.sizeof("struct dxt_file_record") segments = ffi.cast("struct segment_info *", buf[0] + size_of ) - for i in range(wcnt): seg = { "offset": segments[i].offset, @@ -628,19 +646,48 @@ def log_get_dxt_record(log, mod_name, reads=True, writes=True, dtype='dict'): "start_time": segments[i].start_time, "end_time": segments[i].end_time } - rec['write_segments'].append(seg) + if append_pthread_id: + # append field of pthread_id + seg["pthread_id"] = segments[i].pthread_id + + if append_extra_info: + # append field of extra_info + info_str = ffi.string(segments[i].extra_info) + if not info_str: + extra_info_str = info_str.decode("utf-8") + else: + extra_info_str = "" + + seg["extra_info"] = extra_info_str + + rec['write_segments'].append(seg) for i in range(rcnt): i = i + wcnt + seg = { "offset": segments[i].offset, "length": segments[i].length, "start_time": segments[i].start_time, "end_time": segments[i].end_time } - rec['read_segments'].append(seg) + if append_pthread_id: + # append field of pthread_id + seg["pthread_id"] = segments[i].pthread_id + + if append_extra_info: + # append field of extra_info + info_str = ffi.string(segments[i].extra_info) + if not info_str: + extra_info_str = info_str.decode("utf-8") + else: + extra_info_str = "" + + seg["extra_info"] = extra_info_str + + rec['read_segments'].append(seg) if dtype == "pandas": rec['read_segments'] = pd.DataFrame(rec['read_segments']) diff --git a/include/darshan-dxt-log-format.h b/include/darshan-dxt-log-format.h index b31fc9928..bc68e0678 100644 --- a/include/darshan-dxt-log-format.h +++ b/include/darshan-dxt-log-format.h @@ -7,9 +7,10 @@ #define __DARSHAN_DXT_LOG_FORMAT_H /* current DXT log format version */ -#define DXT_POSIX_VER 1 -#define DXT_MPIIO_VER 2 +#define DXT_POSIX_VER 2 +#define DXT_MPIIO_VER 3 +#define EXTRA_INFO_LEN 64 #define HOSTNAME_SIZE 64 /* @@ -21,6 +22,8 @@ typedef struct segment_info { int64_t length; double start_time; double end_time; + unsigned long pthread_id; + char extra_info[EXTRA_INFO_LEN]; } segment_info; #define X(a) a,