From: Frank Sorenson <sorenson@redhat.com>
To: linux-nfs@vger.kernel.org
Cc: steved@redhat.com, chuck.lever@oracle.com
Subject: [nfs-utils PATCH 6/8] mountstats: filter for nfs mounts in a function, each iostat iteration
Date: Thu, 30 Jan 2025 08:20:05 -0600 [thread overview]
Message-ID: <20250130142008.3600334-7-sorenson@redhat.com> (raw)
In-Reply-To: <20250130142008.3600334-1-sorenson@redhat.com>
Currently, 'mountstats iostat' filters for nfs mounts when first
parsing mountstats, and never re-verifies the list when printing
multiple iterations. As a result, new nfs mountpoints are never
detected, and unmounts result in a crash.
nfsiostat covers both new mounts and unmounts by filtering the
list of devices in a function during each iteration.
Align the scripts by copying the nfsiostat filtering function,
and filter each iteration.
Signed-off-by: Frank Sorenson <sorenson@redhat.com>
---
tools/mountstats/mountstats.py | 53 ++++++++++++++++++++++------------
1 file changed, 35 insertions(+), 18 deletions(-)
diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
index 59139ccc..e640642a 100755
--- a/tools/mountstats/mountstats.py
+++ b/tools/mountstats/mountstats.py
@@ -971,11 +971,32 @@ def print_iostat_summary(old, new, devices, time):
else: # device is only in new
stats.display_iostats(time)
+def list_nfs_mounts(givenlist, mountstats):
+ """return a list of NFS mounts given a list to validate or
+ return a full list if the given list is empty -
+ may return an empty list if none found
+ """
+ devicelist = []
+ if len(givenlist) > 0:
+ for device in givenlist:
+ if device in mountstats:
+ stats = DeviceData()
+ stats.parse_stats(mountstats[device])
+ if stats.is_nfs_mountpoint():
+ devicelist += [device]
+ else:
+ for device, descr in mountstats.items():
+ stats = DeviceData()
+ stats.parse_stats(descr)
+ if stats.is_nfs_mountpoint():
+ devicelist += [device]
+ return devicelist
+
def iostat_command(args):
"""iostat-like command for NFS mount points
"""
mountstats = parse_stats_file(args.infile)
- devices = [os.path.normpath(mp) for mp in args.mountpoints]
+ origdevices = [os.path.normpath(mp) for mp in args.mountpoints]
if args.since:
old_mountstats = parse_stats_file(args.since)
@@ -983,23 +1004,7 @@ def iostat_command(args):
old_mountstats = None
# make certain devices contains only NFS mount points
- if len(devices) > 0:
- check = []
- for device in devices:
- stats = DeviceData()
- try:
- stats.parse_stats(mountstats[device])
- if stats.is_nfs_mountpoint():
- check += [device]
- except KeyError:
- continue
- devices = check
- else:
- for device, descr in mountstats.items():
- stats = DeviceData()
- stats.parse_stats(descr)
- if stats.is_nfs_mountpoint():
- devices += [device]
+ devices = list_nfs_mounts(origdevices, mountstats)
if len(devices) == 0:
print('No NFS mount points were found')
return 1
@@ -1018,6 +1023,12 @@ def iostat_command(args):
time.sleep(args.interval)
sample_time = args.interval
mountstats = parse_stats_file(args.infile)
+ # nfs mountpoints may appear or disappear, so we need to
+ # recheck the devices list each time we parse mountstats
+ devices = list_nfs_mounts(origdevices, mountstats)
+ if len(devices) == 0:
+ print('No NFS mount points were found')
+ return
count -= 1
else:
while True:
@@ -1026,6 +1037,12 @@ def iostat_command(args):
time.sleep(args.interval)
sample_time = args.interval
mountstats = parse_stats_file(args.infile)
+ # nfs mountpoints may appear or disappear, so we need to
+ # recheck the devices list each time we parse mountstats
+ devices = list_nfs_mounts(origdevices, mountstats)
+ if len(devices) == 0:
+ print('No NFS mount points were found')
+ return
args.infile.close()
if args.since:
--
2.48.1
next prev parent reply other threads:[~2025-01-30 14:20 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-30 14:19 [nfs-utils PATCH 0/8] mountstats/nfsiostat: bugfixes for iostat Frank Sorenson
2025-01-30 14:20 ` [nfs-utils PATCH 1/8] mountstats/nfsiostat: add a function to return the fstype Frank Sorenson
2025-01-30 14:20 ` [nfs-utils PATCH 2/8] mountstats: when printing iostats, verify that old and new types are the same Frank Sorenson
2025-01-30 14:20 ` [nfs-utils PATCH 3/8] nfsiostat: mirror how mountstats iostat prints the stats Frank Sorenson
2025-01-30 14:20 ` [nfs-utils PATCH 4/8] nfsiostat: fix crash when filtering mountstats after unmount Frank Sorenson
2025-01-30 14:20 ` [nfs-utils PATCH 5/8] nfsiostat: make comment explain mount/unmount more broadly Frank Sorenson
2025-01-30 14:20 ` Frank Sorenson [this message]
2025-01-30 14:20 ` [nfs-utils PATCH 7/8] mountstats/nfsiostat: Move the checks for empty mountpoint list into the print function Frank Sorenson
2025-01-30 14:20 ` [nfs-utils PATCH 8/8] mountstats/nfsiostat: merge and rework the infinite and counted loops Frank Sorenson
2025-01-30 14:28 ` [nfs-utils PATCH 0/8] mountstats/nfsiostat: bugfixes for iostat Chuck Lever
2025-02-05 22:53 ` Steve Dickson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250130142008.3600334-7-sorenson@redhat.com \
--to=sorenson@redhat.com \
--cc=chuck.lever@oracle.com \
--cc=linux-nfs@vger.kernel.org \
--cc=steved@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox