Skip to content

Commit

Permalink
Fix arc_summary.py -d crash with Python3
Browse files Browse the repository at this point in the history
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 openzfs#6849 
Closes openzfs#6850
  • Loading branch information
scotws authored and tonyhutter committed Jan 13, 2018
1 parent 2182163 commit 28a02cf
Showing 1 changed file with 16 additions and 8 deletions.
24 changes: 16 additions & 8 deletions cmd/arc_summary/arc_summary.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@
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

Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand Down

0 comments on commit 28a02cf

Please sign in to comment.