]> granicus.if.org Git - zfs/commitdiff
Fix arc_summary.py -d crash with Python3
authorScot W. Stevenson <scot.stevenson@gmail.com>
Sun, 12 Nov 2017 04:27:43 +0000 (05:27 +0100)
committerTony Hutter <hutter2@llnl.gov>
Tue, 30 Jan 2018 16:27:31 +0000 (10:27 -0600)
Prevents arc_summary.py crashing when called with parameter -d or
long form --description with Python3.

Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Signed-off-by: Scot W. Stevenson <scot.stevenson@gmail.com>
Closes #6849
Closes #6850

cmd/arc_summary/arc_summary.py

index 4c513d63d84cdfba2acdc5dc61781d15b3f8591c..ec0468eccef29b11cd9bfda7b37a5185abf7a354 100755 (executable)
@@ -39,12 +39,12 @@ in-source documentation and code at
 https://github.com/zfsonlinux/zfs/blob/master/module/zfs/arc.c for details.
 """
 
-import sys
-import time
 import getopt
+import os
 import re
+import sys
+import time
 
-from os import listdir
 from subprocess import Popen, PIPE
 from decimal import Decimal as D
 
@@ -858,12 +858,12 @@ def _vdev_summary(Kstat):
 
 
 def _tunable_summary(Kstat):
-    """Print information on tunables"""
+    """Print information on tunables, including descriptions if requested"""
 
     global show_tunable_descriptions
     global alternate_tunable_layout
 
-    names = listdir("/sys/module/zfs/parameters/")
+    names = os.listdir("/sys/module/zfs/parameters/")
 
     values = {}
     for name in names:
@@ -874,13 +874,21 @@ def _tunable_summary(Kstat):
     descriptions = {}
 
     if show_tunable_descriptions:
+
+        command = ["/sbin/modinfo", "zfs", "-0"]
+
         try:
-            command = ["/sbin/modinfo", "zfs", "-0"]
             p = Popen(command, stdin=PIPE, stdout=PIPE,
                       stderr=PIPE, shell=False, close_fds=True)
             p.wait()
 
-            description_list = p.communicate()[0].strip().split('\0')
+            # By default, Python 2 returns a string as the first element of the
+            # tuple from p.communicate(), while Python 3 returns bytes which
+            # must be decoded first. The better way to do this would be with
+            # subprocess.run() or at least .check_output(), but this fails on
+            # CentOS 6 because of its old version of Python 2
+            desc = bytes.decode(p.communicate()[0])
+            description_list = desc.strip().split('\0')
 
             if p.returncode == 0:
                 for tunable in description_list:
@@ -899,7 +907,7 @@ def _tunable_summary(Kstat):
                              (sys.argv[0], command[0], e.strerror))
             sys.stderr.write("Tunable descriptions will be disabled.\n")
 
-    sys.stdout.write("ZFS Tunable:\n")
+    sys.stdout.write("ZFS Tunables:\n")
     names.sort()
 
     if alternate_tunable_layout: