2013-09-17 09:21:28

by Slavek Kabrda

[permalink] [raw]
Subject: [PATCH] Make mountstats and nfs-iostat Python 3 compatible

This will make mountstat and nfs-iostat run on Python 2.6, 2.7
and >= 3.0

Signed-off-by: Bohuslav Kabrda <[email protected]>
---
tools/mountstats/mountstats.py | 310 ++++++++++++++++++++---------------------
tools/nfs-iostat/nfs-iostat.py | 22 +--
2 files changed, 166 insertions(+), 166 deletions(-)

diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
index b95b71d..3f5fea5 100644
--- a/tools/mountstats/mountstats.py
+++ b/tools/mountstats/mountstats.py
@@ -53,7 +53,7 @@ class DeviceData:
if words[6].find('nfs') != -1:
self.__nfs_data['statvers'] = words[7]
elif words[0] == 'age:':
- self.__nfs_data['age'] = long(words[1])
+ self.__nfs_data['age'] = int(words[1])
elif words[0] == 'opts:':
self.__nfs_data['mountoptions'] = ''.join(words[1:]).split(',')
elif words[0] == 'caps:':
@@ -91,12 +91,12 @@ class DeviceData:
self.__nfs_data['shortwrites'] = int(words[22])
self.__nfs_data['delay'] = int(words[23])
elif words[0] == 'bytes:':
- self.__nfs_data['normalreadbytes'] = long(words[1])
- self.__nfs_data['normalwritebytes'] = long(words[2])
- self.__nfs_data['directreadbytes'] = long(words[3])
- self.__nfs_data['directwritebytes'] = long(words[4])
- self.__nfs_data['serverreadbytes'] = long(words[5])
- self.__nfs_data['serverwritebytes'] = long(words[6])
+ self.__nfs_data['normalreadbytes'] = int(words[1])
+ self.__nfs_data['normalwritebytes'] = int(words[2])
+ self.__nfs_data['directreadbytes'] = int(words[3])
+ self.__nfs_data['directwritebytes'] = int(words[4])
+ self.__nfs_data['serverreadbytes'] = int(words[5])
+ self.__nfs_data['serverwritebytes'] = int(words[6])

def __parse_rpc_line(self, words):
if words[0] == 'RPC':
@@ -110,8 +110,8 @@ class DeviceData:
self.__rpc_data['rpcsends'] = int(words[4])
self.__rpc_data['rpcreceives'] = int(words[5])
self.__rpc_data['badxids'] = int(words[6])
- self.__rpc_data['inflightsends'] = long(words[7])
- self.__rpc_data['backlogutil'] = long(words[8])
+ self.__rpc_data['inflightsends'] = int(words[7])
+ self.__rpc_data['backlogutil'] = int(words[8])
elif words[1] == 'tcp':
self.__rpc_data['port'] = words[2]
self.__rpc_data['bind_count'] = int(words[3])
@@ -121,7 +121,7 @@ class DeviceData:
self.__rpc_data['rpcsends'] = int(words[7])
self.__rpc_data['rpcreceives'] = int(words[8])
self.__rpc_data['badxids'] = int(words[9])
- self.__rpc_data['inflightsends'] = long(words[10])
+ self.__rpc_data['inflightsends'] = int(words[10])
self.__rpc_data['backlogutil'] = int(words[11])
elif words[1] == 'rdma':
self.__rpc_data['port'] = words[2]
@@ -148,7 +148,7 @@ class DeviceData:
else:
op = words[0][:-1]
self.__rpc_data['ops'] += [op]
- self.__rpc_data[op] = [long(word) for word in words[1:]]
+ self.__rpc_data[op] = [int(word) for word in words[1:]]

def parse_stats(self, lines):
"""Turn a list of lines from a mount stat file into a
@@ -179,81 +179,81 @@ class DeviceData:
def display_nfs_options(self):
"""Pretty-print the NFS options
"""
- print 'Stats for %s mounted on %s:' % \
- (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
-
- print ' NFS mount options: %s' % ','.join(self.__nfs_data['mountoptions'])
- print ' NFS server capabilities: %s' % ','.join(self.__nfs_data['servercapabilities'])
- if self.__nfs_data.has_key('nfsv4flags'):
- print ' NFSv4 capability flags: %s' % ','.join(self.__nfs_data['nfsv4flags'])
- if self.__nfs_data.has_key('pseudoflavor'):
- print ' NFS security flavor: %d pseudoflavor: %d' % \
- (self.__nfs_data['flavor'], self.__nfs_data['pseudoflavor'])
+ print('Stats for %s mounted on %s:' % \
+ (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
+
+ print(' NFS mount options: %s' % ','.join(self.__nfs_data['mountoptions']))
+ print(' NFS server capabilities: %s' % ','.join(self.__nfs_data['servercapabilities']))
+ if 'nfsv4flags' in self.__nfs_data:
+ print(' NFSv4 capability flags: %s' % ','.join(self.__nfs_data['nfsv4flags']))
+ if 'pseudoflavor' in self.__nfs_data:
+ print(' NFS security flavor: %d pseudoflavor: %d' % \
+ (self.__nfs_data['flavor'], self.__nfs_data['pseudoflavor']))
else:
- print ' NFS security flavor: %d' % self.__nfs_data['flavor']
+ print(' NFS security flavor: %d' % self.__nfs_data['flavor'])

def display_nfs_events(self):
"""Pretty-print the NFS event counters
"""
- print
- print 'Cache events:'
- print ' data cache invalidated %d times' % self.__nfs_data['datainvalidates']
- print ' attribute cache invalidated %d times' % self.__nfs_data['attrinvalidates']
- print ' inodes synced %d times' % self.__nfs_data['syncinodes']
- print
- print 'VFS calls:'
- print ' VFS requested %d inode revalidations' % self.__nfs_data['inoderevalidates']
- print ' VFS requested %d dentry revalidations' % self.__nfs_data['dentryrevalidates']
- print
- print ' VFS called nfs_readdir() %d times' % self.__nfs_data['vfsreaddir']
- print ' VFS called nfs_lookup() %d times' % self.__nfs_data['vfslookup']
- print ' VFS called nfs_permission() %d times' % self.__nfs_data['vfspermission']
- print ' VFS called nfs_file_open() %d times' % self.__nfs_data['vfsopen']
- print ' VFS called nfs_file_flush() %d times' % self.__nfs_data['vfsflush']
- print ' VFS called nfs_lock() %d times' % self.__nfs_data['vfslock']
- print ' VFS called nfs_fsync() %d times' % self.__nfs_data['vfsfsync']
- print ' VFS called nfs_file_release() %d times' % self.__nfs_data['vfsrelease']
- print
- print 'VM calls:'
- print ' VFS called nfs_readpage() %d times' % self.__nfs_data['vfsreadpage']
- print ' VFS called nfs_readpages() %d times' % self.__nfs_data['vfsreadpages']
- print ' VFS called nfs_writepage() %d times' % self.__nfs_data['vfswritepage']
- print ' VFS called nfs_writepages() %d times' % self.__nfs_data['vfswritepages']
- print
- print 'Generic NFS counters:'
- print ' File size changing operations:'
- print ' truncating SETATTRs: %d extending WRITEs: %d' % \
- (self.__nfs_data['setattrtrunc'], self.__nfs_data['extendwrite'])
- print ' %d silly renames' % self.__nfs_data['sillyrenames']
- print ' short reads: %d short writes: %d' % \
- (self.__nfs_data['shortreads'], self.__nfs_data['shortwrites'])
- print ' NFSERR_DELAYs from server: %d' % self.__nfs_data['delay']
+ print()
+ print('Cache events:')
+ print(' data cache invalidated %d times' % self.__nfs_data['datainvalidates'])
+ print(' attribute cache invalidated %d times' % self.__nfs_data['attrinvalidates'])
+ print(' inodes synced %d times' % self.__nfs_data['syncinodes'])
+ print()
+ print('VFS calls:')
+ print(' VFS requested %d inode revalidations' % self.__nfs_data['inoderevalidates'])
+ print(' VFS requested %d dentry revalidations' % self.__nfs_data['dentryrevalidates'])
+ print()
+ print(' VFS called nfs_readdir() %d times' % self.__nfs_data['vfsreaddir'])
+ print(' VFS called nfs_lookup() %d times' % self.__nfs_data['vfslookup'])
+ print(' VFS called nfs_permission() %d times' % self.__nfs_data['vfspermission'])
+ print(' VFS called nfs_file_open() %d times' % self.__nfs_data['vfsopen'])
+ print(' VFS called nfs_file_flush() %d times' % self.__nfs_data['vfsflush'])
+ print(' VFS called nfs_lock() %d times' % self.__nfs_data['vfslock'])
+ print(' VFS called nfs_fsync() %d times' % self.__nfs_data['vfsfsync'])
+ print(' VFS called nfs_file_release() %d times' % self.__nfs_data['vfsrelease'])
+ print()
+ print('VM calls:')
+ print(' VFS called nfs_readpage() %d times' % self.__nfs_data['vfsreadpage'])
+ print(' VFS called nfs_readpages() %d times' % self.__nfs_data['vfsreadpages'])
+ print(' VFS called nfs_writepage() %d times' % self.__nfs_data['vfswritepage'])
+ print(' VFS called nfs_writepages() %d times' % self.__nfs_data['vfswritepages'])
+ print()
+ print('Generic NFS counters:')
+ print(' File size changing operations:')
+ print(' truncating SETATTRs: %d extending WRITEs: %d' % \
+ (self.__nfs_data['setattrtrunc'], self.__nfs_data['extendwrite']))
+ print(' %d silly renames' % self.__nfs_data['sillyrenames'])
+ print(' short reads: %d short writes: %d' % \
+ (self.__nfs_data['shortreads'], self.__nfs_data['shortwrites']))
+ print(' NFSERR_DELAYs from server: %d' % self.__nfs_data['delay'])

def display_nfs_bytes(self):
"""Pretty-print the NFS event counters
"""
- print
- print 'NFS byte counts:'
- print ' applications read %d bytes via read(2)' % self.__nfs_data['normalreadbytes']
- print ' applications wrote %d bytes via write(2)' % self.__nfs_data['normalwritebytes']
- print ' applications read %d bytes via O_DIRECT read(2)' % self.__nfs_data['directreadbytes']
- print ' applications wrote %d bytes via O_DIRECT write(2)' % self.__nfs_data['directwritebytes']
- print ' client read %d bytes via NFS READ' % self.__nfs_data['serverreadbytes']
- print ' client wrote %d bytes via NFS WRITE' % self.__nfs_data['serverwritebytes']
+ print()
+ print('NFS byte counts:')
+ print(' applications read %d bytes via read(2)' % self.__nfs_data['normalreadbytes'])
+ print(' applications wrote %d bytes via write(2)' % self.__nfs_data['normalwritebytes'])
+ print(' applications read %d bytes via O_DIRECT read(2)' % self.__nfs_data['directreadbytes'])
+ print(' applications wrote %d bytes via O_DIRECT write(2)' % self.__nfs_data['directwritebytes'])
+ print(' client read %d bytes via NFS READ' % self.__nfs_data['serverreadbytes'])
+ print(' client wrote %d bytes via NFS WRITE' % self.__nfs_data['serverwritebytes'])

def display_rpc_generic_stats(self):
"""Pretty-print the generic RPC stats
"""
sends = self.__rpc_data['rpcsends']

- print
- print 'RPC statistics:'
+ print()
+ print('RPC statistics:')

- print ' %d RPC requests sent, %d RPC replies received (%d XIDs not found)' % \
- (sends, self.__rpc_data['rpcreceives'], self.__rpc_data['badxids'])
+ print(' %d RPC requests sent, %d RPC replies received (%d XIDs not found)' % \
+ (sends, self.__rpc_data['rpcreceives'], self.__rpc_data['badxids']))
if sends != 0:
- print ' average backlog queue length: %d' % \
- (float(self.__rpc_data['backlogutil']) / sends)
+ print(' average backlog queue length: %d' % \
+ (float(self.__rpc_data['backlogutil']) / sends))

def display_rpc_op_stats(self):
"""Pretty-print the per-op stats
@@ -261,23 +261,23 @@ class DeviceData:
sends = self.__rpc_data['rpcsends']

# XXX: these should be sorted by 'count'
- print
+ print()
for op in self.__rpc_data['ops']:
stats = self.__rpc_data[op]
count = stats[0]
retrans = stats[1] - count
if count != 0:
- print '%s:' % op
- print '\t%d ops (%d%%)' % \
- (count, ((count * 100) / sends)),
- print '\t%d retrans (%d%%)' % (retrans, ((retrans * 100) / count)),
- print '\t%d major timeouts' % stats[2]
- print '\tavg bytes sent per op: %d\tavg bytes received per op: %d' % \
- (stats[3] / count, stats[4] / count)
- print '\tbacklog wait: %f' % (float(stats[5]) / count),
- print '\tRTT: %f' % (float(stats[6]) / count),
- print '\ttotal execute time: %f (milliseconds)' % \
- (float(stats[7]) / count)
+ print('%s:' % op)
+ print('\t%d ops (%d%%)' % \
+ (count, ((count * 100) / sends)), end=' ')
+ print('\t%d retrans (%d%%)' % (retrans, ((retrans * 100) / count)), end=' ')
+ print('\t%d major timeouts' % stats[2])
+ print('\tavg bytes sent per op: %d\tavg bytes received per op: %d' % \
+ (stats[3] / count, stats[4] / count))
+ print('\tbacklog wait: %f' % (float(stats[5]) / count), end=' ')
+ print('\tRTT: %f' % (float(stats[6]) / count), end=' ')
+ print('\ttotal execute time: %f (milliseconds)' % \
+ (float(stats[7]) / count))

def compare_iostats(self, old_stats):
"""Return the difference between two sets of stats
@@ -285,9 +285,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
@@ -295,7 +295,7 @@ class DeviceData:
# the reference to them. so we build new lists here
# for the result object.
for op in result.__rpc_data['ops']:
- result.__rpc_data[op] = map(difference, self.__rpc_data[op], old_stats.__rpc_data[op])
+ result.__rpc_data[op] = list(map(difference, self.__rpc_data[op], old_stats.__rpc_data[op]))

# update the remaining keys we care about
result.__rpc_data['rpcsends'] -= old_stats.__rpc_data['rpcsends']
@@ -312,17 +312,17 @@ class DeviceData:
if sample_time == 0:
sample_time = float(self.__nfs_data['age'])

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

- print '\top/s\trpc bklog'
- print '\t%.2f' % (sends / sample_time),
+ print('\top/s\trpc bklog')
+ print('\t%.2f' % (sends / sample_time), end=' ')
if sends != 0:
- print '\t%.2f' % \
- ((float(self.__rpc_data['backlogutil']) / sends) / sample_time)
+ print('\t%.2f' % \
+ ((float(self.__rpc_data['backlogutil']) / sends) / sample_time))
else:
- print '\t0.00'
+ print('\t0.00')

# reads: ops/s, kB/s, avg rtt, and avg exe
# XXX: include avg xfer size and retransmits?
@@ -332,15 +332,15 @@ class DeviceData:
rtt = float(read_rpc_stats[6])
exe = float(read_rpc_stats[7])

- print '\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
- print '\t\t%.2f' % (ops / sample_time),
- print '\t\t%.2f' % (kilobytes / sample_time),
+ print('\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
+ print('\t\t%.2f' % (ops / sample_time), end=' ')
+ print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
if ops != 0:
- print '\t\t%.2f' % (rtt / ops),
- print '\t\t%.2f' % (exe / ops)
+ print('\t\t%.2f' % (rtt / ops), end=' ')
+ print('\t\t%.2f' % (exe / ops))
else:
- print '\t\t0.00',
- print '\t\t0.00'
+ print('\t\t0.00', end=' ')
+ print('\t\t0.00')

# writes: ops/s, kB/s, avg rtt, and avg exe
# XXX: include avg xfer size and retransmits?
@@ -350,15 +350,15 @@ class DeviceData:
rtt = float(write_rpc_stats[6])
exe = float(write_rpc_stats[7])

- print '\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
- print '\t\t%.2f' % (ops / sample_time),
- print '\t\t%.2f' % (kilobytes / sample_time),
+ print('\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
+ print('\t\t%.2f' % (ops / sample_time), end=' ')
+ print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
if ops != 0:
- print '\t\t%.2f' % (rtt / ops),
- print '\t\t%.2f' % (exe / ops)
+ print('\t\t%.2f' % (rtt / ops), end=' ')
+ print('\t\t%.2f' % (exe / ops))
else:
- print '\t\t0.00',
- print '\t\t0.00'
+ print('\t\t0.00', end=' ')
+ print('\t\t0.00')

def parse_stats_file(filename):
"""pop the contents of a mountstats file into a dictionary,
@@ -388,18 +388,18 @@ def parse_stats_file(filename):
return ms_dict

def print_mountstats_help(name):
- print 'usage: %s [ options ] <mount point>' % name
- print
- print ' Version %s' % Mountstats_version
- print
- print ' Display NFS client per-mount statistics.'
- print
- print ' --version display the version of this command'
- print ' --nfs display only the NFS statistics'
- print ' --rpc display only the RPC statistics'
- print ' --start sample and save statistics'
- print ' --end resample statistics and compare them with saved'
- print
+ print('usage: %s [ options ] <mount point>' % name)
+ print()
+ print(' Version %s' % Mountstats_version)
+ print()
+ print(' Display NFS client per-mount statistics.')
+ print()
+ print(' --version display the version of this command')
+ print(' --nfs display only the NFS statistics')
+ print(' --rpc display only the RPC statistics')
+ print(' --start sample and save statistics')
+ print(' --end resample statistics and compare them with saved')
+ print()

def mountstats_command():
"""Mountstats command
@@ -414,7 +414,7 @@ def mountstats_command():
return

if arg in ['-v', '--version', 'version']:
- print '%s version %s' % (sys.argv[0], Mountstats_version)
+ print('%s version %s' % (sys.argv[0], Mountstats_version))
sys.exit(0)

if arg in ['-n', '--nfs']:
@@ -426,10 +426,10 @@ def mountstats_command():
continue

if arg in ['-s', '--start']:
- raise Exception, 'Sampling is not yet implemented'
+ raise Exception('Sampling is not yet implemented')

if arg in ['-e', '--end']:
- raise Exception, 'Sampling is not yet implemented'
+ raise Exception('Sampling is not yet implemented')

if arg == sys.argv[0]:
continue
@@ -448,14 +448,14 @@ def mountstats_command():

for mp in mountpoints:
if mp not in mountstats:
- print 'Statistics for mount point %s not found' % mp
+ print('Statistics for mount point %s not found' % mp)
continue

stats = DeviceData()
stats.parse_stats(mountstats[mp])

if not stats.is_nfs_mountpoint():
- print 'Mount point %s exists but is not an NFS mount' % mp
+ print('Mount point %s exists but is not an NFS mount' % mp)
continue

if nfs_only:
@@ -472,37 +472,37 @@ def mountstats_command():
stats.display_rpc_op_stats()

def print_nfsstat_help(name):
- print 'usage: %s [ options ]' % name
- print
- print ' Version %s' % Mountstats_version
- print
- print ' nfsstat-like program that uses NFS client per-mount statistics.'
- print
+ print('usage: %s [ options ]' % name)
+ print()
+ print(' Version %s' % Mountstats_version)
+ print()
+ print(' nfsstat-like program that uses NFS client per-mount statistics.')
+ print()

def nfsstat_command():
print_nfsstat_help(prog)

def print_iostat_help(name):
- print 'usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' % name
- print
- print ' Version %s' % Mountstats_version
- print
- print ' 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 ' 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.'
- print
+ print('usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' % name)
+ print()
+ print(' Version %s' % Mountstats_version)
+ print()
+ print(' 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(' 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.')
+ print()

def print_iostat_summary(old, new, devices, time):
for device in devices:
@@ -530,7 +530,7 @@ def iostat_command():
return

if arg in ['-v', '--version', 'version']:
- print '%s version %s' % (sys.argv[0], Mountstats_version)
+ print('%s version %s' % (sys.argv[0], Mountstats_version))
return

if arg == sys.argv[0]:
@@ -543,14 +543,14 @@ def iostat_command():
if interval > 0:
interval_seen = True
else:
- print 'Illegal <interval> value'
+ print('Illegal <interval> value')
return
elif not count_seen:
count = int(arg)
if count > 0:
count_seen = True
else:
- print 'Illegal <count> value'
+ print('Illegal <count> value')
return

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

old_mountstats = None
@@ -608,7 +608,7 @@ try:
elif prog == 'ms-iostat':
iostat_command()
except KeyboardInterrupt:
- print 'Caught ^C... exiting'
+ print('Caught ^C... exiting')
sys.exit(1)

sys.exit(0)
diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
index c035537..1c523f9 100644
--- a/tools/nfs-iostat/nfs-iostat.py
+++ b/tools/nfs-iostat/nfs-iostat.py
@@ -95,7 +95,7 @@ class DeviceData:
if words[6] == 'nfs':
self.__nfs_data['statvers'] = words[7]
elif words[0] == 'age:':
- self.__nfs_data['age'] = long(words[1])
+ self.__nfs_data['age'] = int(words[1])
elif words[0] == 'opts:':
self.__nfs_data['mountoptions'] = ''.join(words[1:]).split(',')
elif words[0] == 'caps:':
@@ -116,7 +116,7 @@ class DeviceData:
elif words[0] == 'bytes:':
i = 1
for key in NfsByteCounters:
- self.__nfs_data[key] = long(words[i])
+ self.__nfs_data[key] = int(words[i])
i += 1

def __parse_rpc_line(self, words):
@@ -131,8 +131,8 @@ class DeviceData:
self.__rpc_data['rpcsends'] = int(words[4])
self.__rpc_data['rpcreceives'] = int(words[5])
self.__rpc_data['badxids'] = int(words[6])
- self.__rpc_data['inflightsends'] = long(words[7])
- self.__rpc_data['backlogutil'] = long(words[8])
+ self.__rpc_data['inflightsends'] = int(words[7])
+ self.__rpc_data['backlogutil'] = int(words[8])
elif words[1] == 'tcp':
self.__rpc_data['port'] = words[2]
self.__rpc_data['bind_count'] = int(words[3])
@@ -142,8 +142,8 @@ class DeviceData:
self.__rpc_data['rpcsends'] = int(words[7])
self.__rpc_data['rpcreceives'] = int(words[8])
self.__rpc_data['badxids'] = int(words[9])
- self.__rpc_data['inflightsends'] = long(words[10])
- self.__rpc_data['backlogutil'] = long(words[11])
+ self.__rpc_data['inflightsends'] = int(words[10])
+ self.__rpc_data['backlogutil'] = int(words[11])
elif words[1] == 'rdma':
self.__rpc_data['port'] = words[2]
self.__rpc_data['bind_count'] = int(words[3])
@@ -169,7 +169,7 @@ class DeviceData:
else:
op = words[0][:-1]
self.__rpc_data['ops'] += [op]
- self.__rpc_data[op] = [long(word) for word in words[1:]]
+ self.__rpc_data[op] = [int(word) for word in words[1:]]

def parse_stats(self, lines):
"""Turn a list of lines from a mount stat file into a
@@ -271,7 +271,7 @@ class DeviceData:
nfs_stats = self.__nfs_data
lookup_ops = self.__rpc_data['LOOKUP'][0]
readdir_ops = self.__rpc_data['READDIR'][0]
- if self.__rpc_data.has_key('READDIRPLUS'):
+ if 'READDIRPLUS' in self.__rpc_data:
readdir_ops += self.__rpc_data['READDIRPLUS'][0]

dentry_revals = nfs_stats['dentryrevalidates']
@@ -330,7 +330,7 @@ class DeviceData:
def __print_rpc_op_stats(self, op, sample_time):
"""Print generic stats for one RPC op
"""
- if not self.__rpc_data.has_key(op):
+ if op not in self.__rpc_data:
return

rpc_stats = self.__rpc_data[op]
@@ -405,7 +405,7 @@ class DeviceData:
elif which == 2:
self.__print_rpc_op_stats('LOOKUP', sample_time)
self.__print_rpc_op_stats('READDIR', sample_time)
- if self.__rpc_data.has_key('READDIRPLUS'):
+ if 'READDIRPLUS' in self.__rpc_data:
self.__print_rpc_op_stats('READDIRPLUS', sample_time)
self.__print_dir_cache_stats(sample_time)
elif which == 3:
@@ -450,7 +450,7 @@ def print_iostat_summary(old, new, devices, time, options):
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)
+ devicelist = [x for x in old if x in devices]
else:
devicelist = devices

--
1.8.3.1



2013-09-17 12:21:42

by Jim Rees

[permalink] [raw]
Subject: Re: [PATCH] Make mountstats and nfs-iostat Python 3 compatible

Bohuslav Kabrda wrote:

This will make mountstat and nfs-iostat run on Python 2.6, 2.7
and >= 3.0

Thanks! I looked at this once but was put off by all those prints. I know
there's a conversion program but I've never used it.

2013-09-18 19:15:49

by Steve Dickson

[permalink] [raw]
Subject: Re: [PATCH] Make mountstats and nfs-iostat Python 3 compatible



On 17/09/13 05:21, Bohuslav Kabrda wrote:
> This will make mountstat and nfs-iostat run on Python 2.6, 2.7
> and >= 3.0
>
> Signed-off-by: Bohuslav Kabrda <[email protected]>
Committed!

steved.

> ---
> tools/mountstats/mountstats.py | 310 ++++++++++++++++++++---------------------
> tools/nfs-iostat/nfs-iostat.py | 22 +--
> 2 files changed, 166 insertions(+), 166 deletions(-)
>
> diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
> index b95b71d..3f5fea5 100644
> --- a/tools/mountstats/mountstats.py
> +++ b/tools/mountstats/mountstats.py
> @@ -53,7 +53,7 @@ class DeviceData:
> if words[6].find('nfs') != -1:
> self.__nfs_data['statvers'] = words[7]
> elif words[0] == 'age:':
> - self.__nfs_data['age'] = long(words[1])
> + self.__nfs_data['age'] = int(words[1])
> elif words[0] == 'opts:':
> self.__nfs_data['mountoptions'] = ''.join(words[1:]).split(',')
> elif words[0] == 'caps:':
> @@ -91,12 +91,12 @@ class DeviceData:
> self.__nfs_data['shortwrites'] = int(words[22])
> self.__nfs_data['delay'] = int(words[23])
> elif words[0] == 'bytes:':
> - self.__nfs_data['normalreadbytes'] = long(words[1])
> - self.__nfs_data['normalwritebytes'] = long(words[2])
> - self.__nfs_data['directreadbytes'] = long(words[3])
> - self.__nfs_data['directwritebytes'] = long(words[4])
> - self.__nfs_data['serverreadbytes'] = long(words[5])
> - self.__nfs_data['serverwritebytes'] = long(words[6])
> + self.__nfs_data['normalreadbytes'] = int(words[1])
> + self.__nfs_data['normalwritebytes'] = int(words[2])
> + self.__nfs_data['directreadbytes'] = int(words[3])
> + self.__nfs_data['directwritebytes'] = int(words[4])
> + self.__nfs_data['serverreadbytes'] = int(words[5])
> + self.__nfs_data['serverwritebytes'] = int(words[6])
>
> def __parse_rpc_line(self, words):
> if words[0] == 'RPC':
> @@ -110,8 +110,8 @@ class DeviceData:
> self.__rpc_data['rpcsends'] = int(words[4])
> self.__rpc_data['rpcreceives'] = int(words[5])
> self.__rpc_data['badxids'] = int(words[6])
> - self.__rpc_data['inflightsends'] = long(words[7])
> - self.__rpc_data['backlogutil'] = long(words[8])
> + self.__rpc_data['inflightsends'] = int(words[7])
> + self.__rpc_data['backlogutil'] = int(words[8])
> elif words[1] == 'tcp':
> self.__rpc_data['port'] = words[2]
> self.__rpc_data['bind_count'] = int(words[3])
> @@ -121,7 +121,7 @@ class DeviceData:
> self.__rpc_data['rpcsends'] = int(words[7])
> self.__rpc_data['rpcreceives'] = int(words[8])
> self.__rpc_data['badxids'] = int(words[9])
> - self.__rpc_data['inflightsends'] = long(words[10])
> + self.__rpc_data['inflightsends'] = int(words[10])
> self.__rpc_data['backlogutil'] = int(words[11])
> elif words[1] == 'rdma':
> self.__rpc_data['port'] = words[2]
> @@ -148,7 +148,7 @@ class DeviceData:
> else:
> op = words[0][:-1]
> self.__rpc_data['ops'] += [op]
> - self.__rpc_data[op] = [long(word) for word in words[1:]]
> + self.__rpc_data[op] = [int(word) for word in words[1:]]
>
> def parse_stats(self, lines):
> """Turn a list of lines from a mount stat file into a
> @@ -179,81 +179,81 @@ class DeviceData:
> def display_nfs_options(self):
> """Pretty-print the NFS options
> """
> - print 'Stats for %s mounted on %s:' % \
> - (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
> -
> - print ' NFS mount options: %s' % ','.join(self.__nfs_data['mountoptions'])
> - print ' NFS server capabilities: %s' % ','.join(self.__nfs_data['servercapabilities'])
> - if self.__nfs_data.has_key('nfsv4flags'):
> - print ' NFSv4 capability flags: %s' % ','.join(self.__nfs_data['nfsv4flags'])
> - if self.__nfs_data.has_key('pseudoflavor'):
> - print ' NFS security flavor: %d pseudoflavor: %d' % \
> - (self.__nfs_data['flavor'], self.__nfs_data['pseudoflavor'])
> + print('Stats for %s mounted on %s:' % \
> + (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
> +
> + print(' NFS mount options: %s' % ','.join(self.__nfs_data['mountoptions']))
> + print(' NFS server capabilities: %s' % ','.join(self.__nfs_data['servercapabilities']))
> + if 'nfsv4flags' in self.__nfs_data:
> + print(' NFSv4 capability flags: %s' % ','.join(self.__nfs_data['nfsv4flags']))
> + if 'pseudoflavor' in self.__nfs_data:
> + print(' NFS security flavor: %d pseudoflavor: %d' % \
> + (self.__nfs_data['flavor'], self.__nfs_data['pseudoflavor']))
> else:
> - print ' NFS security flavor: %d' % self.__nfs_data['flavor']
> + print(' NFS security flavor: %d' % self.__nfs_data['flavor'])
>
> def display_nfs_events(self):
> """Pretty-print the NFS event counters
> """
> - print
> - print 'Cache events:'
> - print ' data cache invalidated %d times' % self.__nfs_data['datainvalidates']
> - print ' attribute cache invalidated %d times' % self.__nfs_data['attrinvalidates']
> - print ' inodes synced %d times' % self.__nfs_data['syncinodes']
> - print
> - print 'VFS calls:'
> - print ' VFS requested %d inode revalidations' % self.__nfs_data['inoderevalidates']
> - print ' VFS requested %d dentry revalidations' % self.__nfs_data['dentryrevalidates']
> - print
> - print ' VFS called nfs_readdir() %d times' % self.__nfs_data['vfsreaddir']
> - print ' VFS called nfs_lookup() %d times' % self.__nfs_data['vfslookup']
> - print ' VFS called nfs_permission() %d times' % self.__nfs_data['vfspermission']
> - print ' VFS called nfs_file_open() %d times' % self.__nfs_data['vfsopen']
> - print ' VFS called nfs_file_flush() %d times' % self.__nfs_data['vfsflush']
> - print ' VFS called nfs_lock() %d times' % self.__nfs_data['vfslock']
> - print ' VFS called nfs_fsync() %d times' % self.__nfs_data['vfsfsync']
> - print ' VFS called nfs_file_release() %d times' % self.__nfs_data['vfsrelease']
> - print
> - print 'VM calls:'
> - print ' VFS called nfs_readpage() %d times' % self.__nfs_data['vfsreadpage']
> - print ' VFS called nfs_readpages() %d times' % self.__nfs_data['vfsreadpages']
> - print ' VFS called nfs_writepage() %d times' % self.__nfs_data['vfswritepage']
> - print ' VFS called nfs_writepages() %d times' % self.__nfs_data['vfswritepages']
> - print
> - print 'Generic NFS counters:'
> - print ' File size changing operations:'
> - print ' truncating SETATTRs: %d extending WRITEs: %d' % \
> - (self.__nfs_data['setattrtrunc'], self.__nfs_data['extendwrite'])
> - print ' %d silly renames' % self.__nfs_data['sillyrenames']
> - print ' short reads: %d short writes: %d' % \
> - (self.__nfs_data['shortreads'], self.__nfs_data['shortwrites'])
> - print ' NFSERR_DELAYs from server: %d' % self.__nfs_data['delay']
> + print()
> + print('Cache events:')
> + print(' data cache invalidated %d times' % self.__nfs_data['datainvalidates'])
> + print(' attribute cache invalidated %d times' % self.__nfs_data['attrinvalidates'])
> + print(' inodes synced %d times' % self.__nfs_data['syncinodes'])
> + print()
> + print('VFS calls:')
> + print(' VFS requested %d inode revalidations' % self.__nfs_data['inoderevalidates'])
> + print(' VFS requested %d dentry revalidations' % self.__nfs_data['dentryrevalidates'])
> + print()
> + print(' VFS called nfs_readdir() %d times' % self.__nfs_data['vfsreaddir'])
> + print(' VFS called nfs_lookup() %d times' % self.__nfs_data['vfslookup'])
> + print(' VFS called nfs_permission() %d times' % self.__nfs_data['vfspermission'])
> + print(' VFS called nfs_file_open() %d times' % self.__nfs_data['vfsopen'])
> + print(' VFS called nfs_file_flush() %d times' % self.__nfs_data['vfsflush'])
> + print(' VFS called nfs_lock() %d times' % self.__nfs_data['vfslock'])
> + print(' VFS called nfs_fsync() %d times' % self.__nfs_data['vfsfsync'])
> + print(' VFS called nfs_file_release() %d times' % self.__nfs_data['vfsrelease'])
> + print()
> + print('VM calls:')
> + print(' VFS called nfs_readpage() %d times' % self.__nfs_data['vfsreadpage'])
> + print(' VFS called nfs_readpages() %d times' % self.__nfs_data['vfsreadpages'])
> + print(' VFS called nfs_writepage() %d times' % self.__nfs_data['vfswritepage'])
> + print(' VFS called nfs_writepages() %d times' % self.__nfs_data['vfswritepages'])
> + print()
> + print('Generic NFS counters:')
> + print(' File size changing operations:')
> + print(' truncating SETATTRs: %d extending WRITEs: %d' % \
> + (self.__nfs_data['setattrtrunc'], self.__nfs_data['extendwrite']))
> + print(' %d silly renames' % self.__nfs_data['sillyrenames'])
> + print(' short reads: %d short writes: %d' % \
> + (self.__nfs_data['shortreads'], self.__nfs_data['shortwrites']))
> + print(' NFSERR_DELAYs from server: %d' % self.__nfs_data['delay'])
>
> def display_nfs_bytes(self):
> """Pretty-print the NFS event counters
> """
> - print
> - print 'NFS byte counts:'
> - print ' applications read %d bytes via read(2)' % self.__nfs_data['normalreadbytes']
> - print ' applications wrote %d bytes via write(2)' % self.__nfs_data['normalwritebytes']
> - print ' applications read %d bytes via O_DIRECT read(2)' % self.__nfs_data['directreadbytes']
> - print ' applications wrote %d bytes via O_DIRECT write(2)' % self.__nfs_data['directwritebytes']
> - print ' client read %d bytes via NFS READ' % self.__nfs_data['serverreadbytes']
> - print ' client wrote %d bytes via NFS WRITE' % self.__nfs_data['serverwritebytes']
> + print()
> + print('NFS byte counts:')
> + print(' applications read %d bytes via read(2)' % self.__nfs_data['normalreadbytes'])
> + print(' applications wrote %d bytes via write(2)' % self.__nfs_data['normalwritebytes'])
> + print(' applications read %d bytes via O_DIRECT read(2)' % self.__nfs_data['directreadbytes'])
> + print(' applications wrote %d bytes via O_DIRECT write(2)' % self.__nfs_data['directwritebytes'])
> + print(' client read %d bytes via NFS READ' % self.__nfs_data['serverreadbytes'])
> + print(' client wrote %d bytes via NFS WRITE' % self.__nfs_data['serverwritebytes'])
>
> def display_rpc_generic_stats(self):
> """Pretty-print the generic RPC stats
> """
> sends = self.__rpc_data['rpcsends']
>
> - print
> - print 'RPC statistics:'
> + print()
> + print('RPC statistics:')
>
> - print ' %d RPC requests sent, %d RPC replies received (%d XIDs not found)' % \
> - (sends, self.__rpc_data['rpcreceives'], self.__rpc_data['badxids'])
> + print(' %d RPC requests sent, %d RPC replies received (%d XIDs not found)' % \
> + (sends, self.__rpc_data['rpcreceives'], self.__rpc_data['badxids']))
> if sends != 0:
> - print ' average backlog queue length: %d' % \
> - (float(self.__rpc_data['backlogutil']) / sends)
> + print(' average backlog queue length: %d' % \
> + (float(self.__rpc_data['backlogutil']) / sends))
>
> def display_rpc_op_stats(self):
> """Pretty-print the per-op stats
> @@ -261,23 +261,23 @@ class DeviceData:
> sends = self.__rpc_data['rpcsends']
>
> # XXX: these should be sorted by 'count'
> - print
> + print()
> for op in self.__rpc_data['ops']:
> stats = self.__rpc_data[op]
> count = stats[0]
> retrans = stats[1] - count
> if count != 0:
> - print '%s:' % op
> - print '\t%d ops (%d%%)' % \
> - (count, ((count * 100) / sends)),
> - print '\t%d retrans (%d%%)' % (retrans, ((retrans * 100) / count)),
> - print '\t%d major timeouts' % stats[2]
> - print '\tavg bytes sent per op: %d\tavg bytes received per op: %d' % \
> - (stats[3] / count, stats[4] / count)
> - print '\tbacklog wait: %f' % (float(stats[5]) / count),
> - print '\tRTT: %f' % (float(stats[6]) / count),
> - print '\ttotal execute time: %f (milliseconds)' % \
> - (float(stats[7]) / count)
> + print('%s:' % op)
> + print('\t%d ops (%d%%)' % \
> + (count, ((count * 100) / sends)), end=' ')
> + print('\t%d retrans (%d%%)' % (retrans, ((retrans * 100) / count)), end=' ')
> + print('\t%d major timeouts' % stats[2])
> + print('\tavg bytes sent per op: %d\tavg bytes received per op: %d' % \
> + (stats[3] / count, stats[4] / count))
> + print('\tbacklog wait: %f' % (float(stats[5]) / count), end=' ')
> + print('\tRTT: %f' % (float(stats[6]) / count), end=' ')
> + print('\ttotal execute time: %f (milliseconds)' % \
> + (float(stats[7]) / count))
>
> def compare_iostats(self, old_stats):
> """Return the difference between two sets of stats
> @@ -285,9 +285,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
> @@ -295,7 +295,7 @@ class DeviceData:
> # the reference to them. so we build new lists here
> # for the result object.
> for op in result.__rpc_data['ops']:
> - result.__rpc_data[op] = map(difference, self.__rpc_data[op], old_stats.__rpc_data[op])
> + result.__rpc_data[op] = list(map(difference, self.__rpc_data[op], old_stats.__rpc_data[op]))
>
> # update the remaining keys we care about
> result.__rpc_data['rpcsends'] -= old_stats.__rpc_data['rpcsends']
> @@ -312,17 +312,17 @@ class DeviceData:
> if sample_time == 0:
> sample_time = float(self.__nfs_data['age'])
>
> - print
> - print '%s mounted on %s:' % \
> - (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
> + print()
> + print('%s mounted on %s:' % \
> + (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
>
> - print '\top/s\trpc bklog'
> - print '\t%.2f' % (sends / sample_time),
> + print('\top/s\trpc bklog')
> + print('\t%.2f' % (sends / sample_time), end=' ')
> if sends != 0:
> - print '\t%.2f' % \
> - ((float(self.__rpc_data['backlogutil']) / sends) / sample_time)
> + print('\t%.2f' % \
> + ((float(self.__rpc_data['backlogutil']) / sends) / sample_time))
> else:
> - print '\t0.00'
> + print('\t0.00')
>
> # reads: ops/s, kB/s, avg rtt, and avg exe
> # XXX: include avg xfer size and retransmits?
> @@ -332,15 +332,15 @@ class DeviceData:
> rtt = float(read_rpc_stats[6])
> exe = float(read_rpc_stats[7])
>
> - print '\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
> - print '\t\t%.2f' % (ops / sample_time),
> - print '\t\t%.2f' % (kilobytes / sample_time),
> + print('\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
> + print('\t\t%.2f' % (ops / sample_time), end=' ')
> + print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
> if ops != 0:
> - print '\t\t%.2f' % (rtt / ops),
> - print '\t\t%.2f' % (exe / ops)
> + print('\t\t%.2f' % (rtt / ops), end=' ')
> + print('\t\t%.2f' % (exe / ops))
> else:
> - print '\t\t0.00',
> - print '\t\t0.00'
> + print('\t\t0.00', end=' ')
> + print('\t\t0.00')
>
> # writes: ops/s, kB/s, avg rtt, and avg exe
> # XXX: include avg xfer size and retransmits?
> @@ -350,15 +350,15 @@ class DeviceData:
> rtt = float(write_rpc_stats[6])
> exe = float(write_rpc_stats[7])
>
> - print '\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
> - print '\t\t%.2f' % (ops / sample_time),
> - print '\t\t%.2f' % (kilobytes / sample_time),
> + print('\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
> + print('\t\t%.2f' % (ops / sample_time), end=' ')
> + print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
> if ops != 0:
> - print '\t\t%.2f' % (rtt / ops),
> - print '\t\t%.2f' % (exe / ops)
> + print('\t\t%.2f' % (rtt / ops), end=' ')
> + print('\t\t%.2f' % (exe / ops))
> else:
> - print '\t\t0.00',
> - print '\t\t0.00'
> + print('\t\t0.00', end=' ')
> + print('\t\t0.00')
>
> def parse_stats_file(filename):
> """pop the contents of a mountstats file into a dictionary,
> @@ -388,18 +388,18 @@ def parse_stats_file(filename):
> return ms_dict
>
> def print_mountstats_help(name):
> - print 'usage: %s [ options ] <mount point>' % name
> - print
> - print ' Version %s' % Mountstats_version
> - print
> - print ' Display NFS client per-mount statistics.'
> - print
> - print ' --version display the version of this command'
> - print ' --nfs display only the NFS statistics'
> - print ' --rpc display only the RPC statistics'
> - print ' --start sample and save statistics'
> - print ' --end resample statistics and compare them with saved'
> - print
> + print('usage: %s [ options ] <mount point>' % name)
> + print()
> + print(' Version %s' % Mountstats_version)
> + print()
> + print(' Display NFS client per-mount statistics.')
> + print()
> + print(' --version display the version of this command')
> + print(' --nfs display only the NFS statistics')
> + print(' --rpc display only the RPC statistics')
> + print(' --start sample and save statistics')
> + print(' --end resample statistics and compare them with saved')
> + print()
>
> def mountstats_command():
> """Mountstats command
> @@ -414,7 +414,7 @@ def mountstats_command():
> return
>
> if arg in ['-v', '--version', 'version']:
> - print '%s version %s' % (sys.argv[0], Mountstats_version)
> + print('%s version %s' % (sys.argv[0], Mountstats_version))
> sys.exit(0)
>
> if arg in ['-n', '--nfs']:
> @@ -426,10 +426,10 @@ def mountstats_command():
> continue
>
> if arg in ['-s', '--start']:
> - raise Exception, 'Sampling is not yet implemented'
> + raise Exception('Sampling is not yet implemented')
>
> if arg in ['-e', '--end']:
> - raise Exception, 'Sampling is not yet implemented'
> + raise Exception('Sampling is not yet implemented')
>
> if arg == sys.argv[0]:
> continue
> @@ -448,14 +448,14 @@ def mountstats_command():
>
> for mp in mountpoints:
> if mp not in mountstats:
> - print 'Statistics for mount point %s not found' % mp
> + print('Statistics for mount point %s not found' % mp)
> continue
>
> stats = DeviceData()
> stats.parse_stats(mountstats[mp])
>
> if not stats.is_nfs_mountpoint():
> - print 'Mount point %s exists but is not an NFS mount' % mp
> + print('Mount point %s exists but is not an NFS mount' % mp)
> continue
>
> if nfs_only:
> @@ -472,37 +472,37 @@ def mountstats_command():
> stats.display_rpc_op_stats()
>
> def print_nfsstat_help(name):
> - print 'usage: %s [ options ]' % name
> - print
> - print ' Version %s' % Mountstats_version
> - print
> - print ' nfsstat-like program that uses NFS client per-mount statistics.'
> - print
> + print('usage: %s [ options ]' % name)
> + print()
> + print(' Version %s' % Mountstats_version)
> + print()
> + print(' nfsstat-like program that uses NFS client per-mount statistics.')
> + print()
>
> def nfsstat_command():
> print_nfsstat_help(prog)
>
> def print_iostat_help(name):
> - print 'usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' % name
> - print
> - print ' Version %s' % Mountstats_version
> - print
> - print ' 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 ' 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.'
> - print
> + print('usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' % name)
> + print()
> + print(' Version %s' % Mountstats_version)
> + print()
> + print(' 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(' 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.')
> + print()
>
> def print_iostat_summary(old, new, devices, time):
> for device in devices:
> @@ -530,7 +530,7 @@ def iostat_command():
> return
>
> if arg in ['-v', '--version', 'version']:
> - print '%s version %s' % (sys.argv[0], Mountstats_version)
> + print('%s version %s' % (sys.argv[0], Mountstats_version))
> return
>
> if arg == sys.argv[0]:
> @@ -543,14 +543,14 @@ def iostat_command():
> if interval > 0:
> interval_seen = True
> else:
> - print 'Illegal <interval> value'
> + print('Illegal <interval> value')
> return
> elif not count_seen:
> count = int(arg)
> if count > 0:
> count_seen = True
> else:
> - print 'Illegal <count> value'
> + print('Illegal <count> value')
> return
>
> # make certain devices contains only NFS mount points
> @@ -563,13 +563,13 @@ def iostat_command():
> check += [device]
> devices = check
> else:
> - for device, descr in mountstats.iteritems():
> + for device, descr in mountstats.items():
> stats = DeviceData()
> stats.parse_stats(descr)
> if stats.is_nfs_mountpoint():
> devices += [device]
> if len(devices) == 0:
> - print 'No NFS mount points were found'
> + print('No NFS mount points were found')
> return
>
> old_mountstats = None
> @@ -608,7 +608,7 @@ try:
> elif prog == 'ms-iostat':
> iostat_command()
> except KeyboardInterrupt:
> - print 'Caught ^C... exiting'
> + print('Caught ^C... exiting')
> sys.exit(1)
>
> sys.exit(0)
> diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
> index c035537..1c523f9 100644
> --- a/tools/nfs-iostat/nfs-iostat.py
> +++ b/tools/nfs-iostat/nfs-iostat.py
> @@ -95,7 +95,7 @@ class DeviceData:
> if words[6] == 'nfs':
> self.__nfs_data['statvers'] = words[7]
> elif words[0] == 'age:':
> - self.__nfs_data['age'] = long(words[1])
> + self.__nfs_data['age'] = int(words[1])
> elif words[0] == 'opts:':
> self.__nfs_data['mountoptions'] = ''.join(words[1:]).split(',')
> elif words[0] == 'caps:':
> @@ -116,7 +116,7 @@ class DeviceData:
> elif words[0] == 'bytes:':
> i = 1
> for key in NfsByteCounters:
> - self.__nfs_data[key] = long(words[i])
> + self.__nfs_data[key] = int(words[i])
> i += 1
>
> def __parse_rpc_line(self, words):
> @@ -131,8 +131,8 @@ class DeviceData:
> self.__rpc_data['rpcsends'] = int(words[4])
> self.__rpc_data['rpcreceives'] = int(words[5])
> self.__rpc_data['badxids'] = int(words[6])
> - self.__rpc_data['inflightsends'] = long(words[7])
> - self.__rpc_data['backlogutil'] = long(words[8])
> + self.__rpc_data['inflightsends'] = int(words[7])
> + self.__rpc_data['backlogutil'] = int(words[8])
> elif words[1] == 'tcp':
> self.__rpc_data['port'] = words[2]
> self.__rpc_data['bind_count'] = int(words[3])
> @@ -142,8 +142,8 @@ class DeviceData:
> self.__rpc_data['rpcsends'] = int(words[7])
> self.__rpc_data['rpcreceives'] = int(words[8])
> self.__rpc_data['badxids'] = int(words[9])
> - self.__rpc_data['inflightsends'] = long(words[10])
> - self.__rpc_data['backlogutil'] = long(words[11])
> + self.__rpc_data['inflightsends'] = int(words[10])
> + self.__rpc_data['backlogutil'] = int(words[11])
> elif words[1] == 'rdma':
> self.__rpc_data['port'] = words[2]
> self.__rpc_data['bind_count'] = int(words[3])
> @@ -169,7 +169,7 @@ class DeviceData:
> else:
> op = words[0][:-1]
> self.__rpc_data['ops'] += [op]
> - self.__rpc_data[op] = [long(word) for word in words[1:]]
> + self.__rpc_data[op] = [int(word) for word in words[1:]]
>
> def parse_stats(self, lines):
> """Turn a list of lines from a mount stat file into a
> @@ -271,7 +271,7 @@ class DeviceData:
> nfs_stats = self.__nfs_data
> lookup_ops = self.__rpc_data['LOOKUP'][0]
> readdir_ops = self.__rpc_data['READDIR'][0]
> - if self.__rpc_data.has_key('READDIRPLUS'):
> + if 'READDIRPLUS' in self.__rpc_data:
> readdir_ops += self.__rpc_data['READDIRPLUS'][0]
>
> dentry_revals = nfs_stats['dentryrevalidates']
> @@ -330,7 +330,7 @@ class DeviceData:
> def __print_rpc_op_stats(self, op, sample_time):
> """Print generic stats for one RPC op
> """
> - if not self.__rpc_data.has_key(op):
> + if op not in self.__rpc_data:
> return
>
> rpc_stats = self.__rpc_data[op]
> @@ -405,7 +405,7 @@ class DeviceData:
> elif which == 2:
> self.__print_rpc_op_stats('LOOKUP', sample_time)
> self.__print_rpc_op_stats('READDIR', sample_time)
> - if self.__rpc_data.has_key('READDIRPLUS'):
> + if 'READDIRPLUS' in self.__rpc_data:
> self.__print_rpc_op_stats('READDIRPLUS', sample_time)
> self.__print_dir_cache_stats(sample_time)
> elif which == 3:
> @@ -450,7 +450,7 @@ def print_iostat_summary(old, new, devices, time, options):
> 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)
> + devicelist = [x for x in old if x in devices]
> else:
> devicelist = devices
>
>

2013-10-17 14:18:01

by Weston Andros Adamson

[permalink] [raw]
Subject: Re: [PATCH] Make mountstats and nfs-iostat Python 3 compatible

On Oct 17, 2013, at 2:52 AM, Bohuslav Kabrda <[email protected]> wrote:

> ----- Original Message -----
>> This just made it into f19 and it doesn't work for me:
>>
>> $ mountstats /mnt
>> File "/usr/sbin/mountstats", line 272
>> (count, ((count * 100) / sends)), end=' ')
>> ^
>> SyntaxError: invalid syntax
>>
>> $ python
>> Python 2.7.5 (default, Oct 8 2013, 12:19:40)
>> [GCC 4.8.1 20130603 (Red Hat 4.8.1-1)] on linux2
>>
>>
>> I think mountstats needs this line at the top of the file:
>>
>> from __future__ import print_function
>>
>
> True, sorry for the bug.
> Slavek

I just posted this fix to the list as a patch.

-dros

>
>> At least until python3 is the default on fedora.
>>
>> -dros
>>
>> On Sep 18, 2013, at 3:16 PM, Steve Dickson <[email protected]> wrote:
>>
>>>
>>>
>>> On 17/09/13 05:21, Bohuslav Kabrda wrote:
>>>> This will make mountstat and nfs-iostat run on Python 2.6, 2.7
>>>> and >= 3.0
>>>>
>>>> Signed-off-by: Bohuslav Kabrda <[email protected]>
>>> Committed!
>>>
>>> steved.
>>>
>>>> ---
>>>> tools/mountstats/mountstats.py | 310
>>>> ++++++++++++++++++++---------------------
>>>> tools/nfs-iostat/nfs-iostat.py | 22 +--
>>>> 2 files changed, 166 insertions(+), 166 deletions(-)
>>>>
>>>> diff --git a/tools/mountstats/mountstats.py
>>>> b/tools/mountstats/mountstats.py
>>>> index b95b71d..3f5fea5 100644
>>>> --- a/tools/mountstats/mountstats.py
>>>> +++ b/tools/mountstats/mountstats.py
>>>> @@ -53,7 +53,7 @@ class DeviceData:
>>>> if words[6].find('nfs') != -1:
>>>> self.__nfs_data['statvers'] = words[7]
>>>> elif words[0] == 'age:':
>>>> - self.__nfs_data['age'] = long(words[1])
>>>> + self.__nfs_data['age'] = int(words[1])
>>>> elif words[0] == 'opts:':
>>>> self.__nfs_data['mountoptions'] =
>>>> ''.join(words[1:]).split(',')
>>>> elif words[0] == 'caps:':
>>>> @@ -91,12 +91,12 @@ class DeviceData:
>>>> self.__nfs_data['shortwrites'] = int(words[22])
>>>> self.__nfs_data['delay'] = int(words[23])
>>>> elif words[0] == 'bytes:':
>>>> - self.__nfs_data['normalreadbytes'] = long(words[1])
>>>> - self.__nfs_data['normalwritebytes'] = long(words[2])
>>>> - self.__nfs_data['directreadbytes'] = long(words[3])
>>>> - self.__nfs_data['directwritebytes'] = long(words[4])
>>>> - self.__nfs_data['serverreadbytes'] = long(words[5])
>>>> - self.__nfs_data['serverwritebytes'] = long(words[6])
>>>> + self.__nfs_data['normalreadbytes'] = int(words[1])
>>>> + self.__nfs_data['normalwritebytes'] = int(words[2])
>>>> + self.__nfs_data['directreadbytes'] = int(words[3])
>>>> + self.__nfs_data['directwritebytes'] = int(words[4])
>>>> + self.__nfs_data['serverreadbytes'] = int(words[5])
>>>> + self.__nfs_data['serverwritebytes'] = int(words[6])
>>>>
>>>> def __parse_rpc_line(self, words):
>>>> if words[0] == 'RPC':
>>>> @@ -110,8 +110,8 @@ class DeviceData:
>>>> self.__rpc_data['rpcsends'] = int(words[4])
>>>> self.__rpc_data['rpcreceives'] = int(words[5])
>>>> self.__rpc_data['badxids'] = int(words[6])
>>>> - self.__rpc_data['inflightsends'] = long(words[7])
>>>> - self.__rpc_data['backlogutil'] = long(words[8])
>>>> + self.__rpc_data['inflightsends'] = int(words[7])
>>>> + self.__rpc_data['backlogutil'] = int(words[8])
>>>> elif words[1] == 'tcp':
>>>> self.__rpc_data['port'] = words[2]
>>>> self.__rpc_data['bind_count'] = int(words[3])
>>>> @@ -121,7 +121,7 @@ class DeviceData:
>>>> self.__rpc_data['rpcsends'] = int(words[7])
>>>> self.__rpc_data['rpcreceives'] = int(words[8])
>>>> self.__rpc_data['badxids'] = int(words[9])
>>>> - self.__rpc_data['inflightsends'] = long(words[10])
>>>> + self.__rpc_data['inflightsends'] = int(words[10])
>>>> self.__rpc_data['backlogutil'] = int(words[11])
>>>> elif words[1] == 'rdma':
>>>> self.__rpc_data['port'] = words[2]
>>>> @@ -148,7 +148,7 @@ class DeviceData:
>>>> else:
>>>> op = words[0][:-1]
>>>> self.__rpc_data['ops'] += [op]
>>>> - self.__rpc_data[op] = [long(word) for word in words[1:]]
>>>> + self.__rpc_data[op] = [int(word) for word in words[1:]]
>>>>
>>>> def parse_stats(self, lines):
>>>> """Turn a list of lines from a mount stat file into a
>>>> @@ -179,81 +179,81 @@ class DeviceData:
>>>> def display_nfs_options(self):
>>>> """Pretty-print the NFS options
>>>> """
>>>> - print 'Stats for %s mounted on %s:' % \
>>>> - (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
>>>> -
>>>> - print ' NFS mount options: %s' %
>>>> ','.join(self.__nfs_data['mountoptions'])
>>>> - print ' NFS server capabilities: %s' %
>>>> ','.join(self.__nfs_data['servercapabilities'])
>>>> - if self.__nfs_data.has_key('nfsv4flags'):
>>>> - print ' NFSv4 capability flags: %s' %
>>>> ','.join(self.__nfs_data['nfsv4flags'])
>>>> - if self.__nfs_data.has_key('pseudoflavor'):
>>>> - print ' NFS security flavor: %d pseudoflavor: %d' % \
>>>> - (self.__nfs_data['flavor'],
>>>> self.__nfs_data['pseudoflavor'])
>>>> + print('Stats for %s mounted on %s:' % \
>>>> + (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
>>>> +
>>>> + print(' NFS mount options: %s' %
>>>> ','.join(self.__nfs_data['mountoptions']))
>>>> + print(' NFS server capabilities: %s' %
>>>> ','.join(self.__nfs_data['servercapabilities']))
>>>> + if 'nfsv4flags' in self.__nfs_data:
>>>> + print(' NFSv4 capability flags: %s' %
>>>> ','.join(self.__nfs_data['nfsv4flags']))
>>>> + if 'pseudoflavor' in self.__nfs_data:
>>>> + print(' NFS security flavor: %d pseudoflavor: %d' % \
>>>> + (self.__nfs_data['flavor'],
>>>> self.__nfs_data['pseudoflavor']))
>>>> else:
>>>> - print ' NFS security flavor: %d' % self.__nfs_data['flavor']
>>>> + print(' NFS security flavor: %d' %
>>>> self.__nfs_data['flavor'])
>>>>
>>>> def display_nfs_events(self):
>>>> """Pretty-print the NFS event counters
>>>> """
>>>> - print
>>>> - print 'Cache events:'
>>>> - print ' data cache invalidated %d times' %
>>>> self.__nfs_data['datainvalidates']
>>>> - print ' attribute cache invalidated %d times' %
>>>> self.__nfs_data['attrinvalidates']
>>>> - print ' inodes synced %d times' % self.__nfs_data['syncinodes']
>>>> - print
>>>> - print 'VFS calls:'
>>>> - print ' VFS requested %d inode revalidations' %
>>>> self.__nfs_data['inoderevalidates']
>>>> - print ' VFS requested %d dentry revalidations' %
>>>> self.__nfs_data['dentryrevalidates']
>>>> - print
>>>> - print ' VFS called nfs_readdir() %d times' %
>>>> self.__nfs_data['vfsreaddir']
>>>> - print ' VFS called nfs_lookup() %d times' %
>>>> self.__nfs_data['vfslookup']
>>>> - print ' VFS called nfs_permission() %d times' %
>>>> self.__nfs_data['vfspermission']
>>>> - print ' VFS called nfs_file_open() %d times' %
>>>> self.__nfs_data['vfsopen']
>>>> - print ' VFS called nfs_file_flush() %d times' %
>>>> self.__nfs_data['vfsflush']
>>>> - print ' VFS called nfs_lock() %d times' %
>>>> self.__nfs_data['vfslock']
>>>> - print ' VFS called nfs_fsync() %d times' %
>>>> self.__nfs_data['vfsfsync']
>>>> - print ' VFS called nfs_file_release() %d times' %
>>>> self.__nfs_data['vfsrelease']
>>>> - print
>>>> - print 'VM calls:'
>>>> - print ' VFS called nfs_readpage() %d times' %
>>>> self.__nfs_data['vfsreadpage']
>>>> - print ' VFS called nfs_readpages() %d times' %
>>>> self.__nfs_data['vfsreadpages']
>>>> - print ' VFS called nfs_writepage() %d times' %
>>>> self.__nfs_data['vfswritepage']
>>>> - print ' VFS called nfs_writepages() %d times' %
>>>> self.__nfs_data['vfswritepages']
>>>> - print
>>>> - print 'Generic NFS counters:'
>>>> - print ' File size changing operations:'
>>>> - print ' truncating SETATTRs: %d extending WRITEs: %d' % \
>>>> - (self.__nfs_data['setattrtrunc'],
>>>> self.__nfs_data['extendwrite'])
>>>> - print ' %d silly renames' % self.__nfs_data['sillyrenames']
>>>> - print ' short reads: %d short writes: %d' % \
>>>> - (self.__nfs_data['shortreads'],
>>>> self.__nfs_data['shortwrites'])
>>>> - print ' NFSERR_DELAYs from server: %d' %
>>>> self.__nfs_data['delay']
>>>> + print()
>>>> + print('Cache events:')
>>>> + print(' data cache invalidated %d times' %
>>>> self.__nfs_data['datainvalidates'])
>>>> + print(' attribute cache invalidated %d times' %
>>>> self.__nfs_data['attrinvalidates'])
>>>> + print(' inodes synced %d times' % self.__nfs_data['syncinodes'])
>>>> + print()
>>>> + print('VFS calls:')
>>>> + print(' VFS requested %d inode revalidations' %
>>>> self.__nfs_data['inoderevalidates'])
>>>> + print(' VFS requested %d dentry revalidations' %
>>>> self.__nfs_data['dentryrevalidates'])
>>>> + print()
>>>> + print(' VFS called nfs_readdir() %d times' %
>>>> self.__nfs_data['vfsreaddir'])
>>>> + print(' VFS called nfs_lookup() %d times' %
>>>> self.__nfs_data['vfslookup'])
>>>> + print(' VFS called nfs_permission() %d times' %
>>>> self.__nfs_data['vfspermission'])
>>>> + print(' VFS called nfs_file_open() %d times' %
>>>> self.__nfs_data['vfsopen'])
>>>> + print(' VFS called nfs_file_flush() %d times' %
>>>> self.__nfs_data['vfsflush'])
>>>> + print(' VFS called nfs_lock() %d times' %
>>>> self.__nfs_data['vfslock'])
>>>> + print(' VFS called nfs_fsync() %d times' %
>>>> self.__nfs_data['vfsfsync'])
>>>> + print(' VFS called nfs_file_release() %d times' %
>>>> self.__nfs_data['vfsrelease'])
>>>> + print()
>>>> + print('VM calls:')
>>>> + print(' VFS called nfs_readpage() %d times' %
>>>> self.__nfs_data['vfsreadpage'])
>>>> + print(' VFS called nfs_readpages() %d times' %
>>>> self.__nfs_data['vfsreadpages'])
>>>> + print(' VFS called nfs_writepage() %d times' %
>>>> self.__nfs_data['vfswritepage'])
>>>> + print(' VFS called nfs_writepages() %d times' %
>>>> self.__nfs_data['vfswritepages'])
>>>> + print()
>>>> + print('Generic NFS counters:')
>>>> + print(' File size changing operations:')
>>>> + print(' truncating SETATTRs: %d extending WRITEs: %d' % \
>>>> + (self.__nfs_data['setattrtrunc'],
>>>> self.__nfs_data['extendwrite']))
>>>> + print(' %d silly renames' % self.__nfs_data['sillyrenames'])
>>>> + print(' short reads: %d short writes: %d' % \
>>>> + (self.__nfs_data['shortreads'],
>>>> self.__nfs_data['shortwrites']))
>>>> + print(' NFSERR_DELAYs from server: %d' %
>>>> self.__nfs_data['delay'])
>>>>
>>>> def display_nfs_bytes(self):
>>>> """Pretty-print the NFS event counters
>>>> """
>>>> - print
>>>> - print 'NFS byte counts:'
>>>> - print ' applications read %d bytes via read(2)' %
>>>> self.__nfs_data['normalreadbytes']
>>>> - print ' applications wrote %d bytes via write(2)' %
>>>> self.__nfs_data['normalwritebytes']
>>>> - print ' applications read %d bytes via O_DIRECT read(2)' %
>>>> self.__nfs_data['directreadbytes']
>>>> - print ' applications wrote %d bytes via O_DIRECT write(2)' %
>>>> self.__nfs_data['directwritebytes']
>>>> - print ' client read %d bytes via NFS READ' %
>>>> self.__nfs_data['serverreadbytes']
>>>> - print ' client wrote %d bytes via NFS WRITE' %
>>>> self.__nfs_data['serverwritebytes']
>>>> + print()
>>>> + print('NFS byte counts:')
>>>> + print(' applications read %d bytes via read(2)' %
>>>> self.__nfs_data['normalreadbytes'])
>>>> + print(' applications wrote %d bytes via write(2)' %
>>>> self.__nfs_data['normalwritebytes'])
>>>> + print(' applications read %d bytes via O_DIRECT read(2)' %
>>>> self.__nfs_data['directreadbytes'])
>>>> + print(' applications wrote %d bytes via O_DIRECT write(2)' %
>>>> self.__nfs_data['directwritebytes'])
>>>> + print(' client read %d bytes via NFS READ' %
>>>> self.__nfs_data['serverreadbytes'])
>>>> + print(' client wrote %d bytes via NFS WRITE' %
>>>> self.__nfs_data['serverwritebytes'])
>>>>
>>>> def display_rpc_generic_stats(self):
>>>> """Pretty-print the generic RPC stats
>>>> """
>>>> sends = self.__rpc_data['rpcsends']
>>>>
>>>> - print
>>>> - print 'RPC statistics:'
>>>> + print()
>>>> + print('RPC statistics:')
>>>>
>>>> - print ' %d RPC requests sent, %d RPC replies received (%d XIDs
>>>> not found)' % \
>>>> - (sends, self.__rpc_data['rpcreceives'],
>>>> self.__rpc_data['badxids'])
>>>> + print(' %d RPC requests sent, %d RPC replies received (%d XIDs
>>>> not found)' % \
>>>> + (sends, self.__rpc_data['rpcreceives'],
>>>> self.__rpc_data['badxids']))
>>>> if sends != 0:
>>>> - print ' average backlog queue length: %d' % \
>>>> - (float(self.__rpc_data['backlogutil']) / sends)
>>>> + print(' average backlog queue length: %d' % \
>>>> + (float(self.__rpc_data['backlogutil']) / sends))
>>>>
>>>> def display_rpc_op_stats(self):
>>>> """Pretty-print the per-op stats
>>>> @@ -261,23 +261,23 @@ class DeviceData:
>>>> sends = self.__rpc_data['rpcsends']
>>>>
>>>> # XXX: these should be sorted by 'count'
>>>> - print
>>>> + print()
>>>> for op in self.__rpc_data['ops']:
>>>> stats = self.__rpc_data[op]
>>>> count = stats[0]
>>>> retrans = stats[1] - count
>>>> if count != 0:
>>>> - print '%s:' % op
>>>> - print '\t%d ops (%d%%)' % \
>>>> - (count, ((count * 100) / sends)),
>>>> - print '\t%d retrans (%d%%)' % (retrans, ((retrans * 100)
>>>> / count)),
>>>> - print '\t%d major timeouts' % stats[2]
>>>> - print '\tavg bytes sent per op: %d\tavg bytes received
>>>> per op: %d' % \
>>>> - (stats[3] / count, stats[4] / count)
>>>> - print '\tbacklog wait: %f' % (float(stats[5]) / count),
>>>> - print '\tRTT: %f' % (float(stats[6]) / count),
>>>> - print '\ttotal execute time: %f (milliseconds)' % \
>>>> - (float(stats[7]) / count)
>>>> + print('%s:' % op)
>>>> + print('\t%d ops (%d%%)' % \
>>>> + (count, ((count * 100) / sends)), end=' ')
>>>> + print('\t%d retrans (%d%%)' % (retrans, ((retrans * 100)
>>>> / count)), end=' ')
>>>> + print('\t%d major timeouts' % stats[2])
>>>> + print('\tavg bytes sent per op: %d\tavg bytes received
>>>> per op: %d' % \
>>>> + (stats[3] / count, stats[4] / count))
>>>> + print('\tbacklog wait: %f' % (float(stats[5]) / count),
>>>> end=' ')
>>>> + print('\tRTT: %f' % (float(stats[6]) / count), end=' ')
>>>> + print('\ttotal execute time: %f (milliseconds)' % \
>>>> + (float(stats[7]) / count))
>>>>
>>>> def compare_iostats(self, old_stats):
>>>> """Return the difference between two sets of stats
>>>> @@ -285,9 +285,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
>>>> @@ -295,7 +295,7 @@ class DeviceData:
>>>> # the reference to them. so we build new lists here
>>>> # for the result object.
>>>> for op in result.__rpc_data['ops']:
>>>> - result.__rpc_data[op] = map(difference, self.__rpc_data[op],
>>>> old_stats.__rpc_data[op])
>>>> + result.__rpc_data[op] = list(map(difference,
>>>> self.__rpc_data[op], old_stats.__rpc_data[op]))
>>>>
>>>> # update the remaining keys we care about
>>>> result.__rpc_data['rpcsends'] -= old_stats.__rpc_data['rpcsends']
>>>> @@ -312,17 +312,17 @@ class DeviceData:
>>>> if sample_time == 0:
>>>> sample_time = float(self.__nfs_data['age'])
>>>>
>>>> - print
>>>> - print '%s mounted on %s:' % \
>>>> - (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
>>>> + print()
>>>> + print('%s mounted on %s:' % \
>>>> + (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
>>>>
>>>> - print '\top/s\trpc bklog'
>>>> - print '\t%.2f' % (sends / sample_time),
>>>> + print('\top/s\trpc bklog')
>>>> + print('\t%.2f' % (sends / sample_time), end=' ')
>>>> if sends != 0:
>>>> - print '\t%.2f' % \
>>>> - ((float(self.__rpc_data['backlogutil']) / sends) /
>>>> sample_time)
>>>> + print('\t%.2f' % \
>>>> + ((float(self.__rpc_data['backlogutil']) / sends) /
>>>> sample_time))
>>>> else:
>>>> - print '\t0.00'
>>>> + print('\t0.00')
>>>>
>>>> # reads: ops/s, kB/s, avg rtt, and avg exe
>>>> # XXX: include avg xfer size and retransmits?
>>>> @@ -332,15 +332,15 @@ class DeviceData:
>>>> rtt = float(read_rpc_stats[6])
>>>> exe = float(read_rpc_stats[7])
>>>>
>>>> - print '\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
>>>> - print '\t\t%.2f' % (ops / sample_time),
>>>> - print '\t\t%.2f' % (kilobytes / sample_time),
>>>> + print('\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
>>>> + print('\t\t%.2f' % (ops / sample_time), end=' ')
>>>> + print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
>>>> if ops != 0:
>>>> - print '\t\t%.2f' % (rtt / ops),
>>>> - print '\t\t%.2f' % (exe / ops)
>>>> + print('\t\t%.2f' % (rtt / ops), end=' ')
>>>> + print('\t\t%.2f' % (exe / ops))
>>>> else:
>>>> - print '\t\t0.00',
>>>> - print '\t\t0.00'
>>>> + print('\t\t0.00', end=' ')
>>>> + print('\t\t0.00')
>>>>
>>>> # writes: ops/s, kB/s, avg rtt, and avg exe
>>>> # XXX: include avg xfer size and retransmits?
>>>> @@ -350,15 +350,15 @@ class DeviceData:
>>>> rtt = float(write_rpc_stats[6])
>>>> exe = float(write_rpc_stats[7])
>>>>
>>>> - print '\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
>>>> - print '\t\t%.2f' % (ops / sample_time),
>>>> - print '\t\t%.2f' % (kilobytes / sample_time),
>>>> + print('\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
>>>> + print('\t\t%.2f' % (ops / sample_time), end=' ')
>>>> + print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
>>>> if ops != 0:
>>>> - print '\t\t%.2f' % (rtt / ops),
>>>> - print '\t\t%.2f' % (exe / ops)
>>>> + print('\t\t%.2f' % (rtt / ops), end=' ')
>>>> + print('\t\t%.2f' % (exe / ops))
>>>> else:
>>>> - print '\t\t0.00',
>>>> - print '\t\t0.00'
>>>> + print('\t\t0.00', end=' ')
>>>> + print('\t\t0.00')
>>>>
>>>> def parse_stats_file(filename):
>>>> """pop the contents of a mountstats file into a dictionary,
>>>> @@ -388,18 +388,18 @@ def parse_stats_file(filename):
>>>> return ms_dict
>>>>
>>>> def print_mountstats_help(name):
>>>> - print 'usage: %s [ options ] <mount point>' % name
>>>> - print
>>>> - print ' Version %s' % Mountstats_version
>>>> - print
>>>> - print ' Display NFS client per-mount statistics.'
>>>> - print
>>>> - print ' --version display the version of this command'
>>>> - print ' --nfs display only the NFS statistics'
>>>> - print ' --rpc display only the RPC statistics'
>>>> - print ' --start sample and save statistics'
>>>> - print ' --end resample statistics and compare them with
>>>> saved'
>>>> - print
>>>> + print('usage: %s [ options ] <mount point>' % name)
>>>> + print()
>>>> + print(' Version %s' % Mountstats_version)
>>>> + print()
>>>> + print(' Display NFS client per-mount statistics.')
>>>> + print()
>>>> + print(' --version display the version of this command')
>>>> + print(' --nfs display only the NFS statistics')
>>>> + print(' --rpc display only the RPC statistics')
>>>> + print(' --start sample and save statistics')
>>>> + print(' --end resample statistics and compare them with
>>>> saved')
>>>> + print()
>>>>
>>>> def mountstats_command():
>>>> """Mountstats command
>>>> @@ -414,7 +414,7 @@ def mountstats_command():
>>>> return
>>>>
>>>> if arg in ['-v', '--version', 'version']:
>>>> - print '%s version %s' % (sys.argv[0], Mountstats_version)
>>>> + print('%s version %s' % (sys.argv[0], Mountstats_version))
>>>> sys.exit(0)
>>>>
>>>> if arg in ['-n', '--nfs']:
>>>> @@ -426,10 +426,10 @@ def mountstats_command():
>>>> continue
>>>>
>>>> if arg in ['-s', '--start']:
>>>> - raise Exception, 'Sampling is not yet implemented'
>>>> + raise Exception('Sampling is not yet implemented')
>>>>
>>>> if arg in ['-e', '--end']:
>>>> - raise Exception, 'Sampling is not yet implemented'
>>>> + raise Exception('Sampling is not yet implemented')
>>>>
>>>> if arg == sys.argv[0]:
>>>> continue
>>>> @@ -448,14 +448,14 @@ def mountstats_command():
>>>>
>>>> for mp in mountpoints:
>>>> if mp not in mountstats:
>>>> - print 'Statistics for mount point %s not found' % mp
>>>> + print('Statistics for mount point %s not found' % mp)
>>>> continue
>>>>
>>>> stats = DeviceData()
>>>> stats.parse_stats(mountstats[mp])
>>>>
>>>> if not stats.is_nfs_mountpoint():
>>>> - print 'Mount point %s exists but is not an NFS mount' % mp
>>>> + print('Mount point %s exists but is not an NFS mount' % mp)
>>>> continue
>>>>
>>>> if nfs_only:
>>>> @@ -472,37 +472,37 @@ def mountstats_command():
>>>> stats.display_rpc_op_stats()
>>>>
>>>> def print_nfsstat_help(name):
>>>> - print 'usage: %s [ options ]' % name
>>>> - print
>>>> - print ' Version %s' % Mountstats_version
>>>> - print
>>>> - print ' nfsstat-like program that uses NFS client per-mount
>>>> statistics.'
>>>> - print
>>>> + print('usage: %s [ options ]' % name)
>>>> + print()
>>>> + print(' Version %s' % Mountstats_version)
>>>> + print()
>>>> + print(' nfsstat-like program that uses NFS client per-mount
>>>> statistics.')
>>>> + print()
>>>>
>>>> def nfsstat_command():
>>>> print_nfsstat_help(prog)
>>>>
>>>> def print_iostat_help(name):
>>>> - print 'usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' %
>>>> name
>>>> - print
>>>> - print ' Version %s' % Mountstats_version
>>>> - print
>>>> - print ' 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 ' 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.'
>>>> - print
>>>> + print('usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' %
>>>> name)
>>>> + print()
>>>> + print(' Version %s' % Mountstats_version)
>>>> + print()
>>>> + print(' 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(' 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.')
>>>> + print()
>>>>
>>>> def print_iostat_summary(old, new, devices, time):
>>>> for device in devices:
>>>> @@ -530,7 +530,7 @@ def iostat_command():
>>>> return
>>>>
>>>> if arg in ['-v', '--version', 'version']:
>>>> - print '%s version %s' % (sys.argv[0], Mountstats_version)
>>>> + print('%s version %s' % (sys.argv[0], Mountstats_version))
>>>> return
>>>>
>>>> if arg == sys.argv[0]:
>>>> @@ -543,14 +543,14 @@ def iostat_command():
>>>> if interval > 0:
>>>> interval_seen = True
>>>> else:
>>>> - print 'Illegal <interval> value'
>>>> + print('Illegal <interval> value')
>>>> return
>>>> elif not count_seen:
>>>> count = int(arg)
>>>> if count > 0:
>>>> count_seen = True
>>>> else:
>>>> - print 'Illegal <count> value'
>>>> + print('Illegal <count> value')
>>>> return
>>>>
>>>> # make certain devices contains only NFS mount points
>>>> @@ -563,13 +563,13 @@ def iostat_command():
>>>> check += [device]
>>>> devices = check
>>>> else:
>>>> - for device, descr in mountstats.iteritems():
>>>> + for device, descr in mountstats.items():
>>>> stats = DeviceData()
>>>> stats.parse_stats(descr)
>>>> if stats.is_nfs_mountpoint():
>>>> devices += [device]
>>>> if len(devices) == 0:
>>>> - print 'No NFS mount points were found'
>>>> + print('No NFS mount points were found')
>>>> return
>>>>
>>>> old_mountstats = None
>>>> @@ -608,7 +608,7 @@ try:
>>>> elif prog == 'ms-iostat':
>>>> iostat_command()
>>>> except KeyboardInterrupt:
>>>> - print 'Caught ^C... exiting'
>>>> + print('Caught ^C... exiting')
>>>> sys.exit(1)
>>>>
>>>> sys.exit(0)
>>>> diff --git a/tools/nfs-iostat/nfs-iostat.py
>>>> b/tools/nfs-iostat/nfs-iostat.py
>>>> index c035537..1c523f9 100644
>>>> --- a/tools/nfs-iostat/nfs-iostat.py
>>>> +++ b/tools/nfs-iostat/nfs-iostat.py
>>>> @@ -95,7 +95,7 @@ class DeviceData:
>>>> if words[6] == 'nfs':
>>>> self.__nfs_data['statvers'] = words[7]
>>>> elif words[0] == 'age:':
>>>> - self.__nfs_data['age'] = long(words[1])
>>>> + self.__nfs_data['age'] = int(words[1])
>>>> elif words[0] == 'opts:':
>>>> self.__nfs_data['mountoptions'] =
>>>> ''.join(words[1:]).split(',')
>>>> elif words[0] == 'caps:':
>>>> @@ -116,7 +116,7 @@ class DeviceData:
>>>> elif words[0] == 'bytes:':
>>>> i = 1
>>>> for key in NfsByteCounters:
>>>> - self.__nfs_data[key] = long(words[i])
>>>> + self.__nfs_data[key] = int(words[i])
>>>> i += 1
>>>>
>>>> def __parse_rpc_line(self, words):
>>>> @@ -131,8 +131,8 @@ class DeviceData:
>>>> self.__rpc_data['rpcsends'] = int(words[4])
>>>> self.__rpc_data['rpcreceives'] = int(words[5])
>>>> self.__rpc_data['badxids'] = int(words[6])
>>>> - self.__rpc_data['inflightsends'] = long(words[7])
>>>> - self.__rpc_data['backlogutil'] = long(words[8])
>>>> + self.__rpc_data['inflightsends'] = int(words[7])
>>>> + self.__rpc_data['backlogutil'] = int(words[8])
>>>> elif words[1] == 'tcp':
>>>> self.__rpc_data['port'] = words[2]
>>>> self.__rpc_data['bind_count'] = int(words[3])
>>>> @@ -142,8 +142,8 @@ class DeviceData:
>>>> self.__rpc_data['rpcsends'] = int(words[7])
>>>> self.__rpc_data['rpcreceives'] = int(words[8])
>>>> self.__rpc_data['badxids'] = int(words[9])
>>>> - self.__rpc_data['inflightsends'] = long(words[10])
>>>> - self.__rpc_data['backlogutil'] = long(words[11])
>>>> + self.__rpc_data['inflightsends'] = int(words[10])
>>>> + self.__rpc_data['backlogutil'] = int(words[11])
>>>> elif words[1] == 'rdma':
>>>> self.__rpc_data['port'] = words[2]
>>>> self.__rpc_data['bind_count'] = int(words[3])
>>>> @@ -169,7 +169,7 @@ class DeviceData:
>>>> else:
>>>> op = words[0][:-1]
>>>> self.__rpc_data['ops'] += [op]
>>>> - self.__rpc_data[op] = [long(word) for word in words[1:]]
>>>> + self.__rpc_data[op] = [int(word) for word in words[1:]]
>>>>
>>>> def parse_stats(self, lines):
>>>> """Turn a list of lines from a mount stat file into a
>>>> @@ -271,7 +271,7 @@ class DeviceData:
>>>> nfs_stats = self.__nfs_data
>>>> lookup_ops = self.__rpc_data['LOOKUP'][0]
>>>> readdir_ops = self.__rpc_data['READDIR'][0]
>>>> - if self.__rpc_data.has_key('READDIRPLUS'):
>>>> + if 'READDIRPLUS' in self.__rpc_data:
>>>> readdir_ops += self.__rpc_data['READDIRPLUS'][0]
>>>>
>>>> dentry_revals = nfs_stats['dentryrevalidates']
>>>> @@ -330,7 +330,7 @@ class DeviceData:
>>>> def __print_rpc_op_stats(self, op, sample_time):
>>>> """Print generic stats for one RPC op
>>>> """
>>>> - if not self.__rpc_data.has_key(op):
>>>> + if op not in self.__rpc_data:
>>>> return
>>>>
>>>> rpc_stats = self.__rpc_data[op]
>>>> @@ -405,7 +405,7 @@ class DeviceData:
>>>> elif which == 2:
>>>> self.__print_rpc_op_stats('LOOKUP', sample_time)
>>>> self.__print_rpc_op_stats('READDIR', sample_time)
>>>> - if self.__rpc_data.has_key('READDIRPLUS'):
>>>> + if 'READDIRPLUS' in self.__rpc_data:
>>>> self.__print_rpc_op_stats('READDIRPLUS', sample_time)
>>>> self.__print_dir_cache_stats(sample_time)
>>>> elif which == 3:
>>>> @@ -450,7 +450,7 @@ def print_iostat_summary(old, new, devices, time,
>>>> options):
>>>> 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)
>>>> + devicelist = [x for x in old if x in devices]
>>>> else:
>>>> devicelist = devices
>>>>
>>>>
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
>>> the body of a message to [email protected]
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>>
>
> --
> Regards,
> Bohuslav "Slavek" Kabrda.


2013-10-16 22:05:57

by Weston Andros Adamson

[permalink] [raw]
Subject: Re: [PATCH] Make mountstats and nfs-iostat Python 3 compatible

This just made it into f19 and it doesn't work for me:

$ mountstats /mnt
File "/usr/sbin/mountstats", line 272
(count, ((count * 100) / sends)), end=' ')
^
SyntaxError: invalid syntax

$ python
Python 2.7.5 (default, Oct 8 2013, 12:19:40)
[GCC 4.8.1 20130603 (Red Hat 4.8.1-1)] on linux2


I think mountstats needs this line at the top of the file:

from __future__ import print_function

At least until python3 is the default on fedora.

-dros

On Sep 18, 2013, at 3:16 PM, Steve Dickson <[email protected]> wrote:

>
>
> On 17/09/13 05:21, Bohuslav Kabrda wrote:
>> This will make mountstat and nfs-iostat run on Python 2.6, 2.7
>> and >= 3.0
>>
>> Signed-off-by: Bohuslav Kabrda <[email protected]>
> Committed!
>
> steved.
>
>> ---
>> tools/mountstats/mountstats.py | 310 ++++++++++++++++++++---------------------
>> tools/nfs-iostat/nfs-iostat.py | 22 +--
>> 2 files changed, 166 insertions(+), 166 deletions(-)
>>
>> diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
>> index b95b71d..3f5fea5 100644
>> --- a/tools/mountstats/mountstats.py
>> +++ b/tools/mountstats/mountstats.py
>> @@ -53,7 +53,7 @@ class DeviceData:
>> if words[6].find('nfs') != -1:
>> self.__nfs_data['statvers'] = words[7]
>> elif words[0] == 'age:':
>> - self.__nfs_data['age'] = long(words[1])
>> + self.__nfs_data['age'] = int(words[1])
>> elif words[0] == 'opts:':
>> self.__nfs_data['mountoptions'] = ''.join(words[1:]).split(',')
>> elif words[0] == 'caps:':
>> @@ -91,12 +91,12 @@ class DeviceData:
>> self.__nfs_data['shortwrites'] = int(words[22])
>> self.__nfs_data['delay'] = int(words[23])
>> elif words[0] == 'bytes:':
>> - self.__nfs_data['normalreadbytes'] = long(words[1])
>> - self.__nfs_data['normalwritebytes'] = long(words[2])
>> - self.__nfs_data['directreadbytes'] = long(words[3])
>> - self.__nfs_data['directwritebytes'] = long(words[4])
>> - self.__nfs_data['serverreadbytes'] = long(words[5])
>> - self.__nfs_data['serverwritebytes'] = long(words[6])
>> + self.__nfs_data['normalreadbytes'] = int(words[1])
>> + self.__nfs_data['normalwritebytes'] = int(words[2])
>> + self.__nfs_data['directreadbytes'] = int(words[3])
>> + self.__nfs_data['directwritebytes'] = int(words[4])
>> + self.__nfs_data['serverreadbytes'] = int(words[5])
>> + self.__nfs_data['serverwritebytes'] = int(words[6])
>>
>> def __parse_rpc_line(self, words):
>> if words[0] == 'RPC':
>> @@ -110,8 +110,8 @@ class DeviceData:
>> self.__rpc_data['rpcsends'] = int(words[4])
>> self.__rpc_data['rpcreceives'] = int(words[5])
>> self.__rpc_data['badxids'] = int(words[6])
>> - self.__rpc_data['inflightsends'] = long(words[7])
>> - self.__rpc_data['backlogutil'] = long(words[8])
>> + self.__rpc_data['inflightsends'] = int(words[7])
>> + self.__rpc_data['backlogutil'] = int(words[8])
>> elif words[1] == 'tcp':
>> self.__rpc_data['port'] = words[2]
>> self.__rpc_data['bind_count'] = int(words[3])
>> @@ -121,7 +121,7 @@ class DeviceData:
>> self.__rpc_data['rpcsends'] = int(words[7])
>> self.__rpc_data['rpcreceives'] = int(words[8])
>> self.__rpc_data['badxids'] = int(words[9])
>> - self.__rpc_data['inflightsends'] = long(words[10])
>> + self.__rpc_data['inflightsends'] = int(words[10])
>> self.__rpc_data['backlogutil'] = int(words[11])
>> elif words[1] == 'rdma':
>> self.__rpc_data['port'] = words[2]
>> @@ -148,7 +148,7 @@ class DeviceData:
>> else:
>> op = words[0][:-1]
>> self.__rpc_data['ops'] += [op]
>> - self.__rpc_data[op] = [long(word) for word in words[1:]]
>> + self.__rpc_data[op] = [int(word) for word in words[1:]]
>>
>> def parse_stats(self, lines):
>> """Turn a list of lines from a mount stat file into a
>> @@ -179,81 +179,81 @@ class DeviceData:
>> def display_nfs_options(self):
>> """Pretty-print the NFS options
>> """
>> - print 'Stats for %s mounted on %s:' % \
>> - (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
>> -
>> - print ' NFS mount options: %s' % ','.join(self.__nfs_data['mountoptions'])
>> - print ' NFS server capabilities: %s' % ','.join(self.__nfs_data['servercapabilities'])
>> - if self.__nfs_data.has_key('nfsv4flags'):
>> - print ' NFSv4 capability flags: %s' % ','.join(self.__nfs_data['nfsv4flags'])
>> - if self.__nfs_data.has_key('pseudoflavor'):
>> - print ' NFS security flavor: %d pseudoflavor: %d' % \
>> - (self.__nfs_data['flavor'], self.__nfs_data['pseudoflavor'])
>> + print('Stats for %s mounted on %s:' % \
>> + (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
>> +
>> + print(' NFS mount options: %s' % ','.join(self.__nfs_data['mountoptions']))
>> + print(' NFS server capabilities: %s' % ','.join(self.__nfs_data['servercapabilities']))
>> + if 'nfsv4flags' in self.__nfs_data:
>> + print(' NFSv4 capability flags: %s' % ','.join(self.__nfs_data['nfsv4flags']))
>> + if 'pseudoflavor' in self.__nfs_data:
>> + print(' NFS security flavor: %d pseudoflavor: %d' % \
>> + (self.__nfs_data['flavor'], self.__nfs_data['pseudoflavor']))
>> else:
>> - print ' NFS security flavor: %d' % self.__nfs_data['flavor']
>> + print(' NFS security flavor: %d' % self.__nfs_data['flavor'])
>>
>> def display_nfs_events(self):
>> """Pretty-print the NFS event counters
>> """
>> - print
>> - print 'Cache events:'
>> - print ' data cache invalidated %d times' % self.__nfs_data['datainvalidates']
>> - print ' attribute cache invalidated %d times' % self.__nfs_data['attrinvalidates']
>> - print ' inodes synced %d times' % self.__nfs_data['syncinodes']
>> - print
>> - print 'VFS calls:'
>> - print ' VFS requested %d inode revalidations' % self.__nfs_data['inoderevalidates']
>> - print ' VFS requested %d dentry revalidations' % self.__nfs_data['dentryrevalidates']
>> - print
>> - print ' VFS called nfs_readdir() %d times' % self.__nfs_data['vfsreaddir']
>> - print ' VFS called nfs_lookup() %d times' % self.__nfs_data['vfslookup']
>> - print ' VFS called nfs_permission() %d times' % self.__nfs_data['vfspermission']
>> - print ' VFS called nfs_file_open() %d times' % self.__nfs_data['vfsopen']
>> - print ' VFS called nfs_file_flush() %d times' % self.__nfs_data['vfsflush']
>> - print ' VFS called nfs_lock() %d times' % self.__nfs_data['vfslock']
>> - print ' VFS called nfs_fsync() %d times' % self.__nfs_data['vfsfsync']
>> - print ' VFS called nfs_file_release() %d times' % self.__nfs_data['vfsrelease']
>> - print
>> - print 'VM calls:'
>> - print ' VFS called nfs_readpage() %d times' % self.__nfs_data['vfsreadpage']
>> - print ' VFS called nfs_readpages() %d times' % self.__nfs_data['vfsreadpages']
>> - print ' VFS called nfs_writepage() %d times' % self.__nfs_data['vfswritepage']
>> - print ' VFS called nfs_writepages() %d times' % self.__nfs_data['vfswritepages']
>> - print
>> - print 'Generic NFS counters:'
>> - print ' File size changing operations:'
>> - print ' truncating SETATTRs: %d extending WRITEs: %d' % \
>> - (self.__nfs_data['setattrtrunc'], self.__nfs_data['extendwrite'])
>> - print ' %d silly renames' % self.__nfs_data['sillyrenames']
>> - print ' short reads: %d short writes: %d' % \
>> - (self.__nfs_data['shortreads'], self.__nfs_data['shortwrites'])
>> - print ' NFSERR_DELAYs from server: %d' % self.__nfs_data['delay']
>> + print()
>> + print('Cache events:')
>> + print(' data cache invalidated %d times' % self.__nfs_data['datainvalidates'])
>> + print(' attribute cache invalidated %d times' % self.__nfs_data['attrinvalidates'])
>> + print(' inodes synced %d times' % self.__nfs_data['syncinodes'])
>> + print()
>> + print('VFS calls:')
>> + print(' VFS requested %d inode revalidations' % self.__nfs_data['inoderevalidates'])
>> + print(' VFS requested %d dentry revalidations' % self.__nfs_data['dentryrevalidates'])
>> + print()
>> + print(' VFS called nfs_readdir() %d times' % self.__nfs_data['vfsreaddir'])
>> + print(' VFS called nfs_lookup() %d times' % self.__nfs_data['vfslookup'])
>> + print(' VFS called nfs_permission() %d times' % self.__nfs_data['vfspermission'])
>> + print(' VFS called nfs_file_open() %d times' % self.__nfs_data['vfsopen'])
>> + print(' VFS called nfs_file_flush() %d times' % self.__nfs_data['vfsflush'])
>> + print(' VFS called nfs_lock() %d times' % self.__nfs_data['vfslock'])
>> + print(' VFS called nfs_fsync() %d times' % self.__nfs_data['vfsfsync'])
>> + print(' VFS called nfs_file_release() %d times' % self.__nfs_data['vfsrelease'])
>> + print()
>> + print('VM calls:')
>> + print(' VFS called nfs_readpage() %d times' % self.__nfs_data['vfsreadpage'])
>> + print(' VFS called nfs_readpages() %d times' % self.__nfs_data['vfsreadpages'])
>> + print(' VFS called nfs_writepage() %d times' % self.__nfs_data['vfswritepage'])
>> + print(' VFS called nfs_writepages() %d times' % self.__nfs_data['vfswritepages'])
>> + print()
>> + print('Generic NFS counters:')
>> + print(' File size changing operations:')
>> + print(' truncating SETATTRs: %d extending WRITEs: %d' % \
>> + (self.__nfs_data['setattrtrunc'], self.__nfs_data['extendwrite']))
>> + print(' %d silly renames' % self.__nfs_data['sillyrenames'])
>> + print(' short reads: %d short writes: %d' % \
>> + (self.__nfs_data['shortreads'], self.__nfs_data['shortwrites']))
>> + print(' NFSERR_DELAYs from server: %d' % self.__nfs_data['delay'])
>>
>> def display_nfs_bytes(self):
>> """Pretty-print the NFS event counters
>> """
>> - print
>> - print 'NFS byte counts:'
>> - print ' applications read %d bytes via read(2)' % self.__nfs_data['normalreadbytes']
>> - print ' applications wrote %d bytes via write(2)' % self.__nfs_data['normalwritebytes']
>> - print ' applications read %d bytes via O_DIRECT read(2)' % self.__nfs_data['directreadbytes']
>> - print ' applications wrote %d bytes via O_DIRECT write(2)' % self.__nfs_data['directwritebytes']
>> - print ' client read %d bytes via NFS READ' % self.__nfs_data['serverreadbytes']
>> - print ' client wrote %d bytes via NFS WRITE' % self.__nfs_data['serverwritebytes']
>> + print()
>> + print('NFS byte counts:')
>> + print(' applications read %d bytes via read(2)' % self.__nfs_data['normalreadbytes'])
>> + print(' applications wrote %d bytes via write(2)' % self.__nfs_data['normalwritebytes'])
>> + print(' applications read %d bytes via O_DIRECT read(2)' % self.__nfs_data['directreadbytes'])
>> + print(' applications wrote %d bytes via O_DIRECT write(2)' % self.__nfs_data['directwritebytes'])
>> + print(' client read %d bytes via NFS READ' % self.__nfs_data['serverreadbytes'])
>> + print(' client wrote %d bytes via NFS WRITE' % self.__nfs_data['serverwritebytes'])
>>
>> def display_rpc_generic_stats(self):
>> """Pretty-print the generic RPC stats
>> """
>> sends = self.__rpc_data['rpcsends']
>>
>> - print
>> - print 'RPC statistics:'
>> + print()
>> + print('RPC statistics:')
>>
>> - print ' %d RPC requests sent, %d RPC replies received (%d XIDs not found)' % \
>> - (sends, self.__rpc_data['rpcreceives'], self.__rpc_data['badxids'])
>> + print(' %d RPC requests sent, %d RPC replies received (%d XIDs not found)' % \
>> + (sends, self.__rpc_data['rpcreceives'], self.__rpc_data['badxids']))
>> if sends != 0:
>> - print ' average backlog queue length: %d' % \
>> - (float(self.__rpc_data['backlogutil']) / sends)
>> + print(' average backlog queue length: %d' % \
>> + (float(self.__rpc_data['backlogutil']) / sends))
>>
>> def display_rpc_op_stats(self):
>> """Pretty-print the per-op stats
>> @@ -261,23 +261,23 @@ class DeviceData:
>> sends = self.__rpc_data['rpcsends']
>>
>> # XXX: these should be sorted by 'count'
>> - print
>> + print()
>> for op in self.__rpc_data['ops']:
>> stats = self.__rpc_data[op]
>> count = stats[0]
>> retrans = stats[1] - count
>> if count != 0:
>> - print '%s:' % op
>> - print '\t%d ops (%d%%)' % \
>> - (count, ((count * 100) / sends)),
>> - print '\t%d retrans (%d%%)' % (retrans, ((retrans * 100) / count)),
>> - print '\t%d major timeouts' % stats[2]
>> - print '\tavg bytes sent per op: %d\tavg bytes received per op: %d' % \
>> - (stats[3] / count, stats[4] / count)
>> - print '\tbacklog wait: %f' % (float(stats[5]) / count),
>> - print '\tRTT: %f' % (float(stats[6]) / count),
>> - print '\ttotal execute time: %f (milliseconds)' % \
>> - (float(stats[7]) / count)
>> + print('%s:' % op)
>> + print('\t%d ops (%d%%)' % \
>> + (count, ((count * 100) / sends)), end=' ')
>> + print('\t%d retrans (%d%%)' % (retrans, ((retrans * 100) / count)), end=' ')
>> + print('\t%d major timeouts' % stats[2])
>> + print('\tavg bytes sent per op: %d\tavg bytes received per op: %d' % \
>> + (stats[3] / count, stats[4] / count))
>> + print('\tbacklog wait: %f' % (float(stats[5]) / count), end=' ')
>> + print('\tRTT: %f' % (float(stats[6]) / count), end=' ')
>> + print('\ttotal execute time: %f (milliseconds)' % \
>> + (float(stats[7]) / count))
>>
>> def compare_iostats(self, old_stats):
>> """Return the difference between two sets of stats
>> @@ -285,9 +285,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
>> @@ -295,7 +295,7 @@ class DeviceData:
>> # the reference to them. so we build new lists here
>> # for the result object.
>> for op in result.__rpc_data['ops']:
>> - result.__rpc_data[op] = map(difference, self.__rpc_data[op], old_stats.__rpc_data[op])
>> + result.__rpc_data[op] = list(map(difference, self.__rpc_data[op], old_stats.__rpc_data[op]))
>>
>> # update the remaining keys we care about
>> result.__rpc_data['rpcsends'] -= old_stats.__rpc_data['rpcsends']
>> @@ -312,17 +312,17 @@ class DeviceData:
>> if sample_time == 0:
>> sample_time = float(self.__nfs_data['age'])
>>
>> - print
>> - print '%s mounted on %s:' % \
>> - (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
>> + print()
>> + print('%s mounted on %s:' % \
>> + (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
>>
>> - print '\top/s\trpc bklog'
>> - print '\t%.2f' % (sends / sample_time),
>> + print('\top/s\trpc bklog')
>> + print('\t%.2f' % (sends / sample_time), end=' ')
>> if sends != 0:
>> - print '\t%.2f' % \
>> - ((float(self.__rpc_data['backlogutil']) / sends) / sample_time)
>> + print('\t%.2f' % \
>> + ((float(self.__rpc_data['backlogutil']) / sends) / sample_time))
>> else:
>> - print '\t0.00'
>> + print('\t0.00')
>>
>> # reads: ops/s, kB/s, avg rtt, and avg exe
>> # XXX: include avg xfer size and retransmits?
>> @@ -332,15 +332,15 @@ class DeviceData:
>> rtt = float(read_rpc_stats[6])
>> exe = float(read_rpc_stats[7])
>>
>> - print '\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
>> - print '\t\t%.2f' % (ops / sample_time),
>> - print '\t\t%.2f' % (kilobytes / sample_time),
>> + print('\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
>> + print('\t\t%.2f' % (ops / sample_time), end=' ')
>> + print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
>> if ops != 0:
>> - print '\t\t%.2f' % (rtt / ops),
>> - print '\t\t%.2f' % (exe / ops)
>> + print('\t\t%.2f' % (rtt / ops), end=' ')
>> + print('\t\t%.2f' % (exe / ops))
>> else:
>> - print '\t\t0.00',
>> - print '\t\t0.00'
>> + print('\t\t0.00', end=' ')
>> + print('\t\t0.00')
>>
>> # writes: ops/s, kB/s, avg rtt, and avg exe
>> # XXX: include avg xfer size and retransmits?
>> @@ -350,15 +350,15 @@ class DeviceData:
>> rtt = float(write_rpc_stats[6])
>> exe = float(write_rpc_stats[7])
>>
>> - print '\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
>> - print '\t\t%.2f' % (ops / sample_time),
>> - print '\t\t%.2f' % (kilobytes / sample_time),
>> + print('\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
>> + print('\t\t%.2f' % (ops / sample_time), end=' ')
>> + print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
>> if ops != 0:
>> - print '\t\t%.2f' % (rtt / ops),
>> - print '\t\t%.2f' % (exe / ops)
>> + print('\t\t%.2f' % (rtt / ops), end=' ')
>> + print('\t\t%.2f' % (exe / ops))
>> else:
>> - print '\t\t0.00',
>> - print '\t\t0.00'
>> + print('\t\t0.00', end=' ')
>> + print('\t\t0.00')
>>
>> def parse_stats_file(filename):
>> """pop the contents of a mountstats file into a dictionary,
>> @@ -388,18 +388,18 @@ def parse_stats_file(filename):
>> return ms_dict
>>
>> def print_mountstats_help(name):
>> - print 'usage: %s [ options ] <mount point>' % name
>> - print
>> - print ' Version %s' % Mountstats_version
>> - print
>> - print ' Display NFS client per-mount statistics.'
>> - print
>> - print ' --version display the version of this command'
>> - print ' --nfs display only the NFS statistics'
>> - print ' --rpc display only the RPC statistics'
>> - print ' --start sample and save statistics'
>> - print ' --end resample statistics and compare them with saved'
>> - print
>> + print('usage: %s [ options ] <mount point>' % name)
>> + print()
>> + print(' Version %s' % Mountstats_version)
>> + print()
>> + print(' Display NFS client per-mount statistics.')
>> + print()
>> + print(' --version display the version of this command')
>> + print(' --nfs display only the NFS statistics')
>> + print(' --rpc display only the RPC statistics')
>> + print(' --start sample and save statistics')
>> + print(' --end resample statistics and compare them with saved')
>> + print()
>>
>> def mountstats_command():
>> """Mountstats command
>> @@ -414,7 +414,7 @@ def mountstats_command():
>> return
>>
>> if arg in ['-v', '--version', 'version']:
>> - print '%s version %s' % (sys.argv[0], Mountstats_version)
>> + print('%s version %s' % (sys.argv[0], Mountstats_version))
>> sys.exit(0)
>>
>> if arg in ['-n', '--nfs']:
>> @@ -426,10 +426,10 @@ def mountstats_command():
>> continue
>>
>> if arg in ['-s', '--start']:
>> - raise Exception, 'Sampling is not yet implemented'
>> + raise Exception('Sampling is not yet implemented')
>>
>> if arg in ['-e', '--end']:
>> - raise Exception, 'Sampling is not yet implemented'
>> + raise Exception('Sampling is not yet implemented')
>>
>> if arg == sys.argv[0]:
>> continue
>> @@ -448,14 +448,14 @@ def mountstats_command():
>>
>> for mp in mountpoints:
>> if mp not in mountstats:
>> - print 'Statistics for mount point %s not found' % mp
>> + print('Statistics for mount point %s not found' % mp)
>> continue
>>
>> stats = DeviceData()
>> stats.parse_stats(mountstats[mp])
>>
>> if not stats.is_nfs_mountpoint():
>> - print 'Mount point %s exists but is not an NFS mount' % mp
>> + print('Mount point %s exists but is not an NFS mount' % mp)
>> continue
>>
>> if nfs_only:
>> @@ -472,37 +472,37 @@ def mountstats_command():
>> stats.display_rpc_op_stats()
>>
>> def print_nfsstat_help(name):
>> - print 'usage: %s [ options ]' % name
>> - print
>> - print ' Version %s' % Mountstats_version
>> - print
>> - print ' nfsstat-like program that uses NFS client per-mount statistics.'
>> - print
>> + print('usage: %s [ options ]' % name)
>> + print()
>> + print(' Version %s' % Mountstats_version)
>> + print()
>> + print(' nfsstat-like program that uses NFS client per-mount statistics.')
>> + print()
>>
>> def nfsstat_command():
>> print_nfsstat_help(prog)
>>
>> def print_iostat_help(name):
>> - print 'usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' % name
>> - print
>> - print ' Version %s' % Mountstats_version
>> - print
>> - print ' 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 ' 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.'
>> - print
>> + print('usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' % name)
>> + print()
>> + print(' Version %s' % Mountstats_version)
>> + print()
>> + print(' 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(' 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.')
>> + print()
>>
>> def print_iostat_summary(old, new, devices, time):
>> for device in devices:
>> @@ -530,7 +530,7 @@ def iostat_command():
>> return
>>
>> if arg in ['-v', '--version', 'version']:
>> - print '%s version %s' % (sys.argv[0], Mountstats_version)
>> + print('%s version %s' % (sys.argv[0], Mountstats_version))
>> return
>>
>> if arg == sys.argv[0]:
>> @@ -543,14 +543,14 @@ def iostat_command():
>> if interval > 0:
>> interval_seen = True
>> else:
>> - print 'Illegal <interval> value'
>> + print('Illegal <interval> value')
>> return
>> elif not count_seen:
>> count = int(arg)
>> if count > 0:
>> count_seen = True
>> else:
>> - print 'Illegal <count> value'
>> + print('Illegal <count> value')
>> return
>>
>> # make certain devices contains only NFS mount points
>> @@ -563,13 +563,13 @@ def iostat_command():
>> check += [device]
>> devices = check
>> else:
>> - for device, descr in mountstats.iteritems():
>> + for device, descr in mountstats.items():
>> stats = DeviceData()
>> stats.parse_stats(descr)
>> if stats.is_nfs_mountpoint():
>> devices += [device]
>> if len(devices) == 0:
>> - print 'No NFS mount points were found'
>> + print('No NFS mount points were found')
>> return
>>
>> old_mountstats = None
>> @@ -608,7 +608,7 @@ try:
>> elif prog == 'ms-iostat':
>> iostat_command()
>> except KeyboardInterrupt:
>> - print 'Caught ^C... exiting'
>> + print('Caught ^C... exiting')
>> sys.exit(1)
>>
>> sys.exit(0)
>> diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
>> index c035537..1c523f9 100644
>> --- a/tools/nfs-iostat/nfs-iostat.py
>> +++ b/tools/nfs-iostat/nfs-iostat.py
>> @@ -95,7 +95,7 @@ class DeviceData:
>> if words[6] == 'nfs':
>> self.__nfs_data['statvers'] = words[7]
>> elif words[0] == 'age:':
>> - self.__nfs_data['age'] = long(words[1])
>> + self.__nfs_data['age'] = int(words[1])
>> elif words[0] == 'opts:':
>> self.__nfs_data['mountoptions'] = ''.join(words[1:]).split(',')
>> elif words[0] == 'caps:':
>> @@ -116,7 +116,7 @@ class DeviceData:
>> elif words[0] == 'bytes:':
>> i = 1
>> for key in NfsByteCounters:
>> - self.__nfs_data[key] = long(words[i])
>> + self.__nfs_data[key] = int(words[i])
>> i += 1
>>
>> def __parse_rpc_line(self, words):
>> @@ -131,8 +131,8 @@ class DeviceData:
>> self.__rpc_data['rpcsends'] = int(words[4])
>> self.__rpc_data['rpcreceives'] = int(words[5])
>> self.__rpc_data['badxids'] = int(words[6])
>> - self.__rpc_data['inflightsends'] = long(words[7])
>> - self.__rpc_data['backlogutil'] = long(words[8])
>> + self.__rpc_data['inflightsends'] = int(words[7])
>> + self.__rpc_data['backlogutil'] = int(words[8])
>> elif words[1] == 'tcp':
>> self.__rpc_data['port'] = words[2]
>> self.__rpc_data['bind_count'] = int(words[3])
>> @@ -142,8 +142,8 @@ class DeviceData:
>> self.__rpc_data['rpcsends'] = int(words[7])
>> self.__rpc_data['rpcreceives'] = int(words[8])
>> self.__rpc_data['badxids'] = int(words[9])
>> - self.__rpc_data['inflightsends'] = long(words[10])
>> - self.__rpc_data['backlogutil'] = long(words[11])
>> + self.__rpc_data['inflightsends'] = int(words[10])
>> + self.__rpc_data['backlogutil'] = int(words[11])
>> elif words[1] == 'rdma':
>> self.__rpc_data['port'] = words[2]
>> self.__rpc_data['bind_count'] = int(words[3])
>> @@ -169,7 +169,7 @@ class DeviceData:
>> else:
>> op = words[0][:-1]
>> self.__rpc_data['ops'] += [op]
>> - self.__rpc_data[op] = [long(word) for word in words[1:]]
>> + self.__rpc_data[op] = [int(word) for word in words[1:]]
>>
>> def parse_stats(self, lines):
>> """Turn a list of lines from a mount stat file into a
>> @@ -271,7 +271,7 @@ class DeviceData:
>> nfs_stats = self.__nfs_data
>> lookup_ops = self.__rpc_data['LOOKUP'][0]
>> readdir_ops = self.__rpc_data['READDIR'][0]
>> - if self.__rpc_data.has_key('READDIRPLUS'):
>> + if 'READDIRPLUS' in self.__rpc_data:
>> readdir_ops += self.__rpc_data['READDIRPLUS'][0]
>>
>> dentry_revals = nfs_stats['dentryrevalidates']
>> @@ -330,7 +330,7 @@ class DeviceData:
>> def __print_rpc_op_stats(self, op, sample_time):
>> """Print generic stats for one RPC op
>> """
>> - if not self.__rpc_data.has_key(op):
>> + if op not in self.__rpc_data:
>> return
>>
>> rpc_stats = self.__rpc_data[op]
>> @@ -405,7 +405,7 @@ class DeviceData:
>> elif which == 2:
>> self.__print_rpc_op_stats('LOOKUP', sample_time)
>> self.__print_rpc_op_stats('READDIR', sample_time)
>> - if self.__rpc_data.has_key('READDIRPLUS'):
>> + if 'READDIRPLUS' in self.__rpc_data:
>> self.__print_rpc_op_stats('READDIRPLUS', sample_time)
>> self.__print_dir_cache_stats(sample_time)
>> elif which == 3:
>> @@ -450,7 +450,7 @@ def print_iostat_summary(old, new, devices, time, options):
>> 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)
>> + devicelist = [x for x in old if x in devices]
>> else:
>> devicelist = devices
>>
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html


2013-10-17 06:52:53

by Slavek Kabrda

[permalink] [raw]
Subject: Re: [PATCH] Make mountstats and nfs-iostat Python 3 compatible

----- Original Message -----
> This just made it into f19 and it doesn't work for me:
>
> $ mountstats /mnt
> File "/usr/sbin/mountstats", line 272
> (count, ((count * 100) / sends)), end=' ')
> ^
> SyntaxError: invalid syntax
>
> $ python
> Python 2.7.5 (default, Oct 8 2013, 12:19:40)
> [GCC 4.8.1 20130603 (Red Hat 4.8.1-1)] on linux2
>
>
> I think mountstats needs this line at the top of the file:
>
> from __future__ import print_function
>

True, sorry for the bug.
Slavek

> At least until python3 is the default on fedora.
>
> -dros
>
> On Sep 18, 2013, at 3:16 PM, Steve Dickson <[email protected]> wrote:
>
> >
> >
> > On 17/09/13 05:21, Bohuslav Kabrda wrote:
> >> This will make mountstat and nfs-iostat run on Python 2.6, 2.7
> >> and >= 3.0
> >>
> >> Signed-off-by: Bohuslav Kabrda <[email protected]>
> > Committed!
> >
> > steved.
> >
> >> ---
> >> tools/mountstats/mountstats.py | 310
> >> ++++++++++++++++++++---------------------
> >> tools/nfs-iostat/nfs-iostat.py | 22 +--
> >> 2 files changed, 166 insertions(+), 166 deletions(-)
> >>
> >> diff --git a/tools/mountstats/mountstats.py
> >> b/tools/mountstats/mountstats.py
> >> index b95b71d..3f5fea5 100644
> >> --- a/tools/mountstats/mountstats.py
> >> +++ b/tools/mountstats/mountstats.py
> >> @@ -53,7 +53,7 @@ class DeviceData:
> >> if words[6].find('nfs') != -1:
> >> self.__nfs_data['statvers'] = words[7]
> >> elif words[0] == 'age:':
> >> - self.__nfs_data['age'] = long(words[1])
> >> + self.__nfs_data['age'] = int(words[1])
> >> elif words[0] == 'opts:':
> >> self.__nfs_data['mountoptions'] =
> >> ''.join(words[1:]).split(',')
> >> elif words[0] == 'caps:':
> >> @@ -91,12 +91,12 @@ class DeviceData:
> >> self.__nfs_data['shortwrites'] = int(words[22])
> >> self.__nfs_data['delay'] = int(words[23])
> >> elif words[0] == 'bytes:':
> >> - self.__nfs_data['normalreadbytes'] = long(words[1])
> >> - self.__nfs_data['normalwritebytes'] = long(words[2])
> >> - self.__nfs_data['directreadbytes'] = long(words[3])
> >> - self.__nfs_data['directwritebytes'] = long(words[4])
> >> - self.__nfs_data['serverreadbytes'] = long(words[5])
> >> - self.__nfs_data['serverwritebytes'] = long(words[6])
> >> + self.__nfs_data['normalreadbytes'] = int(words[1])
> >> + self.__nfs_data['normalwritebytes'] = int(words[2])
> >> + self.__nfs_data['directreadbytes'] = int(words[3])
> >> + self.__nfs_data['directwritebytes'] = int(words[4])
> >> + self.__nfs_data['serverreadbytes'] = int(words[5])
> >> + self.__nfs_data['serverwritebytes'] = int(words[6])
> >>
> >> def __parse_rpc_line(self, words):
> >> if words[0] == 'RPC':
> >> @@ -110,8 +110,8 @@ class DeviceData:
> >> self.__rpc_data['rpcsends'] = int(words[4])
> >> self.__rpc_data['rpcreceives'] = int(words[5])
> >> self.__rpc_data['badxids'] = int(words[6])
> >> - self.__rpc_data['inflightsends'] = long(words[7])
> >> - self.__rpc_data['backlogutil'] = long(words[8])
> >> + self.__rpc_data['inflightsends'] = int(words[7])
> >> + self.__rpc_data['backlogutil'] = int(words[8])
> >> elif words[1] == 'tcp':
> >> self.__rpc_data['port'] = words[2]
> >> self.__rpc_data['bind_count'] = int(words[3])
> >> @@ -121,7 +121,7 @@ class DeviceData:
> >> self.__rpc_data['rpcsends'] = int(words[7])
> >> self.__rpc_data['rpcreceives'] = int(words[8])
> >> self.__rpc_data['badxids'] = int(words[9])
> >> - self.__rpc_data['inflightsends'] = long(words[10])
> >> + self.__rpc_data['inflightsends'] = int(words[10])
> >> self.__rpc_data['backlogutil'] = int(words[11])
> >> elif words[1] == 'rdma':
> >> self.__rpc_data['port'] = words[2]
> >> @@ -148,7 +148,7 @@ class DeviceData:
> >> else:
> >> op = words[0][:-1]
> >> self.__rpc_data['ops'] += [op]
> >> - self.__rpc_data[op] = [long(word) for word in words[1:]]
> >> + self.__rpc_data[op] = [int(word) for word in words[1:]]
> >>
> >> def parse_stats(self, lines):
> >> """Turn a list of lines from a mount stat file into a
> >> @@ -179,81 +179,81 @@ class DeviceData:
> >> def display_nfs_options(self):
> >> """Pretty-print the NFS options
> >> """
> >> - print 'Stats for %s mounted on %s:' % \
> >> - (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
> >> -
> >> - print ' NFS mount options: %s' %
> >> ','.join(self.__nfs_data['mountoptions'])
> >> - print ' NFS server capabilities: %s' %
> >> ','.join(self.__nfs_data['servercapabilities'])
> >> - if self.__nfs_data.has_key('nfsv4flags'):
> >> - print ' NFSv4 capability flags: %s' %
> >> ','.join(self.__nfs_data['nfsv4flags'])
> >> - if self.__nfs_data.has_key('pseudoflavor'):
> >> - print ' NFS security flavor: %d pseudoflavor: %d' % \
> >> - (self.__nfs_data['flavor'],
> >> self.__nfs_data['pseudoflavor'])
> >> + print('Stats for %s mounted on %s:' % \
> >> + (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
> >> +
> >> + print(' NFS mount options: %s' %
> >> ','.join(self.__nfs_data['mountoptions']))
> >> + print(' NFS server capabilities: %s' %
> >> ','.join(self.__nfs_data['servercapabilities']))
> >> + if 'nfsv4flags' in self.__nfs_data:
> >> + print(' NFSv4 capability flags: %s' %
> >> ','.join(self.__nfs_data['nfsv4flags']))
> >> + if 'pseudoflavor' in self.__nfs_data:
> >> + print(' NFS security flavor: %d pseudoflavor: %d' % \
> >> + (self.__nfs_data['flavor'],
> >> self.__nfs_data['pseudoflavor']))
> >> else:
> >> - print ' NFS security flavor: %d' % self.__nfs_data['flavor']
> >> + print(' NFS security flavor: %d' %
> >> self.__nfs_data['flavor'])
> >>
> >> def display_nfs_events(self):
> >> """Pretty-print the NFS event counters
> >> """
> >> - print
> >> - print 'Cache events:'
> >> - print ' data cache invalidated %d times' %
> >> self.__nfs_data['datainvalidates']
> >> - print ' attribute cache invalidated %d times' %
> >> self.__nfs_data['attrinvalidates']
> >> - print ' inodes synced %d times' % self.__nfs_data['syncinodes']
> >> - print
> >> - print 'VFS calls:'
> >> - print ' VFS requested %d inode revalidations' %
> >> self.__nfs_data['inoderevalidates']
> >> - print ' VFS requested %d dentry revalidations' %
> >> self.__nfs_data['dentryrevalidates']
> >> - print
> >> - print ' VFS called nfs_readdir() %d times' %
> >> self.__nfs_data['vfsreaddir']
> >> - print ' VFS called nfs_lookup() %d times' %
> >> self.__nfs_data['vfslookup']
> >> - print ' VFS called nfs_permission() %d times' %
> >> self.__nfs_data['vfspermission']
> >> - print ' VFS called nfs_file_open() %d times' %
> >> self.__nfs_data['vfsopen']
> >> - print ' VFS called nfs_file_flush() %d times' %
> >> self.__nfs_data['vfsflush']
> >> - print ' VFS called nfs_lock() %d times' %
> >> self.__nfs_data['vfslock']
> >> - print ' VFS called nfs_fsync() %d times' %
> >> self.__nfs_data['vfsfsync']
> >> - print ' VFS called nfs_file_release() %d times' %
> >> self.__nfs_data['vfsrelease']
> >> - print
> >> - print 'VM calls:'
> >> - print ' VFS called nfs_readpage() %d times' %
> >> self.__nfs_data['vfsreadpage']
> >> - print ' VFS called nfs_readpages() %d times' %
> >> self.__nfs_data['vfsreadpages']
> >> - print ' VFS called nfs_writepage() %d times' %
> >> self.__nfs_data['vfswritepage']
> >> - print ' VFS called nfs_writepages() %d times' %
> >> self.__nfs_data['vfswritepages']
> >> - print
> >> - print 'Generic NFS counters:'
> >> - print ' File size changing operations:'
> >> - print ' truncating SETATTRs: %d extending WRITEs: %d' % \
> >> - (self.__nfs_data['setattrtrunc'],
> >> self.__nfs_data['extendwrite'])
> >> - print ' %d silly renames' % self.__nfs_data['sillyrenames']
> >> - print ' short reads: %d short writes: %d' % \
> >> - (self.__nfs_data['shortreads'],
> >> self.__nfs_data['shortwrites'])
> >> - print ' NFSERR_DELAYs from server: %d' %
> >> self.__nfs_data['delay']
> >> + print()
> >> + print('Cache events:')
> >> + print(' data cache invalidated %d times' %
> >> self.__nfs_data['datainvalidates'])
> >> + print(' attribute cache invalidated %d times' %
> >> self.__nfs_data['attrinvalidates'])
> >> + print(' inodes synced %d times' % self.__nfs_data['syncinodes'])
> >> + print()
> >> + print('VFS calls:')
> >> + print(' VFS requested %d inode revalidations' %
> >> self.__nfs_data['inoderevalidates'])
> >> + print(' VFS requested %d dentry revalidations' %
> >> self.__nfs_data['dentryrevalidates'])
> >> + print()
> >> + print(' VFS called nfs_readdir() %d times' %
> >> self.__nfs_data['vfsreaddir'])
> >> + print(' VFS called nfs_lookup() %d times' %
> >> self.__nfs_data['vfslookup'])
> >> + print(' VFS called nfs_permission() %d times' %
> >> self.__nfs_data['vfspermission'])
> >> + print(' VFS called nfs_file_open() %d times' %
> >> self.__nfs_data['vfsopen'])
> >> + print(' VFS called nfs_file_flush() %d times' %
> >> self.__nfs_data['vfsflush'])
> >> + print(' VFS called nfs_lock() %d times' %
> >> self.__nfs_data['vfslock'])
> >> + print(' VFS called nfs_fsync() %d times' %
> >> self.__nfs_data['vfsfsync'])
> >> + print(' VFS called nfs_file_release() %d times' %
> >> self.__nfs_data['vfsrelease'])
> >> + print()
> >> + print('VM calls:')
> >> + print(' VFS called nfs_readpage() %d times' %
> >> self.__nfs_data['vfsreadpage'])
> >> + print(' VFS called nfs_readpages() %d times' %
> >> self.__nfs_data['vfsreadpages'])
> >> + print(' VFS called nfs_writepage() %d times' %
> >> self.__nfs_data['vfswritepage'])
> >> + print(' VFS called nfs_writepages() %d times' %
> >> self.__nfs_data['vfswritepages'])
> >> + print()
> >> + print('Generic NFS counters:')
> >> + print(' File size changing operations:')
> >> + print(' truncating SETATTRs: %d extending WRITEs: %d' % \
> >> + (self.__nfs_data['setattrtrunc'],
> >> self.__nfs_data['extendwrite']))
> >> + print(' %d silly renames' % self.__nfs_data['sillyrenames'])
> >> + print(' short reads: %d short writes: %d' % \
> >> + (self.__nfs_data['shortreads'],
> >> self.__nfs_data['shortwrites']))
> >> + print(' NFSERR_DELAYs from server: %d' %
> >> self.__nfs_data['delay'])
> >>
> >> def display_nfs_bytes(self):
> >> """Pretty-print the NFS event counters
> >> """
> >> - print
> >> - print 'NFS byte counts:'
> >> - print ' applications read %d bytes via read(2)' %
> >> self.__nfs_data['normalreadbytes']
> >> - print ' applications wrote %d bytes via write(2)' %
> >> self.__nfs_data['normalwritebytes']
> >> - print ' applications read %d bytes via O_DIRECT read(2)' %
> >> self.__nfs_data['directreadbytes']
> >> - print ' applications wrote %d bytes via O_DIRECT write(2)' %
> >> self.__nfs_data['directwritebytes']
> >> - print ' client read %d bytes via NFS READ' %
> >> self.__nfs_data['serverreadbytes']
> >> - print ' client wrote %d bytes via NFS WRITE' %
> >> self.__nfs_data['serverwritebytes']
> >> + print()
> >> + print('NFS byte counts:')
> >> + print(' applications read %d bytes via read(2)' %
> >> self.__nfs_data['normalreadbytes'])
> >> + print(' applications wrote %d bytes via write(2)' %
> >> self.__nfs_data['normalwritebytes'])
> >> + print(' applications read %d bytes via O_DIRECT read(2)' %
> >> self.__nfs_data['directreadbytes'])
> >> + print(' applications wrote %d bytes via O_DIRECT write(2)' %
> >> self.__nfs_data['directwritebytes'])
> >> + print(' client read %d bytes via NFS READ' %
> >> self.__nfs_data['serverreadbytes'])
> >> + print(' client wrote %d bytes via NFS WRITE' %
> >> self.__nfs_data['serverwritebytes'])
> >>
> >> def display_rpc_generic_stats(self):
> >> """Pretty-print the generic RPC stats
> >> """
> >> sends = self.__rpc_data['rpcsends']
> >>
> >> - print
> >> - print 'RPC statistics:'
> >> + print()
> >> + print('RPC statistics:')
> >>
> >> - print ' %d RPC requests sent, %d RPC replies received (%d XIDs
> >> not found)' % \
> >> - (sends, self.__rpc_data['rpcreceives'],
> >> self.__rpc_data['badxids'])
> >> + print(' %d RPC requests sent, %d RPC replies received (%d XIDs
> >> not found)' % \
> >> + (sends, self.__rpc_data['rpcreceives'],
> >> self.__rpc_data['badxids']))
> >> if sends != 0:
> >> - print ' average backlog queue length: %d' % \
> >> - (float(self.__rpc_data['backlogutil']) / sends)
> >> + print(' average backlog queue length: %d' % \
> >> + (float(self.__rpc_data['backlogutil']) / sends))
> >>
> >> def display_rpc_op_stats(self):
> >> """Pretty-print the per-op stats
> >> @@ -261,23 +261,23 @@ class DeviceData:
> >> sends = self.__rpc_data['rpcsends']
> >>
> >> # XXX: these should be sorted by 'count'
> >> - print
> >> + print()
> >> for op in self.__rpc_data['ops']:
> >> stats = self.__rpc_data[op]
> >> count = stats[0]
> >> retrans = stats[1] - count
> >> if count != 0:
> >> - print '%s:' % op
> >> - print '\t%d ops (%d%%)' % \
> >> - (count, ((count * 100) / sends)),
> >> - print '\t%d retrans (%d%%)' % (retrans, ((retrans * 100)
> >> / count)),
> >> - print '\t%d major timeouts' % stats[2]
> >> - print '\tavg bytes sent per op: %d\tavg bytes received
> >> per op: %d' % \
> >> - (stats[3] / count, stats[4] / count)
> >> - print '\tbacklog wait: %f' % (float(stats[5]) / count),
> >> - print '\tRTT: %f' % (float(stats[6]) / count),
> >> - print '\ttotal execute time: %f (milliseconds)' % \
> >> - (float(stats[7]) / count)
> >> + print('%s:' % op)
> >> + print('\t%d ops (%d%%)' % \
> >> + (count, ((count * 100) / sends)), end=' ')
> >> + print('\t%d retrans (%d%%)' % (retrans, ((retrans * 100)
> >> / count)), end=' ')
> >> + print('\t%d major timeouts' % stats[2])
> >> + print('\tavg bytes sent per op: %d\tavg bytes received
> >> per op: %d' % \
> >> + (stats[3] / count, stats[4] / count))
> >> + print('\tbacklog wait: %f' % (float(stats[5]) / count),
> >> end=' ')
> >> + print('\tRTT: %f' % (float(stats[6]) / count), end=' ')
> >> + print('\ttotal execute time: %f (milliseconds)' % \
> >> + (float(stats[7]) / count))
> >>
> >> def compare_iostats(self, old_stats):
> >> """Return the difference between two sets of stats
> >> @@ -285,9 +285,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
> >> @@ -295,7 +295,7 @@ class DeviceData:
> >> # the reference to them. so we build new lists here
> >> # for the result object.
> >> for op in result.__rpc_data['ops']:
> >> - result.__rpc_data[op] = map(difference, self.__rpc_data[op],
> >> old_stats.__rpc_data[op])
> >> + result.__rpc_data[op] = list(map(difference,
> >> self.__rpc_data[op], old_stats.__rpc_data[op]))
> >>
> >> # update the remaining keys we care about
> >> result.__rpc_data['rpcsends'] -= old_stats.__rpc_data['rpcsends']
> >> @@ -312,17 +312,17 @@ class DeviceData:
> >> if sample_time == 0:
> >> sample_time = float(self.__nfs_data['age'])
> >>
> >> - print
> >> - print '%s mounted on %s:' % \
> >> - (self.__nfs_data['export'], self.__nfs_data['mountpoint'])
> >> + print()
> >> + print('%s mounted on %s:' % \
> >> + (self.__nfs_data['export'], self.__nfs_data['mountpoint']))
> >>
> >> - print '\top/s\trpc bklog'
> >> - print '\t%.2f' % (sends / sample_time),
> >> + print('\top/s\trpc bklog')
> >> + print('\t%.2f' % (sends / sample_time), end=' ')
> >> if sends != 0:
> >> - print '\t%.2f' % \
> >> - ((float(self.__rpc_data['backlogutil']) / sends) /
> >> sample_time)
> >> + print('\t%.2f' % \
> >> + ((float(self.__rpc_data['backlogutil']) / sends) /
> >> sample_time))
> >> else:
> >> - print '\t0.00'
> >> + print('\t0.00')
> >>
> >> # reads: ops/s, kB/s, avg rtt, and avg exe
> >> # XXX: include avg xfer size and retransmits?
> >> @@ -332,15 +332,15 @@ class DeviceData:
> >> rtt = float(read_rpc_stats[6])
> >> exe = float(read_rpc_stats[7])
> >>
> >> - print '\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
> >> - print '\t\t%.2f' % (ops / sample_time),
> >> - print '\t\t%.2f' % (kilobytes / sample_time),
> >> + print('\treads:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
> >> + print('\t\t%.2f' % (ops / sample_time), end=' ')
> >> + print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
> >> if ops != 0:
> >> - print '\t\t%.2f' % (rtt / ops),
> >> - print '\t\t%.2f' % (exe / ops)
> >> + print('\t\t%.2f' % (rtt / ops), end=' ')
> >> + print('\t\t%.2f' % (exe / ops))
> >> else:
> >> - print '\t\t0.00',
> >> - print '\t\t0.00'
> >> + print('\t\t0.00', end=' ')
> >> + print('\t\t0.00')
> >>
> >> # writes: ops/s, kB/s, avg rtt, and avg exe
> >> # XXX: include avg xfer size and retransmits?
> >> @@ -350,15 +350,15 @@ class DeviceData:
> >> rtt = float(write_rpc_stats[6])
> >> exe = float(write_rpc_stats[7])
> >>
> >> - print '\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)'
> >> - print '\t\t%.2f' % (ops / sample_time),
> >> - print '\t\t%.2f' % (kilobytes / sample_time),
> >> + print('\twrites:\tops/s\t\tkB/s\t\tavg RTT (ms)\tavg exe (ms)')
> >> + print('\t\t%.2f' % (ops / sample_time), end=' ')
> >> + print('\t\t%.2f' % (kilobytes / sample_time), end=' ')
> >> if ops != 0:
> >> - print '\t\t%.2f' % (rtt / ops),
> >> - print '\t\t%.2f' % (exe / ops)
> >> + print('\t\t%.2f' % (rtt / ops), end=' ')
> >> + print('\t\t%.2f' % (exe / ops))
> >> else:
> >> - print '\t\t0.00',
> >> - print '\t\t0.00'
> >> + print('\t\t0.00', end=' ')
> >> + print('\t\t0.00')
> >>
> >> def parse_stats_file(filename):
> >> """pop the contents of a mountstats file into a dictionary,
> >> @@ -388,18 +388,18 @@ def parse_stats_file(filename):
> >> return ms_dict
> >>
> >> def print_mountstats_help(name):
> >> - print 'usage: %s [ options ] <mount point>' % name
> >> - print
> >> - print ' Version %s' % Mountstats_version
> >> - print
> >> - print ' Display NFS client per-mount statistics.'
> >> - print
> >> - print ' --version display the version of this command'
> >> - print ' --nfs display only the NFS statistics'
> >> - print ' --rpc display only the RPC statistics'
> >> - print ' --start sample and save statistics'
> >> - print ' --end resample statistics and compare them with
> >> saved'
> >> - print
> >> + print('usage: %s [ options ] <mount point>' % name)
> >> + print()
> >> + print(' Version %s' % Mountstats_version)
> >> + print()
> >> + print(' Display NFS client per-mount statistics.')
> >> + print()
> >> + print(' --version display the version of this command')
> >> + print(' --nfs display only the NFS statistics')
> >> + print(' --rpc display only the RPC statistics')
> >> + print(' --start sample and save statistics')
> >> + print(' --end resample statistics and compare them with
> >> saved')
> >> + print()
> >>
> >> def mountstats_command():
> >> """Mountstats command
> >> @@ -414,7 +414,7 @@ def mountstats_command():
> >> return
> >>
> >> if arg in ['-v', '--version', 'version']:
> >> - print '%s version %s' % (sys.argv[0], Mountstats_version)
> >> + print('%s version %s' % (sys.argv[0], Mountstats_version))
> >> sys.exit(0)
> >>
> >> if arg in ['-n', '--nfs']:
> >> @@ -426,10 +426,10 @@ def mountstats_command():
> >> continue
> >>
> >> if arg in ['-s', '--start']:
> >> - raise Exception, 'Sampling is not yet implemented'
> >> + raise Exception('Sampling is not yet implemented')
> >>
> >> if arg in ['-e', '--end']:
> >> - raise Exception, 'Sampling is not yet implemented'
> >> + raise Exception('Sampling is not yet implemented')
> >>
> >> if arg == sys.argv[0]:
> >> continue
> >> @@ -448,14 +448,14 @@ def mountstats_command():
> >>
> >> for mp in mountpoints:
> >> if mp not in mountstats:
> >> - print 'Statistics for mount point %s not found' % mp
> >> + print('Statistics for mount point %s not found' % mp)
> >> continue
> >>
> >> stats = DeviceData()
> >> stats.parse_stats(mountstats[mp])
> >>
> >> if not stats.is_nfs_mountpoint():
> >> - print 'Mount point %s exists but is not an NFS mount' % mp
> >> + print('Mount point %s exists but is not an NFS mount' % mp)
> >> continue
> >>
> >> if nfs_only:
> >> @@ -472,37 +472,37 @@ def mountstats_command():
> >> stats.display_rpc_op_stats()
> >>
> >> def print_nfsstat_help(name):
> >> - print 'usage: %s [ options ]' % name
> >> - print
> >> - print ' Version %s' % Mountstats_version
> >> - print
> >> - print ' nfsstat-like program that uses NFS client per-mount
> >> statistics.'
> >> - print
> >> + print('usage: %s [ options ]' % name)
> >> + print()
> >> + print(' Version %s' % Mountstats_version)
> >> + print()
> >> + print(' nfsstat-like program that uses NFS client per-mount
> >> statistics.')
> >> + print()
> >>
> >> def nfsstat_command():
> >> print_nfsstat_help(prog)
> >>
> >> def print_iostat_help(name):
> >> - print 'usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' %
> >> name
> >> - print
> >> - print ' Version %s' % Mountstats_version
> >> - print
> >> - print ' 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 ' 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.'
> >> - print
> >> + print('usage: %s [ <interval> [ <count> ] ] [ <mount point> ] ' %
> >> name)
> >> + print()
> >> + print(' Version %s' % Mountstats_version)
> >> + print()
> >> + print(' 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(' 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.')
> >> + print()
> >>
> >> def print_iostat_summary(old, new, devices, time):
> >> for device in devices:
> >> @@ -530,7 +530,7 @@ def iostat_command():
> >> return
> >>
> >> if arg in ['-v', '--version', 'version']:
> >> - print '%s version %s' % (sys.argv[0], Mountstats_version)
> >> + print('%s version %s' % (sys.argv[0], Mountstats_version))
> >> return
> >>
> >> if arg == sys.argv[0]:
> >> @@ -543,14 +543,14 @@ def iostat_command():
> >> if interval > 0:
> >> interval_seen = True
> >> else:
> >> - print 'Illegal <interval> value'
> >> + print('Illegal <interval> value')
> >> return
> >> elif not count_seen:
> >> count = int(arg)
> >> if count > 0:
> >> count_seen = True
> >> else:
> >> - print 'Illegal <count> value'
> >> + print('Illegal <count> value')
> >> return
> >>
> >> # make certain devices contains only NFS mount points
> >> @@ -563,13 +563,13 @@ def iostat_command():
> >> check += [device]
> >> devices = check
> >> else:
> >> - for device, descr in mountstats.iteritems():
> >> + for device, descr in mountstats.items():
> >> stats = DeviceData()
> >> stats.parse_stats(descr)
> >> if stats.is_nfs_mountpoint():
> >> devices += [device]
> >> if len(devices) == 0:
> >> - print 'No NFS mount points were found'
> >> + print('No NFS mount points were found')
> >> return
> >>
> >> old_mountstats = None
> >> @@ -608,7 +608,7 @@ try:
> >> elif prog == 'ms-iostat':
> >> iostat_command()
> >> except KeyboardInterrupt:
> >> - print 'Caught ^C... exiting'
> >> + print('Caught ^C... exiting')
> >> sys.exit(1)
> >>
> >> sys.exit(0)
> >> diff --git a/tools/nfs-iostat/nfs-iostat.py
> >> b/tools/nfs-iostat/nfs-iostat.py
> >> index c035537..1c523f9 100644
> >> --- a/tools/nfs-iostat/nfs-iostat.py
> >> +++ b/tools/nfs-iostat/nfs-iostat.py
> >> @@ -95,7 +95,7 @@ class DeviceData:
> >> if words[6] == 'nfs':
> >> self.__nfs_data['statvers'] = words[7]
> >> elif words[0] == 'age:':
> >> - self.__nfs_data['age'] = long(words[1])
> >> + self.__nfs_data['age'] = int(words[1])
> >> elif words[0] == 'opts:':
> >> self.__nfs_data['mountoptions'] =
> >> ''.join(words[1:]).split(',')
> >> elif words[0] == 'caps:':
> >> @@ -116,7 +116,7 @@ class DeviceData:
> >> elif words[0] == 'bytes:':
> >> i = 1
> >> for key in NfsByteCounters:
> >> - self.__nfs_data[key] = long(words[i])
> >> + self.__nfs_data[key] = int(words[i])
> >> i += 1
> >>
> >> def __parse_rpc_line(self, words):
> >> @@ -131,8 +131,8 @@ class DeviceData:
> >> self.__rpc_data['rpcsends'] = int(words[4])
> >> self.__rpc_data['rpcreceives'] = int(words[5])
> >> self.__rpc_data['badxids'] = int(words[6])
> >> - self.__rpc_data['inflightsends'] = long(words[7])
> >> - self.__rpc_data['backlogutil'] = long(words[8])
> >> + self.__rpc_data['inflightsends'] = int(words[7])
> >> + self.__rpc_data['backlogutil'] = int(words[8])
> >> elif words[1] == 'tcp':
> >> self.__rpc_data['port'] = words[2]
> >> self.__rpc_data['bind_count'] = int(words[3])
> >> @@ -142,8 +142,8 @@ class DeviceData:
> >> self.__rpc_data['rpcsends'] = int(words[7])
> >> self.__rpc_data['rpcreceives'] = int(words[8])
> >> self.__rpc_data['badxids'] = int(words[9])
> >> - self.__rpc_data['inflightsends'] = long(words[10])
> >> - self.__rpc_data['backlogutil'] = long(words[11])
> >> + self.__rpc_data['inflightsends'] = int(words[10])
> >> + self.__rpc_data['backlogutil'] = int(words[11])
> >> elif words[1] == 'rdma':
> >> self.__rpc_data['port'] = words[2]
> >> self.__rpc_data['bind_count'] = int(words[3])
> >> @@ -169,7 +169,7 @@ class DeviceData:
> >> else:
> >> op = words[0][:-1]
> >> self.__rpc_data['ops'] += [op]
> >> - self.__rpc_data[op] = [long(word) for word in words[1:]]
> >> + self.__rpc_data[op] = [int(word) for word in words[1:]]
> >>
> >> def parse_stats(self, lines):
> >> """Turn a list of lines from a mount stat file into a
> >> @@ -271,7 +271,7 @@ class DeviceData:
> >> nfs_stats = self.__nfs_data
> >> lookup_ops = self.__rpc_data['LOOKUP'][0]
> >> readdir_ops = self.__rpc_data['READDIR'][0]
> >> - if self.__rpc_data.has_key('READDIRPLUS'):
> >> + if 'READDIRPLUS' in self.__rpc_data:
> >> readdir_ops += self.__rpc_data['READDIRPLUS'][0]
> >>
> >> dentry_revals = nfs_stats['dentryrevalidates']
> >> @@ -330,7 +330,7 @@ class DeviceData:
> >> def __print_rpc_op_stats(self, op, sample_time):
> >> """Print generic stats for one RPC op
> >> """
> >> - if not self.__rpc_data.has_key(op):
> >> + if op not in self.__rpc_data:
> >> return
> >>
> >> rpc_stats = self.__rpc_data[op]
> >> @@ -405,7 +405,7 @@ class DeviceData:
> >> elif which == 2:
> >> self.__print_rpc_op_stats('LOOKUP', sample_time)
> >> self.__print_rpc_op_stats('READDIR', sample_time)
> >> - if self.__rpc_data.has_key('READDIRPLUS'):
> >> + if 'READDIRPLUS' in self.__rpc_data:
> >> self.__print_rpc_op_stats('READDIRPLUS', sample_time)
> >> self.__print_dir_cache_stats(sample_time)
> >> elif which == 3:
> >> @@ -450,7 +450,7 @@ def print_iostat_summary(old, new, devices, time,
> >> options):
> >> 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)
> >> + devicelist = [x for x in old if x in devices]
> >> else:
> >> devicelist = devices
> >>
> >>
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> > the body of a message to [email protected]
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>

--
Regards,
Bohuslav "Slavek" Kabrda.