Currently, nfsiostat assumes that if old mountstats are provided, then 'old' will contain all the new devices as well, and will therefore crash if outputting multiple iterations and a new nfs mount occurs between iterations. 'mountstats iostat' covers the new-nfs-mount situation by checking that the old mountstats contains the device before referencing it. It also verifies both old and new mountpoints are the same type. Therefore, make the nfsiostat output function like mountstats. However nfsiostat also has to allow sorting, so we can't just output the full/diff stats as we go. Instead, put the stats to output into a list to display, sort the list if necessary, then output the stats at the end. Signed-off-by: Frank Sorenson <sorenson@xxxxxxxxxx> --- tools/nfs-iostat/nfs-iostat.py | 42 ++++++++++++---------------------- 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py index 95176a4b..bf5eead9 100755 --- a/tools/nfs-iostat/nfs-iostat.py +++ b/tools/nfs-iostat/nfs-iostat.py @@ -476,41 +476,27 @@ def parse_stats_file(filename): return ms_dict def print_iostat_summary(old, new, devices, time, options): - stats = {} - diff_stats = {} - devicelist = [] - if old: - # Trim device list to only include intersection of old and new data, - # this addresses umounts due to autofs mountpoints - for device in devices: - if "fstype autofs" not in str(old[device]): - devicelist.append(device) - else: - devicelist = devices + display_stats = {} - for device in devicelist: - stats[device] = DeviceData() - stats[device].parse_stats(new[device]) - if old: + for device in devices: + stats = DeviceData() + stats.parse_stats(new[device]) + if old and device in old: old_stats = DeviceData() old_stats.parse_stats(old[device]) - diff_stats[device] = stats[device].compare_iostats(old_stats) + if stats.fstype() == old_stats.fstype(): + display_stats[device] = stats.compare_iostats(old_stats) + else: # device is in old, but fstypes are different + display_stats[device] = stats + else: # device is only in new + display_stats[device] = stats if options.sort: - if old: - # We now have compared data and can print a comparison - # ordered by mountpoint ops per second - devicelist.sort(key=lambda x: diff_stats[x].ops(time), reverse=True) - else: - # First iteration, just sort by newly parsed ops/s - devicelist.sort(key=lambda x: stats[x].ops(time), reverse=True) + devices.sort(key=lambda x: display_stats[x].ops(time), reverse=True) count = 1 - for device in devicelist: - if old: - diff_stats[device].display_iostats(time, options.which) - else: - stats[device].display_iostats(time, options.which) + for device in devices: + display_stats[device].display_iostats(time, options.which) count += 1 if (count > options.list): -- 2.48.1