Return-Path: linux-nfs-owner@vger.kernel.org Received: from mx4-phx2.redhat.com ([209.132.183.25]:35331 "EHLO mx4-phx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750892Ab3JQGwx (ORCPT ); Thu, 17 Oct 2013 02:52:53 -0400 Date: Thu, 17 Oct 2013 02:52:52 -0400 (EDT) From: Bohuslav Kabrda To: Weston Andros Adamson Cc: Steve Dickson , linux-nfs list Message-ID: <397459728.7504449.1381992772429.JavaMail.root@redhat.com> In-Reply-To: <863050D3-36C8-460D-9BF5-31237C51D4F4@netapp.com> References: <1379409678-15730-1-git-send-email-bkabrda@redhat.com> <5239FBFB.8010300@RedHat.com> <863050D3-36C8-460D-9BF5-31237C51D4F4@netapp.com> Subject: Re: [PATCH] Make mountstats and nfs-iostat Python 3 compatible MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Sender: linux-nfs-owner@vger.kernel.org List-ID: ----- 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 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 > > 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 ] ' % 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 ] ' % 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 [ [ ] ] [ ] ' % > >> name > >> - print > >> - print ' Version %s' % Mountstats_version > >> - print > >> - print ' iostat-like program to display NFS client per-mount > >> statistics.' > >> - print > >> - print ' The 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 parameter is specified, the value of > >> determines the' > >> - print ' number of reports generated at seconds apart. If > >> the interval' > >> - print ' parameter is specified without the parameter, the > >> command generates' > >> - print ' reports continuously.' > >> - print > >> - print ' If one or more 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 [ [ ] ] [ ] ' % > >> name) > >> + print() > >> + print(' Version %s' % Mountstats_version) > >> + print() > >> + print(' iostat-like program to display NFS client per-mount > >> statistics.') > >> + print() > >> + print(' The 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 parameter is specified, the value of > >> determines the') > >> + print(' number of reports generated at seconds apart. If > >> the interval') > >> + print(' parameter is specified without the parameter, the > >> command generates') > >> + print(' reports continuously.') > >> + print() > >> + print(' If one or more 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 value' > >> + print('Illegal value') > >> return > >> elif not count_seen: > >> count = int(arg) > >> if count > 0: > >> count_seen = True > >> else: > >> - print 'Illegal value' > >> + print('Illegal 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 majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- Regards, Bohuslav "Slavek" Kabrda.