diff mbox series

[nfs-utils,3/8] nfsiostat: mirror how mountstats iostat prints the stats

Message ID 20250130142008.3600334-4-sorenson@redhat.com (mailing list archive)
State Handled Elsewhere
Headers show
Series mountstats/nfsiostat: bugfixes for iostat | expand

Commit Message

Frank Sorenson Jan. 30, 2025, 2:20 p.m. UTC
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@redhat.com>
---
 tools/nfs-iostat/nfs-iostat.py | 42 ++++++++++++----------------------
 1 file changed, 14 insertions(+), 28 deletions(-)
diff mbox series

Patch

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):