Skip to content

Commit dd64f89

Browse files
committed
Check DXT_POSIX and DXT_MPIIO versions of input log file
For DXT_POSIX_VER < 2 and DXT_MPIIO_VER < 3, the segments object does NOT contain the extra info field.
1 parent 3b83b2d commit dd64f89

File tree

1 file changed

+41
-7
lines changed

1 file changed

+41
-7
lines changed

darshan-util/pydarshan/darshan/backend/cffi_backend.py

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,22 @@ def log_get_dxt_record(log, mod_name, reads=True, writes=True, dtype='dict'):
595595
mod_type = _structdefs[mod_name]
596596
#name_records = log_get_name_records(log)
597597

598+
if 'DXT_POSIX' in log['modules']:
599+
# retrieve file's DXT_POSIX version number
600+
dxt_posix_ver = log['modules']['DXT_POSIX']['ver']
601+
602+
if 'DXT_MPIIO' in log['modules']:
603+
# retrieve file's DXT_MPIIO version number
604+
dxt_mpiio_ver = log['modules']['DXT_MPIIO']['ver']
605+
606+
append_extra_info = True
607+
if mod_name == 'DXT_POSIX' and dxt_posix_ver < 2:
608+
# DXT_POSIX_VER 2 and later has extra_info field added
609+
append_extra_info = False
610+
elif mod_name == 'DXT_MPIIO' and dxt_mpiio_ver < 3:
611+
# DXT_MPIIO_VER 3 and later has extra_info field added
612+
append_extra_info = False
613+
598614
rec = {}
599615
buf = ffi.new("void **")
600616
r = libdutil.darshan_log_get_record(log['handle'], modules[mod_name]['idx'], buf)
@@ -620,29 +636,47 @@ def log_get_dxt_record(log, mod_name, reads=True, writes=True, dtype='dict'):
620636
size_of = ffi.sizeof("struct dxt_file_record")
621637
segments = ffi.cast("struct segment_info *", buf[0] + size_of )
622638

623-
624639
for i in range(wcnt):
625640
seg = {
626641
"offset": segments[i].offset,
627642
"length": segments[i].length,
628643
"start_time": segments[i].start_time,
629-
"end_time": segments[i].end_time,
630-
"extra_info": ffi.string(segments[i].extra_info).decode("utf-8")
644+
"end_time": segments[i].end_time
631645
}
632-
rec['write_segments'].append(seg)
633646

647+
if append_extra_info:
648+
# append field of extra_info
649+
info_str = ffi.string(segments[i].extra_info)
650+
if not info_str:
651+
extra_info_str = info_str.decode("utf-8")
652+
else:
653+
extra_info_str = ""
654+
655+
seg["extra_info"] = extra_info_str
656+
657+
rec['write_segments'].append(seg)
634658

635659
for i in range(rcnt):
636660
i = i + wcnt
661+
637662
seg = {
638663
"offset": segments[i].offset,
639664
"length": segments[i].length,
640665
"start_time": segments[i].start_time,
641-
"end_time": segments[i].end_time,
642-
"extra_info": ffi.string(segments[i].extra_info).decode("utf-8")
666+
"end_time": segments[i].end_time
643667
}
644-
rec['read_segments'].append(seg)
645668

669+
if append_extra_info:
670+
# append field of extra_info
671+
info_str = ffi.string(segments[i].extra_info)
672+
if not info_str:
673+
extra_info_str = info_str.decode("utf-8")
674+
else:
675+
extra_info_str = ""
676+
677+
seg["extra_info"] = extra_info_str
678+
679+
rec['read_segments'].append(seg)
646680

647681
if dtype == "pandas":
648682
rec['read_segments'] = pd.DataFrame(rec['read_segments'])

0 commit comments

Comments
 (0)