2013-03-24 19:57:05

by Mike Frysinger

[permalink] [raw]
Subject: [PATCH] nfsiostat: make it work w/python3

Simple fixes here to work with python 2 & 3:
- use print() everywhere
- dict.iteritems() -> dict.items()
- file() -> open()
- sys.maxint -> sys.maxsize

Signed-off-by: Mike Frysinger <[email protected]>
---
tools/nfs-iostat/nfs-iostat.py | 130 +++++++++++++++++++++--------------------
1 file changed, 66 insertions(+), 64 deletions(-)

diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
index d909632..dfbef87 100644
--- a/tools/nfs-iostat/nfs-iostat.py
+++ b/tools/nfs-iostat/nfs-iostat.py
@@ -3,6 +3,8 @@
"""Emulate iostat for NFS mount points using /proc/self/mountstats
"""

+from __future__ import print_function
+
__copyright__ = """
Copyright (C) 2005, Chuck Lever <[email protected]>

@@ -201,9 +203,9 @@ class DeviceData:
result = DeviceData()

# copy self into result
- for key, value in self.__nfs_data.iteritems():
+ for key, value in self.__nfs_data.items():
result.__nfs_data[key] = value
- for key, value in self.__rpc_data.iteritems():
+ for key, value in self.__rpc_data.items():
result.__rpc_data[key] = value

# compute the difference of each item in the list
@@ -233,9 +235,9 @@ class DeviceData:
client_bytes_read = float(nfs_stats['serverreadbytes'] - nfs_stats['directreadbytes'])
ratio = ((app_bytes_read - client_bytes_read) * 100) / app_bytes_read

- print
- print 'app bytes: %f client bytes %f' % (app_bytes_read, client_bytes_read)
- print 'Data cache hit ratio: %4.2f%%' % ratio
+ print()
+ print('app bytes: %f client bytes %f' % (app_bytes_read, client_bytes_read))
+ print('Data cache hit ratio: %4.2f%%' % ratio)

def __print_attr_cache_stats(self, sample_time):
"""Print attribute cache efficiency stats
@@ -255,13 +257,13 @@ class DeviceData:
data_invalidates = float(nfs_stats['datainvalidates'])
attr_invalidates = float(nfs_stats['attrinvalidates'])

- print
- print '%d inode revalidations, hitting in cache %4.2f%% of the time' % \
- (revalidates, ratio)
- print '%d open operations (mandatory GETATTR requests)' % opens
+ print()
+ print('%d inode revalidations, hitting in cache %4.2f%% of the time' % \
+ (revalidates, ratio))
+ print('%d open operations (mandatory GETATTR requests)' % opens)
if getattr_ops != 0:
- print '%4.2f%% of GETATTRs resulted in data cache invalidations' % \
- ((data_invalidates * 100) / getattr_ops)
+ print('%4.2f%% of GETATTRs resulted in data cache invalidations' % \
+ ((data_invalidates * 100) / getattr_ops))

def __print_dir_cache_stats(self, sample_time):
"""Print directory stats
@@ -277,13 +279,13 @@ class DeviceData:
lookups = nfs_stats['vfslookup']
getdents = nfs_stats['vfsreaddir']

- print
- print '%d open operations (pathname lookups)' % opens
- print '%d dentry revalidates and %d vfs lookup requests' % \
- (dentry_revals, lookups),
- print 'resulted in %d LOOKUPs on the wire' % lookup_ops
- print '%d vfs getdents calls resulted in %d READDIRs on the wire' % \
- (getdents, readdir_ops)
+ print()
+ print('%d open operations (pathname lookups)' % opens)
+ print('%d dentry revalidates and %d vfs lookup requests' % \
+ (dentry_revals, lookups))
+ print('resulted in %d LOOKUPs on the wire' % lookup_ops)
+ print('%d vfs getdents calls resulted in %d READDIRs on the wire' % \
+ (getdents, readdir_ops))

def __print_page_stats(self, sample_time):
"""Print page cache stats
@@ -297,33 +299,33 @@ class DeviceData:
vfswritepages = nfs_stats['vfswritepages']
pages_written = nfs_stats['writepages']

- print
- print '%d nfs_readpage() calls read %d pages' % \
- (vfsreadpage, vfsreadpage)
- print '%d nfs_readpages() calls read %d pages' % \
- (vfsreadpages, pages_read - vfsreadpage),
+ print()
+ print('%d nfs_readpage() calls read %d pages' % \
+ (vfsreadpage, vfsreadpage))
+ print('%d nfs_readpages() calls read %d pages' % \
+ (vfsreadpages, pages_read - vfsreadpage))
if vfsreadpages != 0:
- print '(%.1f pages per call)' % \
- (float(pages_read - vfsreadpage) / vfsreadpages)
+ print('(%.1f pages per call)' % \
+ (float(pages_read - vfsreadpage) / vfsreadpages))
else:
- print
-
- print
- print '%d nfs_updatepage() calls' % nfs_stats['vfsupdatepage']
- print '%d nfs_writepage() calls wrote %d pages' % \
- (vfswritepage, vfswritepage)
- print '%d nfs_writepages() calls wrote %d pages' % \
- (vfswritepages, pages_written - vfswritepage),
+ print()
+
+ print()
+ print('%d nfs_updatepage() calls' % nfs_stats['vfsupdatepage'])
+ print('%d nfs_writepage() calls wrote %d pages' % \
+ (vfswritepage, vfswritepage))
+ print('%d nfs_writepages() calls wrote %d pages' % \
+ (vfswritepages, pages_written - vfswritepage))
if (vfswritepages) != 0:
- print '(%.1f pages per call)' % \
- (float(pages_written - vfswritepage) / vfswritepages)
+ print('(%.1f pages per call)' % \
+ (float(pages_written - vfswritepage) / vfswritepages))
else:
- print
+ print()

congestionwaits = nfs_stats['congestionwait']
if congestionwaits != 0:
- print
- print '%d congestion waits' % congestionwaits
+ print()
+ print('%d congestion waits' % congestionwaits)

def __print_rpc_op_stats(self, op, sample_time):
"""Print generic stats for one RPC op
@@ -351,15 +353,15 @@ class DeviceData:
exe_per_op = 0.0

op += ':'
- print '%s' % op.lower().ljust(15),
- print ' ops/s\t\t kB/s\t\t kB/op\t\tretrans\t\tavg RTT (ms)\tavg exe (ms)'
+ print('%s' % op.lower().ljust(15))
+ print(' ops/s\t\t kB/s\t\t kB/op\t\tretrans\t\tavg RTT (ms)\tavg exe (ms)')

- print '\t\t%7.3f' % (ops / sample_time),
- print '\t%7.3f' % (kilobytes / sample_time),
- print '\t%7.3f' % kb_per_op,
- print ' %7d (%3.1f%%)' % (retrans, retrans_percent),
- print '\t%7.3f' % rtt_per_op,
- print '\t%7.3f' % exe_per_op
+ print('\t\t%7.3f' % (ops / sample_time))
+ print('\t%7.3f' % (kilobytes / sample_time))
+ print('\t%7.3f' % kb_per_op)
+ print(' %7d (%3.1f%%)' % (retrans, retrans_percent))
+ print('\t%7.3f' % rtt_per_op)
+ print('\t%7.3f' % exe_per_op)

def ops(self, sample_time):
sends = float(self.__rpc_data['rpcsends'])
@@ -384,14 +386,14 @@ class DeviceData:
else:
backlog = 0.0

- print
- print '%s mounted on %s:' % \
- (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
- print
+ print()
+ print('%s mounted on %s:' % \
+ (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
+ print()

- print ' op/s\t\trpc bklog'
- print '%7.2f' % (sends / sample_time),
- print '\t%7.2f' % backlog
+ print(' op/s\t\trpc bklog')
+ print('%7.2f' % (sends / sample_time))
+ print('\t%7.2f' % backlog)

if which == 0:
self.__print_rpc_op_stats('READ', sample_time)
@@ -424,7 +426,7 @@ def parse_stats_file(filename):
ms_dict = dict()
key = ''

- f = file(filename)
+ f = open(filename)
for line in f.readlines():
words = line.split()
if len(words) == 0:
@@ -494,7 +496,7 @@ def list_nfs_mounts(givenlist, mountstats):
if stats.is_nfs_mountpoint():
list += [device]
else:
- for device, descr in mountstats.iteritems():
+ for device, descr in mountstats.items():
stats = DeviceData()
stats.parse_stats(descr)
if stats.is_nfs_mountpoint():
@@ -527,7 +529,7 @@ client are listed.
usage="usage: %prog [ <interval> [ <count> ] ] [ <options> ] [ <mount point> ]",
description=mydescription,
version='version %s' % Iostats_version)
- parser.set_defaults(which=0, sort=False, list=sys.maxint)
+ parser.set_defaults(which=0, sort=False, list=sys.maxsize)

statgroup = OptionGroup(parser, "Statistics Options",
'File I/O is displayed unless one of the following is specified:')
@@ -572,29 +574,29 @@ client are listed.
try:
interval = int(arg)
except:
- print 'Illegal <interval> value %s' % arg
+ print('Illegal <interval> value %s' % arg)
return
if interval > 0:
interval_seen = True
else:
- print 'Illegal <interval> value %s' % arg
+ print('Illegal <interval> value %s' % arg)
return
elif not count_seen:
try:
count = int(arg)
except:
- print 'Ilegal <count> value %s' % arg
+ print('Ilegal <count> value %s' % arg)
return
if count > 0:
count_seen = True
else:
- print 'Illegal <count> value %s' % arg
+ print('Illegal <count> value %s' % arg)
return

# make certain devices contains only NFS mount points
devices = list_nfs_mounts(origdevices, mountstats)
if len(devices) == 0:
- print 'No NFS mount points were found'
+ print('No NFS mount points were found')
return


@@ -616,7 +618,7 @@ client are listed.
# we need to recheck the devices list when reparsing
devices = list_nfs_mounts(origdevices,mountstats)
if len(devices) == 0:
- print 'No NFS mount points were found'
+ print('No NFS mount points were found')
return
count -= 1
else:
@@ -630,7 +632,7 @@ client are listed.
# we need to recheck the devices list when reparsing
devices = list_nfs_mounts(origdevices,mountstats)
if len(devices) == 0:
- print 'No NFS mount points were found'
+ print('No NFS mount points were found')
return

#
@@ -641,7 +643,7 @@ prog = os.path.basename(sys.argv[0])
try:
iostat_command(prog)
except KeyboardInterrupt:
- print 'Caught ^C... exiting'
+ print('Caught ^C... exiting')
sys.exit(1)

sys.exit(0)
--
1.8.1.2



2013-03-25 14:18:38

by Steve Dickson

[permalink] [raw]
Subject: Re: [PATCH] nfsiostat: make it work w/python3



On 24/03/13 16:01, Mike Frysinger wrote:
> Simple fixes here to work with python 2 & 3:
> - use print() everywhere
> - dict.iteritems() -> dict.items()
> - file() -> open()
> - sys.maxint -> sys.maxsize
>
> Signed-off-by: Mike Frysinger <[email protected]>
Committed...

steved.
> ---
> tools/nfs-iostat/nfs-iostat.py | 130 +++++++++++++++++++++--------------------
> 1 file changed, 66 insertions(+), 64 deletions(-)
>
> diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
> index d909632..dfbef87 100644
> --- a/tools/nfs-iostat/nfs-iostat.py
> +++ b/tools/nfs-iostat/nfs-iostat.py
> @@ -3,6 +3,8 @@
> """Emulate iostat for NFS mount points using /proc/self/mountstats
> """
>
> +from __future__ import print_function
> +
> __copyright__ = """
> Copyright (C) 2005, Chuck Lever <[email protected]>
>
> @@ -201,9 +203,9 @@ class DeviceData:
> result = DeviceData()
>
> # copy self into result
> - for key, value in self.__nfs_data.iteritems():
> + for key, value in self.__nfs_data.items():
> result.__nfs_data[key] = value
> - for key, value in self.__rpc_data.iteritems():
> + for key, value in self.__rpc_data.items():
> result.__rpc_data[key] = value
>
> # compute the difference of each item in the list
> @@ -233,9 +235,9 @@ class DeviceData:
> client_bytes_read = float(nfs_stats['serverreadbytes'] - nfs_stats['directreadbytes'])
> ratio = ((app_bytes_read - client_bytes_read) * 100) / app_bytes_read
>
> - print
> - print 'app bytes: %f client bytes %f' % (app_bytes_read, client_bytes_read)
> - print 'Data cache hit ratio: %4.2f%%' % ratio
> + print()
> + print('app bytes: %f client bytes %f' % (app_bytes_read, client_bytes_read))
> + print('Data cache hit ratio: %4.2f%%' % ratio)
>
> def __print_attr_cache_stats(self, sample_time):
> """Print attribute cache efficiency stats
> @@ -255,13 +257,13 @@ class DeviceData:
> data_invalidates = float(nfs_stats['datainvalidates'])
> attr_invalidates = float(nfs_stats['attrinvalidates'])
>
> - print
> - print '%d inode revalidations, hitting in cache %4.2f%% of the time' % \
> - (revalidates, ratio)
> - print '%d open operations (mandatory GETATTR requests)' % opens
> + print()
> + print('%d inode revalidations, hitting in cache %4.2f%% of the time' % \
> + (revalidates, ratio))
> + print('%d open operations (mandatory GETATTR requests)' % opens)
> if getattr_ops != 0:
> - print '%4.2f%% of GETATTRs resulted in data cache invalidations' % \
> - ((data_invalidates * 100) / getattr_ops)
> + print('%4.2f%% of GETATTRs resulted in data cache invalidations' % \
> + ((data_invalidates * 100) / getattr_ops))
>
> def __print_dir_cache_stats(self, sample_time):
> """Print directory stats
> @@ -277,13 +279,13 @@ class DeviceData:
> lookups = nfs_stats['vfslookup']
> getdents = nfs_stats['vfsreaddir']
>
> - print
> - print '%d open operations (pathname lookups)' % opens
> - print '%d dentry revalidates and %d vfs lookup requests' % \
> - (dentry_revals, lookups),
> - print 'resulted in %d LOOKUPs on the wire' % lookup_ops
> - print '%d vfs getdents calls resulted in %d READDIRs on the wire' % \
> - (getdents, readdir_ops)
> + print()
> + print('%d open operations (pathname lookups)' % opens)
> + print('%d dentry revalidates and %d vfs lookup requests' % \
> + (dentry_revals, lookups))
> + print('resulted in %d LOOKUPs on the wire' % lookup_ops)
> + print('%d vfs getdents calls resulted in %d READDIRs on the wire' % \
> + (getdents, readdir_ops))
>
> def __print_page_stats(self, sample_time):
> """Print page cache stats
> @@ -297,33 +299,33 @@ class DeviceData:
> vfswritepages = nfs_stats['vfswritepages']
> pages_written = nfs_stats['writepages']
>
> - print
> - print '%d nfs_readpage() calls read %d pages' % \
> - (vfsreadpage, vfsreadpage)
> - print '%d nfs_readpages() calls read %d pages' % \
> - (vfsreadpages, pages_read - vfsreadpage),
> + print()
> + print('%d nfs_readpage() calls read %d pages' % \
> + (vfsreadpage, vfsreadpage))
> + print('%d nfs_readpages() calls read %d pages' % \
> + (vfsreadpages, pages_read - vfsreadpage))
> if vfsreadpages != 0:
> - print '(%.1f pages per call)' % \
> - (float(pages_read - vfsreadpage) / vfsreadpages)
> + print('(%.1f pages per call)' % \
> + (float(pages_read - vfsreadpage) / vfsreadpages))
> else:
> - print
> -
> - print
> - print '%d nfs_updatepage() calls' % nfs_stats['vfsupdatepage']
> - print '%d nfs_writepage() calls wrote %d pages' % \
> - (vfswritepage, vfswritepage)
> - print '%d nfs_writepages() calls wrote %d pages' % \
> - (vfswritepages, pages_written - vfswritepage),
> + print()
> +
> + print()
> + print('%d nfs_updatepage() calls' % nfs_stats['vfsupdatepage'])
> + print('%d nfs_writepage() calls wrote %d pages' % \
> + (vfswritepage, vfswritepage))
> + print('%d nfs_writepages() calls wrote %d pages' % \
> + (vfswritepages, pages_written - vfswritepage))
> if (vfswritepages) != 0:
> - print '(%.1f pages per call)' % \
> - (float(pages_written - vfswritepage) / vfswritepages)
> + print('(%.1f pages per call)' % \
> + (float(pages_written - vfswritepage) / vfswritepages))
> else:
> - print
> + print()
>
> congestionwaits = nfs_stats['congestionwait']
> if congestionwaits != 0:
> - print
> - print '%d congestion waits' % congestionwaits
> + print()
> + print('%d congestion waits' % congestionwaits)
>
> def __print_rpc_op_stats(self, op, sample_time):
> """Print generic stats for one RPC op
> @@ -351,15 +353,15 @@ class DeviceData:
> exe_per_op = 0.0
>
> op += ':'
> - print '%s' % op.lower().ljust(15),
> - print ' ops/s\t\t kB/s\t\t kB/op\t\tretrans\t\tavg RTT (ms)\tavg exe (ms)'
> + print('%s' % op.lower().ljust(15))
> + print(' ops/s\t\t kB/s\t\t kB/op\t\tretrans\t\tavg RTT (ms)\tavg exe (ms)')
>
> - print '\t\t%7.3f' % (ops / sample_time),
> - print '\t%7.3f' % (kilobytes / sample_time),
> - print '\t%7.3f' % kb_per_op,
> - print ' %7d (%3.1f%%)' % (retrans, retrans_percent),
> - print '\t%7.3f' % rtt_per_op,
> - print '\t%7.3f' % exe_per_op
> + print('\t\t%7.3f' % (ops / sample_time))
> + print('\t%7.3f' % (kilobytes / sample_time))
> + print('\t%7.3f' % kb_per_op)
> + print(' %7d (%3.1f%%)' % (retrans, retrans_percent))
> + print('\t%7.3f' % rtt_per_op)
> + print('\t%7.3f' % exe_per_op)
>
> def ops(self, sample_time):
> sends = float(self.__rpc_data['rpcsends'])
> @@ -384,14 +386,14 @@ class DeviceData:
> else:
> backlog = 0.0
>
> - print
> - print '%s mounted on %s:' % \
> - (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
> - print
> + print()
> + print('%s mounted on %s:' % \
> + (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
> + print()
>
> - print ' op/s\t\trpc bklog'
> - print '%7.2f' % (sends / sample_time),
> - print '\t%7.2f' % backlog
> + print(' op/s\t\trpc bklog')
> + print('%7.2f' % (sends / sample_time))
> + print('\t%7.2f' % backlog)
>
> if which == 0:
> self.__print_rpc_op_stats('READ', sample_time)
> @@ -424,7 +426,7 @@ def parse_stats_file(filename):
> ms_dict = dict()
> key = ''
>
> - f = file(filename)
> + f = open(filename)
> for line in f.readlines():
> words = line.split()
> if len(words) == 0:
> @@ -494,7 +496,7 @@ def list_nfs_mounts(givenlist, mountstats):
> if stats.is_nfs_mountpoint():
> list += [device]
> else:
> - for device, descr in mountstats.iteritems():
> + for device, descr in mountstats.items():
> stats = DeviceData()
> stats.parse_stats(descr)
> if stats.is_nfs_mountpoint():
> @@ -527,7 +529,7 @@ client are listed.
> usage="usage: %prog [ <interval> [ <count> ] ] [ <options> ] [ <mount point> ]",
> description=mydescription,
> version='version %s' % Iostats_version)
> - parser.set_defaults(which=0, sort=False, list=sys.maxint)
> + parser.set_defaults(which=0, sort=False, list=sys.maxsize)
>
> statgroup = OptionGroup(parser, "Statistics Options",
> 'File I/O is displayed unless one of the following is specified:')
> @@ -572,29 +574,29 @@ client are listed.
> try:
> interval = int(arg)
> except:
> - print 'Illegal <interval> value %s' % arg
> + print('Illegal <interval> value %s' % arg)
> return
> if interval > 0:
> interval_seen = True
> else:
> - print 'Illegal <interval> value %s' % arg
> + print('Illegal <interval> value %s' % arg)
> return
> elif not count_seen:
> try:
> count = int(arg)
> except:
> - print 'Ilegal <count> value %s' % arg
> + print('Ilegal <count> value %s' % arg)
> return
> if count > 0:
> count_seen = True
> else:
> - print 'Illegal <count> value %s' % arg
> + print('Illegal <count> value %s' % arg)
> return
>
> # make certain devices contains only NFS mount points
> devices = list_nfs_mounts(origdevices, mountstats)
> if len(devices) == 0:
> - print 'No NFS mount points were found'
> + print('No NFS mount points were found')
> return
>
>
> @@ -616,7 +618,7 @@ client are listed.
> # we need to recheck the devices list when reparsing
> devices = list_nfs_mounts(origdevices,mountstats)
> if len(devices) == 0:
> - print 'No NFS mount points were found'
> + print('No NFS mount points were found')
> return
> count -= 1
> else:
> @@ -630,7 +632,7 @@ client are listed.
> # we need to recheck the devices list when reparsing
> devices = list_nfs_mounts(origdevices,mountstats)
> if len(devices) == 0:
> - print 'No NFS mount points were found'
> + print('No NFS mount points were found')
> return
>
> #
> @@ -641,7 +643,7 @@ prog = os.path.basename(sys.argv[0])
> try:
> iostat_command(prog)
> except KeyboardInterrupt:
> - print 'Caught ^C... exiting'
> + print('Caught ^C... exiting')
> sys.exit(1)
>
> sys.exit(0)
>