linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 3/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s
@ 2009-08-26  4:59 Lans Carstensen
  2009-08-26 14:30 ` Chuck Lever
  2009-08-26 21:12 ` Chuck Lever
  0 siblings, 2 replies; 6+ messages in thread
From: Lans Carstensen @ 2009-08-26  4:59 UTC (permalink / raw)
  To: NFS list

commit ef558b7b978418ac3da35e36dcf02a223e4ebe2d
Author: Lans Carstensen <Lans.Carstensen@dreamworks.com>
Date:   Tue Aug 25 21:52:49 2009 -0700

     Update list of mount points to parse stats for and drop mount
     points from stats collection when they are umounted.  This
     ensures proper stats collection for autofs mountpoints.

diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
index 6ce31fc..9f3b3eb 100644
--- a/tools/nfs-iostat/nfs-iostat.py
+++ b/tools/nfs-iostat/nfs-iostat.py
@@ -447,7 +447,14 @@ def parse_stats_file(filename):
      return ms_dict

  def print_iostat_summary(old, new, devices, time, ac):
-    for device in devices:
+    if old:
+        # Trim device list to only include intersection of old and new 
data,
+        # this addresses umounts due to autofs mountpoints
+        devicelist = filter(lambda x:x in devices,old)
+    else:
+        devicelist = devices
+
+    for device in devicelist:
          stats = DeviceData()
          stats.parse_stats(new[device])
          if not old:
@@ -458,11 +465,35 @@ def print_iostat_summary(old, new, devices, time, ac):
              diff_stats = stats.compare_iostats(old_stats)
              diff_stats.display_iostats(time, ac)

+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
+    """
+    list = []
+    if len(givenlist) > 0:
+        for device in givenlist:
+            stats = DeviceData()
+            stats.parse_stats(mountstats[device])
+            if stats.is_nfs_mountpoint():
+                list += [device]
+    else:
+        for device, descr in mountstats.iteritems():
+            stats = DeviceData()
+            stats.parse_stats(descr)
+            if stats.is_nfs_mountpoint():
+                list += [device]
+    if len(list) == 0:
+        print 'No NFS mount points were found'
+        return
+
+    return list
+
  def iostat_command(name):
      """iostat-like command for NFS mount points
      """
      mountstats = parse_stats_file('/proc/self/mountstats')
      devices = []
+    origdevices = []
      which = 0
      interval_seen = False
      count_seen = False
@@ -492,7 +523,7 @@ def iostat_command(name):
              continue

          if arg in mountstats:
-            devices += [arg]
+            origdevices += [arg]
          elif not interval_seen:
              interval = int(arg)
              if interval > 0:
@@ -509,23 +540,7 @@ def iostat_command(name):
                  return

      # make certain devices contains only NFS mount points
-    if len(devices) > 0:
-        check = []
-        for device in devices:
-            stats = DeviceData()
-            stats.parse_stats(mountstats[device])
-            if stats.is_nfs_mountpoint():
-                check += [device]
-        devices = check
-    else:
-        for device, descr in mountstats.iteritems():
-            stats = DeviceData()
-            stats.parse_stats(descr)
-            if stats.is_nfs_mountpoint():
-                devices += [device]
-    if len(devices) == 0:
-        print 'No NFS mount points were found'
-        return
+    devices = list_nfs_mounts(origdevices, mountstats)

      old_mountstats = None
      sample_time = 0.0
@@ -541,6 +556,9 @@ def iostat_command(name):
              time.sleep(interval)
              sample_time = interval
              mountstats = parse_stats_file('/proc/self/mountstats')
+            # automount mountpoints add and drop, if automount is involved
+            # we need to recheck the devices list when reparsing
+            devices = list_nfs_mounts(origdevices,mountstats)
              count -= 1
      else:
          while True:
@@ -549,6 +567,9 @@ def iostat_command(name):
              time.sleep(interval)
              sample_time = interval
              mountstats = parse_stats_file('/proc/self/mountstats')
+            # automount mountpoints add and drop, if automount is involved
+            # we need to recheck the devices list when reparsing
+            devices = list_nfs_mounts(origdevices,mountstats)

  #
  # Main



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s
  2009-08-26  4:59 Lans Carstensen
@ 2009-08-26 14:30 ` Chuck Lever
  2009-08-26 21:12 ` Chuck Lever
  1 sibling, 0 replies; 6+ messages in thread
From: Chuck Lever @ 2009-08-26 14:30 UTC (permalink / raw)
  To: Lans Carstensen; +Cc: NFS list

I'd like to try this one out so I'm sure I understand what's going on.

On Aug 26, 2009, at 12:59 AM, Lans Carstensen wrote:

> commit ef558b7b978418ac3da35e36dcf02a223e4ebe2d
> Author: Lans Carstensen <Lans.Carstensen@dreamworks.com>
> Date:   Tue Aug 25 21:52:49 2009 -0700
>
>    Update list of mount points to parse stats for and drop mount
>    points from stats collection when they are umounted.  This
>    ensures proper stats collection for autofs mountpoints.
>
> diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs- 
> iostat.py
> index 6ce31fc..9f3b3eb 100644
> --- a/tools/nfs-iostat/nfs-iostat.py
> +++ b/tools/nfs-iostat/nfs-iostat.py
> @@ -447,7 +447,14 @@ def parse_stats_file(filename):
>     return ms_dict
>
> def print_iostat_summary(old, new, devices, time, ac):
> -    for device in devices:
> +    if old:
> +        # Trim device list to only include intersection of old and  
> new data,
> +        # this addresses umounts due to autofs mountpoints
> +        devicelist = filter(lambda x:x in devices,old)
> +    else:
> +        devicelist = devices
> +
> +    for device in devicelist:
>         stats = DeviceData()
>         stats.parse_stats(new[device])
>         if not old:
> @@ -458,11 +465,35 @@ def print_iostat_summary(old, new, devices,  
> time, ac):
>             diff_stats = stats.compare_iostats(old_stats)
>             diff_stats.display_iostats(time, ac)
>
> +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
> +    """
> +    list = []
> +    if len(givenlist) > 0:
> +        for device in givenlist:
> +            stats = DeviceData()
> +            stats.parse_stats(mountstats[device])
> +            if stats.is_nfs_mountpoint():
> +                list += [device]
> +    else:
> +        for device, descr in mountstats.iteritems():
> +            stats = DeviceData()
> +            stats.parse_stats(descr)
> +            if stats.is_nfs_mountpoint():
> +                list += [device]
> +    if len(list) == 0:
> +        print 'No NFS mount points were found'
> +        return
> +
> +    return list
> +
> def iostat_command(name):
>     """iostat-like command for NFS mount points
>     """
>     mountstats = parse_stats_file('/proc/self/mountstats')
>     devices = []
> +    origdevices = []
>     which = 0
>     interval_seen = False
>     count_seen = False
> @@ -492,7 +523,7 @@ def iostat_command(name):
>             continue
>
>         if arg in mountstats:
> -            devices += [arg]
> +            origdevices += [arg]
>         elif not interval_seen:
>             interval = int(arg)
>             if interval > 0:
> @@ -509,23 +540,7 @@ def iostat_command(name):
>                 return
>
>     # make certain devices contains only NFS mount points
> -    if len(devices) > 0:
> -        check = []
> -        for device in devices:
> -            stats = DeviceData()
> -            stats.parse_stats(mountstats[device])
> -            if stats.is_nfs_mountpoint():
> -                check += [device]
> -        devices = check
> -    else:
> -        for device, descr in mountstats.iteritems():
> -            stats = DeviceData()
> -            stats.parse_stats(descr)
> -            if stats.is_nfs_mountpoint():
> -                devices += [device]
> -    if len(devices) == 0:
> -        print 'No NFS mount points were found'
> -        return
> +    devices = list_nfs_mounts(origdevices, mountstats)
>
>     old_mountstats = None
>     sample_time = 0.0
> @@ -541,6 +556,9 @@ def iostat_command(name):
>             time.sleep(interval)
>             sample_time = interval
>             mountstats = parse_stats_file('/proc/self/mountstats')
> +            # automount mountpoints add and drop, if automount is  
> involved
> +            # we need to recheck the devices list when reparsing
> +            devices = list_nfs_mounts(origdevices,mountstats)
>             count -= 1
>     else:
>         while True:
> @@ -549,6 +567,9 @@ def iostat_command(name):
>             time.sleep(interval)
>             sample_time = interval
>             mountstats = parse_stats_file('/proc/self/mountstats')
> +            # automount mountpoints add and drop, if automount is  
> involved
> +            # we need to recheck the devices list when reparsing
> +            devices = list_nfs_mounts(origdevices,mountstats)
>
> #
> # Main
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs"  
> in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s
  2009-08-26  4:59 Lans Carstensen
  2009-08-26 14:30 ` Chuck Lever
@ 2009-08-26 21:12 ` Chuck Lever
  2009-08-26 23:57   ` Lans Carstensen
  1 sibling, 1 reply; 6+ messages in thread
From: Chuck Lever @ 2009-08-26 21:12 UTC (permalink / raw)
  To: Lans Carstensen; +Cc: NFS list


On Aug 26, 2009, at 12:59 AM, Lans Carstensen wrote:

> commit ef558b7b978418ac3da35e36dcf02a223e4ebe2d
> Author: Lans Carstensen <Lans.Carstensen@dreamworks.com>
> Date:   Tue Aug 25 21:52:49 2009 -0700
>
>    Update list of mount points to parse stats for and drop mount
>    points from stats collection when they are umounted.  This
>    ensures proper stats collection for autofs mountpoints.
>
> diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs- 
> iostat.py
> index 6ce31fc..9f3b3eb 100644
> --- a/tools/nfs-iostat/nfs-iostat.py
> +++ b/tools/nfs-iostat/nfs-iostat.py
> @@ -447,7 +447,14 @@ def parse_stats_file(filename):
>     return ms_dict
>
> def print_iostat_summary(old, new, devices, time, ac):
> -    for device in devices:
> +    if old:
> +        # Trim device list to only include intersection of old and  
> new data,
> +        # this addresses umounts due to autofs mountpoints
> +        devicelist = filter(lambda x:x in devices,old)
> +    else:
> +        devicelist = devices
> +
> +    for device in devicelist:
>         stats = DeviceData()
>         stats.parse_stats(new[device])
>         if not old:
> @@ -458,11 +465,35 @@ def print_iostat_summary(old, new, devices,  
> time, ac):
>             diff_stats = stats.compare_iostats(old_stats)
>             diff_stats.display_iostats(time, ac)
>
> +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
> +    """
> +    list = []
> +    if len(givenlist) > 0:
> +        for device in givenlist:
> +            stats = DeviceData()
> +            stats.parse_stats(mountstats[device])
> +            if stats.is_nfs_mountpoint():
> +                list += [device]
> +    else:
> +        for device, descr in mountstats.iteritems():
> +            stats = DeviceData()
> +            stats.parse_stats(descr)
> +            if stats.is_nfs_mountpoint():
> +                list += [device]
> +    if len(list) == 0:
> +        print 'No NFS mount points were found'
> +        return

You refactored this logic from the main routine.  I think this last  
"return" was OK in the main routine, but in a subroutine it may not do  
exactly what you want.  A NoneType object is passed to  
print_iostat_summary in this case.

[cel@matisse tmp]$ ./nfs-iostat.py
No NFS mount points were found
Traceback (most recent call last):
   File "./nfs-iostat.py", line 580, in <module>
     iostat_command(prog)
   File "./nfs-iostat.py", line 549, in iostat_command
     print_iostat_summary(old_mountstats, mountstats, devices,  
sample_time, which)
   File "./nfs-iostat.py", line 457, in print_iostat_summary
     for device in devicelist:
TypeError: 'NoneType' object is not iterable

> +
> +    return list
> +
> def iostat_command(name):
>     """iostat-like command for NFS mount points
>     """
>     mountstats = parse_stats_file('/proc/self/mountstats')
>     devices = []
> +    origdevices = []
>     which = 0
>     interval_seen = False
>     count_seen = False
> @@ -492,7 +523,7 @@ def iostat_command(name):
>             continue
>
>         if arg in mountstats:
> -            devices += [arg]
> +            origdevices += [arg]
>         elif not interval_seen:
>             interval = int(arg)
>             if interval > 0:
> @@ -509,23 +540,7 @@ def iostat_command(name):
>                 return
>
>     # make certain devices contains only NFS mount points
> -    if len(devices) > 0:
> -        check = []
> -        for device in devices:
> -            stats = DeviceData()
> -            stats.parse_stats(mountstats[device])
> -            if stats.is_nfs_mountpoint():
> -                check += [device]
> -        devices = check
> -    else:
> -        for device, descr in mountstats.iteritems():
> -            stats = DeviceData()
> -            stats.parse_stats(descr)
> -            if stats.is_nfs_mountpoint():
> -                devices += [device]
> -    if len(devices) == 0:
> -        print 'No NFS mount points were found'
> -        return
> +    devices = list_nfs_mounts(origdevices, mountstats)
>
>     old_mountstats = None
>     sample_time = 0.0
> @@ -541,6 +556,9 @@ def iostat_command(name):
>             time.sleep(interval)
>             sample_time = interval
>             mountstats = parse_stats_file('/proc/self/mountstats')
> +            # automount mountpoints add and drop, if automount is  
> involved
> +            # we need to recheck the devices list when reparsing
> +            devices = list_nfs_mounts(origdevices,mountstats)
>             count -= 1
>     else:
>         while True:
> @@ -549,6 +567,9 @@ def iostat_command(name):
>             time.sleep(interval)
>             sample_time = interval
>             mountstats = parse_stats_file('/proc/self/mountstats')
> +            # automount mountpoints add and drop, if automount is  
> involved
> +            # we need to recheck the devices list when reparsing
> +            devices = list_nfs_mounts(origdevices,mountstats)
>
> #
> # Main
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs"  
> in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s
  2009-08-26 21:12 ` Chuck Lever
@ 2009-08-26 23:57   ` Lans Carstensen
  2009-08-27 14:09     ` Chuck Lever
  0 siblings, 1 reply; 6+ messages in thread
From: Lans Carstensen @ 2009-08-26 23:57 UTC (permalink / raw)
  To: Chuck Lever; +Cc: NFS list

Chuck Lever wrote:
> 
> On Aug 26, 2009, at 12:59 AM, Lans Carstensen wrote:
> 
>> commit ef558b7b978418ac3da35e36dcf02a223e4ebe2d
>> Author: Lans Carstensen <Lans.Carstensen@dreamworks.com>
>> Date:   Tue Aug 25 21:52:49 2009 -0700
>>
>>    Update list of mount points to parse stats for and drop mount
>>    points from stats collection when they are umounted.  This
>>    ensures proper stats collection for autofs mountpoints.
>>
>> diff --git a/tools/nfs-iostat/nfs-iostat.py 
>> b/tools/nfs-iostat/nfs-iostat.py
>> index 6ce31fc..9f3b3eb 100644
>> --- a/tools/nfs-iostat/nfs-iostat.py
>> +++ b/tools/nfs-iostat/nfs-iostat.py
>> @@ -447,7 +447,14 @@ def parse_stats_file(filename):
>>     return ms_dict
>>
>> def print_iostat_summary(old, new, devices, time, ac):
>> -    for device in devices:
>> +    if old:
>> +        # Trim device list to only include intersection of old and 
>> new data,
>> +        # this addresses umounts due to autofs mountpoints
>> +        devicelist = filter(lambda x:x in devices,old)
>> +    else:
>> +        devicelist = devices
>> +
>> +    for device in devicelist:
>>         stats = DeviceData()
>>         stats.parse_stats(new[device])
>>         if not old:
>> @@ -458,11 +465,35 @@ def print_iostat_summary(old, new, devices, 
>> time, ac):
>>             diff_stats = stats.compare_iostats(old_stats)
>>             diff_stats.display_iostats(time, ac)
>>
>> +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
>> +    """
>> +    list = []
>> +    if len(givenlist) > 0:
>> +        for device in givenlist:
>> +            stats = DeviceData()
>> +            stats.parse_stats(mountstats[device])
>> +            if stats.is_nfs_mountpoint():
>> +                list += [device]
>> +    else:
>> +        for device, descr in mountstats.iteritems():
>> +            stats = DeviceData()
>> +            stats.parse_stats(descr)
>> +            if stats.is_nfs_mountpoint():
>> +                list += [device]
>> +    if len(list) == 0:
>> +        print 'No NFS mount points were found'
>> +        return
> 
> You refactored this logic from the main routine.  I think this last 
> "return" was OK in the main routine, but in a subroutine it may not do 
> exactly what you want.  A NoneType object is passed to 
> print_iostat_summary in this case
> 
> [cel@matisse tmp]$ ./nfs-iostat.py
> No NFS mount points were found
> Traceback (most recent call last):
>   File "./nfs-iostat.py", line 580, in <module>
>     iostat_command(prog)
>   File "./nfs-iostat.py", line 549, in iostat_command
>     print_iostat_summary(old_mountstats, mountstats, devices, 
> sample_time, which)
>   File "./nfs-iostat.py", line 457, in print_iostat_summary
>     for device in devicelist:
> TypeError: 'NoneType' object is not iterable

Sigh.  Thanks.  I'll test more thoroughly and resubmit.  Based on the 
--list= argument change it'll probably be easier to refactor the script 
to use optparse, so I'll end up regenerating the last two patches as 
probably three new ones.

-- Lans Carstensen, Systems Engineering, Dreamworks Animation
Because they consistently observe and listen, the humble improve.
                                                -- Wynton Marsalis

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s
  2009-08-26 23:57   ` Lans Carstensen
@ 2009-08-27 14:09     ` Chuck Lever
  0 siblings, 0 replies; 6+ messages in thread
From: Chuck Lever @ 2009-08-27 14:09 UTC (permalink / raw)
  To: Lans Carstensen; +Cc: NFS list

On Aug 26, 2009, at 7:57 PM, Lans Carstensen wrote:
> Chuck Lever wrote:
>> On Aug 26, 2009, at 12:59 AM, Lans Carstensen wrote:
>>> commit ef558b7b978418ac3da35e36dcf02a223e4ebe2d
>>> Author: Lans Carstensen <Lans.Carstensen@dreamworks.com>
>>> Date:   Tue Aug 25 21:52:49 2009 -0700
>>>
>>>   Update list of mount points to parse stats for and drop mount
>>>   points from stats collection when they are umounted.  This
>>>   ensures proper stats collection for autofs mountpoints.
>>>
>>> diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs- 
>>> iostat.py
>>> index 6ce31fc..9f3b3eb 100644
>>> --- a/tools/nfs-iostat/nfs-iostat.py
>>> +++ b/tools/nfs-iostat/nfs-iostat.py
>>> @@ -447,7 +447,14 @@ def parse_stats_file(filename):
>>>    return ms_dict
>>>
>>> def print_iostat_summary(old, new, devices, time, ac):
>>> -    for device in devices:
>>> +    if old:
>>> +        # Trim device list to only include intersection of old  
>>> and new data,
>>> +        # this addresses umounts due to autofs mountpoints
>>> +        devicelist = filter(lambda x:x in devices,old)
>>> +    else:
>>> +        devicelist = devices
>>> +
>>> +    for device in devicelist:
>>>        stats = DeviceData()
>>>        stats.parse_stats(new[device])
>>>        if not old:
>>> @@ -458,11 +465,35 @@ def print_iostat_summary(old, new, devices,  
>>> time, ac):
>>>            diff_stats = stats.compare_iostats(old_stats)
>>>            diff_stats.display_iostats(time, ac)
>>>
>>> +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
>>> +    """
>>> +    list = []
>>> +    if len(givenlist) > 0:
>>> +        for device in givenlist:
>>> +            stats = DeviceData()
>>> +            stats.parse_stats(mountstats[device])
>>> +            if stats.is_nfs_mountpoint():
>>> +                list += [device]
>>> +    else:
>>> +        for device, descr in mountstats.iteritems():
>>> +            stats = DeviceData()
>>> +            stats.parse_stats(descr)
>>> +            if stats.is_nfs_mountpoint():
>>> +                list += [device]
>>> +    if len(list) == 0:
>>> +        print 'No NFS mount points were found'
>>> +        return
>> You refactored this logic from the main routine.  I think this last  
>> "return" was OK in the main routine, but in a subroutine it may not  
>> do exactly what you want.  A NoneType object is passed to  
>> print_iostat_summary in this case
>> [cel@matisse tmp]$ ./nfs-iostat.py
>> No NFS mount points were found
>> Traceback (most recent call last):
>>  File "./nfs-iostat.py", line 580, in <module>
>>    iostat_command(prog)
>>  File "./nfs-iostat.py", line 549, in iostat_command
>>    print_iostat_summary(old_mountstats, mountstats, devices,  
>> sample_time, which)
>>  File "./nfs-iostat.py", line 457, in print_iostat_summary
>>    for device in devicelist:
>> TypeError: 'NoneType' object is not iterable
>
> Sigh.  Thanks.  I'll test more thoroughly and resubmit.  Based on  
> the --list= argument change it'll probably be easier to refactor the  
> script to use optparse, so I'll end up regenerating the last two  
> patches as probably three new ones.

Thanks, these are good changes.

When you resubmit, can you add a Signed-off-by: line at the bottom of  
each patch description?  You can look at this page for more information:

   http://kerneltrap.org/taxonomy/term/245

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com




^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 3/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s
@ 2009-09-15  4:57 Lans Carstensen
  0 siblings, 0 replies; 6+ messages in thread
From: Lans Carstensen @ 2009-09-15  4:57 UTC (permalink / raw)
  To: linux-nfs

Introduce optparse for managing command usage/help and the statistics 
options. This change helps more cleanly add new options such as --sort 
while preserving the iostat-like interval, count, and mount point 
positional arguments.

Signed-off-by: Lans Carstensen <Lans.Carstensen-hCDZnVt6e3JSwrhanM7KvQ@public.gmane.org>
---
  tools/nfs-iostat/nfs-iostat.py |  112 
++++++++++++++++++++-------------------
  1 files changed, 57 insertions(+), 55 deletions(-)

diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
index b3f335a..fc2cac8 100755
--- a/tools/nfs-iostat/nfs-iostat.py
+++ b/tools/nfs-iostat/nfs-iostat.py
@@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
MA 02111-1307 USA
  """

  import sys, os, time
+from optparse import OptionParser, OptionGroup

  Iostats_version = '0.2'

@@ -395,33 +396,6 @@ class DeviceData:
  # Functions
  #

-def print_iostat_help(name):
-    print 'usage: %s [ <interval> [ <count> ] ] [ <options> ] [ <mount 
point> ] ' % name
-    print
-    print ' Version %s' % Iostats_version
-    print
-    print ' Sample iostat-like program to display NFS client per-mount 
statistics.'
-    print
-    print ' The <interval> parameter specifies the amount of time in 
seconds between'
-    print ' each report.  The first report contains statistics for the 
time since each'
-    print ' file system was mounted.  Each subsequent report contains 
statistics'
-    print ' collected during the interval since the previous report.'
-    print
-    print ' If the <count> parameter is specified, the value of <count> 
determines the'
-    print ' number of reports generated at <interval> seconds apart. 
If the interval'
-    print ' parameter is specified without the <count> parameter, the 
command generates'
-    print ' reports continuously.'
-    print
-    print ' Options include "--attr", which displays statistics related 
to the attribute'
-    print ' cache, "--dir", which displays statistics related to 
directory operations,'
-    print ' and "--page", which displays statistics related to the page 
cache.'
-    print ' By default, if no option is specified, statistics related 
to file I/O are'
-    print ' displayed.'
-    print
-    print ' If one or more <mount point> names are specified, 
statistics for only these'
-    print ' mount points will be displayed.  Otherwise, all NFS mount 
points on the'
-    print ' client are listed.'
-
  def parse_stats_file(filename):
      """pop the contents of a mountstats file into a dictionary,
      keyed by mount point.  each value object is a list of the
@@ -491,30 +465,50 @@ def iostat_command(name):
      mountstats = parse_stats_file('/proc/self/mountstats')
      devices = []
      origdevices = []
-    which = 0
      interval_seen = False
      count_seen = False

-    for arg in sys.argv:
-        if arg in ['-h', '--help', 'help', 'usage']:
-            print_iostat_help(name)
-            return
-
-        if arg in ['-v', '--version', 'version']:
-            print '%s version %s' % (name, Iostats_version)
-            return
-
-        if arg in ['-a', '--attr']:
-            which = 1
-            continue
-
-        if arg in ['-d', '--dir']:
-            which = 2
-            continue
-
-        if arg in ['-p', '--page']:
-            which = 3
-            continue
+    mydescription= """
+Sample iostat-like program to display NFS client per-mount'
+statistics.  The <interval> parameter specifies the amount of time in 
seconds
+between each report.  The first report contains statistics for the time 
since
+each file system was mounted.  Each subsequent report contains statistics
+collected during the interval since the previous report.  If the <count>
+parameter is specified, the value of <count> determines the number of 
reports
+generated at <interval> seconds apart.  If the interval parameter is 
specified
+without the <count> parameter, the command generates reports continuously.
+If one or more <mount point> names are specified, statistics for only these
+mount points will be displayed.  Otherwise, all NFS mount points on the
+client are listed.
+"""
+    parser = OptionParser(
+        usage="usage: %prog [ <interval> [ <count> ] ] [ <options> ] [ 
<mount point> ]",
+        description=mydescription,
+        version='version %s' % Iostats_version)
+    parser.set_defaults(which=0)
+
+    statgroup = OptionGroup(parser, "Statistics Options",
+                               'File I/O is displayed unless one of the 
following is specified:')
+    statgroup.add_option('-a', '--attr',
+                            action="store_const",
+                            dest="which",
+                            const=1,
+                            help='displays statistics related to the 
attribute cache')
+    statgroup.add_option('-d', '--dir',
+                            action="store_const",
+                            dest="which",
+                            const=2,
+                            help='displays statistics related to 
directory operations')
+    statgroup.add_option('-p', '--page',
+                            action="store_const",
+                            dest="which",
+                            const=3,
+                            help='displays statistics related to the 
page cache')
+    parser.add_option_group(statgroup)
+
+    (options, args) = parser.parse_args(sys.argv)
+
+    for arg in args:

          if arg == sys.argv[0]:
              continue
@@ -522,18 +516,26 @@ def iostat_command(name):
          if arg in mountstats:
              origdevices += [arg]
          elif not interval_seen:
-            interval = int(arg)
+            try:
+                interval = int(arg)
+            except:
+                print 'Illegal <interval> value %s' % arg
+                return
              if interval > 0:
                  interval_seen = True
              else:
-                print 'Illegal <interval> value'
+                print 'Illegal <interval> value %s' % arg
                  return
          elif not count_seen:
-            count = int(arg)
+            try:
+                count = int(arg)
+            except:
+                print 'Ilegal <count> value %s' % arg
+                return
              if count > 0:
                  count_seen = True
              else:
-                print 'Illegal <count> value'
+                print 'Illegal <count> value %s' % arg
                  return

      # make certain devices contains only NFS mount points
@@ -547,12 +549,12 @@ def iostat_command(name):
      sample_time = 0.0

      if not interval_seen:
-        print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which)
+        print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, options.which)
          return

      if count_seen:
          while count != 0:
-            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which)
+            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, options.which)
              old_mountstats = mountstats
              time.sleep(interval)
              sample_time = interval
@@ -566,7 +568,7 @@ def iostat_command(name):
              count -= 1
      else:
          while True:
-            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which)
+            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, options.which)
              old_mountstats = mountstats
              time.sleep(interval)
              sample_time = interval
-- 
1.5.5.6



^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-09-15  5:00 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-09-15  4:57 [PATCH 3/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s Lans Carstensen
  -- strict thread matches above, loose matches on Subject: below --
2009-08-26  4:59 Lans Carstensen
2009-08-26 14:30 ` Chuck Lever
2009-08-26 21:12 ` Chuck Lever
2009-08-26 23:57   ` Lans Carstensen
2009-08-27 14:09     ` Chuck Lever

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).