2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

Add binary option for command outputs collected by ovs-bugtool

Current ovs-bugtool collects command outputs as text strings.
Thus it reads the output by lines. For commands that generate
huge binary data, it becomes very inefficient to read the output.

The change here is to use a 1MB buffer to read binary data
instead of reading them by lines.

Signed-off-by: Shih-Hao Li <shihli@vmware.com>
Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
This commit is contained in:
Shih-Hao Li
2013-02-22 08:54:04 -08:00
committed by Gurucharan Shetty
parent 59b0682a25
commit 4a39a40aba

View File

@@ -267,7 +267,7 @@ def output(x):
def output_ts(x):
output("[%s] %s" % (time.strftime("%x %X %Z"), x))
def cmd_output(cap, args, label=None, filter=None):
def cmd_output(cap, args, label=None, filter=None, binary=False):
if cap in entries:
if not label:
if isinstance(args, list):
@@ -276,7 +276,8 @@ def cmd_output(cap, args, label=None, filter=None):
label = ' '.join(a)
else:
label = args
data[label] = {'cap': cap, 'cmd_args': args, 'filter': filter}
data[label] = {'cap': cap, 'cmd_args': args, 'filter': filter,
'binary': binary}
def file_output(cap, path_list, newest_first=False):
"""
@@ -329,7 +330,9 @@ def collect_data():
v['output'] = StringIOmtime()
if not process_lists.has_key(cap):
process_lists[cap] = []
process_lists[cap].append(ProcOutput(v['cmd_args'], caps[cap][MAX_TIME], v['output'], v['filter']))
process_lists[cap].append(
ProcOutput(v['cmd_args'], caps[cap][MAX_TIME], v['output'],
v['filter'], v['binary']))
elif v.has_key('filename') and v['filename'].startswith('/proc/'):
# proc files must be read into memory
try:
@@ -861,7 +864,8 @@ def load_plugins(just_capabilities=False, filter=None):
elif el.tagName == "command":
label = el.getAttribute("label")
if label == '': label = None
cmd_output(dir, getText(el.childNodes), label)
binary = getBoolAttr(el, 'binary')
cmd_output(dir, getText(el.childNodes), label, binary=binary)
def make_tar(subdir, suffix, output_fd, output_file):
global SILENT_MODE, data
@@ -1099,7 +1103,7 @@ def disk_list():
class ProcOutput:
debug = False
def __init__(self, command, max_time, inst=None, filter=None):
def __init__(self, command, max_time, inst=None, filter=None, binary=False):
self.command = command
self.max_time = max_time
self.inst = inst
@@ -1110,6 +1114,10 @@ class ProcOutput:
self.timeout = int(time.time()) + self.max_time
self.filter = filter
self.filter_state = {}
if binary:
self.bufsize = 1048576 # 1MB buffer
else:
self.bufsize = 1 # line buffered
def __del__(self):
self.terminate()
@@ -1122,7 +1130,9 @@ class ProcOutput:
try:
if ProcOutput.debug:
output_ts("Starting '%s'" % self.cmdAsStr())
self.proc = Popen(self.command, bufsize=1, stdin=dev_null, stdout=PIPE, stderr=dev_null, shell=isinstance(self.command, str))
self.proc = Popen(self.command, bufsize=self.bufsize,
stdin=dev_null, stdout=PIPE, stderr=dev_null,
shell=isinstance(self.command, str))
old = fcntl.fcntl(self.proc.stdout.fileno(), fcntl.F_GETFD)
fcntl.fcntl(self.proc.stdout.fileno(), fcntl.F_SETFD, old | fcntl.FD_CLOEXEC)
self.running = True
@@ -1145,7 +1155,10 @@ class ProcOutput:
def read_line(self):
assert self.running
line = self.proc.stdout.readline()
if self.bufsize == 1:
line = self.proc.stdout.readline()
else:
line = self.proc.stdout.read(self.bufsize)
if line == '':
# process exited
self.proc.stdout.close()