2015-12-10 17:07:04

by Scott Mayhew

[permalink] [raw]
Subject: [nfs-utils PATCH v2 1/2] mountstats: handle KeyError in accumulate_iostats()

This will prevent a backtrace like this from occurring in 'mountstats
nfsstat' if a new NFSv4 operation is added to the kernel but not to the
Nfsv4ops list in mountstats.py:

Traceback (most recent call last):
File "/sbin/mountstats", line 988, in <module>
res = main()
File "/sbin/mountstats", line 977, in main
return args.func(args)
File "/sbin/mountstats", line 792, in nfsstat_command
v4stats.accumulate_iostats(acc_stats)
File "/sbin/mountstats", line 566, in accumulate_iostats
self.__rpc_data[op] = list(map(add, self.__rpc_data[op],
new_stats.__rpc_data[op]))
KeyError: 'SEEK'

Signed-off-by: Scott Mayhew <[email protected]>
---
tools/mountstats/mountstats.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
index 011bb42..1e2811f 100644
--- a/tools/mountstats/mountstats.py
+++ b/tools/mountstats/mountstats.py
@@ -563,7 +563,10 @@ class DeviceData:
for the nfsstat command.
"""
for op in new_stats.__rpc_data['ops']:
- self.__rpc_data[op] = list(map(add, self.__rpc_data[op], new_stats.__rpc_data[op]))
+ try:
+ self.__rpc_data[op] = list(map(add, self.__rpc_data[op], new_stats.__rpc_data[op]))
+ except KeyError:
+ continue

def __print_rpc_op_stats(self, op, sample_time):
"""Print generic stats for one RPC op
--
2.4.3



2015-12-10 17:07:04

by Scott Mayhew

[permalink] [raw]
Subject: [nfs-utils PATCH v2 2/2] mountstats: add missing v4.2 operations

Signed-off-by: Scott Mayhew <[email protected]>
---
tools/mountstats/mountstats.py | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
index 1e2811f..4ca4bc4 100644
--- a/tools/mountstats/mountstats.py
+++ b/tools/mountstats/mountstats.py
@@ -150,6 +150,8 @@ Nfsv3ops = [
'COMMIT'
]

+# This list should be kept in-sync with the NFSPROC4_CLNT_* enum in
+# include/linux/nfs4.h in the kernel.
Nfsv4ops = [
'NULL',
'READ',
@@ -204,7 +206,12 @@ Nfsv4ops = [
'FREE_STATEID',
'GETDEVICELIST',
'BIND_CONN_TO_SESSION',
- 'DESTROY_CLIENTID'
+ 'DESTROY_CLIENTID',
+ 'SEEK',
+ 'ALLOCATE',
+ 'DEALLOCATE',
+ 'LAYOUTSTATS',
+ 'CLONE'
]

class DeviceData:
--
2.4.3


2015-12-12 12:15:57

by Steve Dickson

[permalink] [raw]
Subject: Re: [nfs-utils PATCH v2 2/2] mountstats: add missing v4.2 operations



On 12/10/2015 12:07 PM, Scott Mayhew wrote:
> Signed-off-by: Scott Mayhew <[email protected]>
Committed...

steved.
> ---
> tools/mountstats/mountstats.py | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
> index 1e2811f..4ca4bc4 100644
> --- a/tools/mountstats/mountstats.py
> +++ b/tools/mountstats/mountstats.py
> @@ -150,6 +150,8 @@ Nfsv3ops = [
> 'COMMIT'
> ]
>
> +# This list should be kept in-sync with the NFSPROC4_CLNT_* enum in
> +# include/linux/nfs4.h in the kernel.
> Nfsv4ops = [
> 'NULL',
> 'READ',
> @@ -204,7 +206,12 @@ Nfsv4ops = [
> 'FREE_STATEID',
> 'GETDEVICELIST',
> 'BIND_CONN_TO_SESSION',
> - 'DESTROY_CLIENTID'
> + 'DESTROY_CLIENTID',
> + 'SEEK',
> + 'ALLOCATE',
> + 'DEALLOCATE',
> + 'LAYOUTSTATS',
> + 'CLONE'
> ]
>
> class DeviceData:
>

2015-12-12 12:16:17

by Steve Dickson

[permalink] [raw]
Subject: Re: [nfs-utils PATCH v2 1/2] mountstats: handle KeyError in accumulate_iostats()



On 12/10/2015 12:07 PM, Scott Mayhew wrote:
> This will prevent a backtrace like this from occurring in 'mountstats
> nfsstat' if a new NFSv4 operation is added to the kernel but not to the
> Nfsv4ops list in mountstats.py:
>
> Traceback (most recent call last):
> File "/sbin/mountstats", line 988, in <module>
> res = main()
> File "/sbin/mountstats", line 977, in main
> return args.func(args)
> File "/sbin/mountstats", line 792, in nfsstat_command
> v4stats.accumulate_iostats(acc_stats)
> File "/sbin/mountstats", line 566, in accumulate_iostats
> self.__rpc_data[op] = list(map(add, self.__rpc_data[op],
> new_stats.__rpc_data[op]))
> KeyError: 'SEEK'
>
> Signed-off-by: Scott Mayhew <[email protected]>
Committed...

steved.

> ---
> tools/mountstats/mountstats.py | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
> index 011bb42..1e2811f 100644
> --- a/tools/mountstats/mountstats.py
> +++ b/tools/mountstats/mountstats.py
> @@ -563,7 +563,10 @@ class DeviceData:
> for the nfsstat command.
> """
> for op in new_stats.__rpc_data['ops']:
> - self.__rpc_data[op] = list(map(add, self.__rpc_data[op], new_stats.__rpc_data[op]))
> + try:
> + self.__rpc_data[op] = list(map(add, self.__rpc_data[op], new_stats.__rpc_data[op]))
> + except KeyError:
> + continue
>
> def __print_rpc_op_stats(self, op, sample_time):
> """Print generic stats for one RPC op
>