From 5f6c52dff03f2dc85d5b26b7f4469bc85a25ee09 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Fri, 13 Dec 2019 14:43:54 +0100 Subject: introduce verbosity aware subprocess.run wrapper and use it in benchmarks --- src/benchmarks/mysql.py | 48 +++++++++++++++++++++-------------------------- src/benchmarks/raxmlng.py | 16 +++------------- src/benchmarks/redis.py | 8 ++------ src/util.py | 26 +++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/benchmarks/mysql.py b/src/benchmarks/mysql.py index 0d24ff6..f80286f 100644 --- a/src/benchmarks/mysql.py +++ b/src/benchmarks/mysql.py @@ -75,15 +75,14 @@ import multiprocessing import os import re import shutil -import subprocess -from subprocess import PIPE +from subprocess import CalledProcessError import sys import numpy as np from src.benchmark import Benchmark import src.facter -from src.util import print_status, print_debug, print_info2 +from src.util import print_status, print_debug, print_info2, run_cmd MYSQL_USER = "fischerling" RUN_TIME = 10 @@ -147,39 +146,34 @@ class BenchmarkMYSQL(Benchmark): ] print_info2("Oracle MySQL detected") - p = subprocess.run(init_db_cmd, stdout=PIPE, stderr=PIPE) - - if not p.returncode == 0: - print_debug(init_db_cmd) - print_debug("Stdout:", p.stdout, file=sys.stdout) - print_debug("Stderr:", p.stderr, file=sys.stderr) - raise Exception("Creating test DB failed with:", p.returncode) + try: + run_cmd(init_db_cmd, capture=True) + except CalledProcessError as e: + print_debug("Stdout:", e.stdout, file=sys.stderr) + print_debug("Stderr:", e.stderr, file=sys.stderr) + raise e self.start_servers() # Create sbtest TABLE - p = subprocess.run( - f"mysql -u {MYSQL_USER} -S {self.build_dir}/socket".split(), - input=b"CREATE DATABASE sbtest;\n", - stdout=PIPE, - stderr=PIPE, + create_db_cmd = f"mysql -u {MYSQL_USER} -S {self.build_dir}/socket".split(), + try: + run_cmd(create_db_cmd, + input="CREATE DATABASE sbtest;\n", + capture=True, cwd=self.build_dir) - - if p.returncode != 0: - print_debug("Stderr:", p.stderr, file=sys.stderr) - raise Exception("Creating test tables failed with:", - p.returncode) + except CalledProcessError as e: + print_debug("Stderr:", e.stderr, file=sys.stderr) + raise e print_status("Prepare test tables ...") - prepare_cmd = PREPARE_CMD.format(build_dir=self.build_dir) - p = subprocess.run(prepare_cmd.split(), stdout=PIPE, stderr=PIPE) - if p.returncode != 0: - print_debug(f"Cmd: {prepare_cmd} failed with {p.returncode}", - file=sys.stderr) + prepare_cmd = PREPARE_CMD.format(build_dir=self.build_dir).split() + try: + run_cmd(prepare_cmd, captur=True) + except CalledProcessError as e: print_debug("Stdout:", p.stdout, file=sys.stderr) print_debug("Stderr:", p.stderr, file=sys.stderr) - raise Exception("Preparing test tables failed with:", - p.returncode) + raise e self.shutdown_servers() diff --git a/src/benchmarks/raxmlng.py b/src/benchmarks/raxmlng.py index dd405f5..786b143 100644 --- a/src/benchmarks/raxmlng.py +++ b/src/benchmarks/raxmlng.py @@ -18,13 +18,12 @@ import os import re -import subprocess import sys from urllib.request import urlretrieve from src.artifact import GitArtifact from src.benchmark import Benchmark -from src.util import print_info +from src.util import print_info, run_cmd RUNTIME_RE = re.compile("Elapsed time: (?P(\\d*.\\d*)) seconds") @@ -59,17 +58,8 @@ class BenchmarkRaxmlng(Benchmark): os.makedirs(raxmlng_builddir, exist_ok=True) # building raxml-ng - proc = subprocess.run( - ["cmake", ".."], - cwd=raxmlng_builddir, - # stdout=subprocess.PIPE, stderr=subprocess.PIPE, - universal_newlines=True) - - proc = subprocess.run( - ["make"], - cwd=raxmlng_builddir, - # stdout=subprocess.PIPE, stderr=subprocess.PIPE, - universal_newlines=True) + run_cmd( ["cmake", ".."], cwd=raxmlng_builddir, output_verbosity=2) + run_cmd( ["make"], cwd=raxmlng_builddir, output_verbosity=2) # create symlinks for exe in ["raxml-ng"]: diff --git a/src/benchmarks/redis.py b/src/benchmarks/redis.py index b487baf..23c2de6 100644 --- a/src/benchmarks/redis.py +++ b/src/benchmarks/redis.py @@ -23,13 +23,12 @@ archive. The used parameters are inspired by the ones used in mimalloc-bench." import os import re -import subprocess import sys from urllib.request import urlretrieve from src.artifact import ArchiveArtifact from src.benchmark import Benchmark -from src.util import print_info +from src.util import print_info, run_cmd REQUESTS_RE = re.compile("(?P(\\d*.\\d*)) requests per second") @@ -63,10 +62,7 @@ class BenchmarkRedis(Benchmark): redis.provide(self.build_dir) # building redis - proc = subprocess.run( - ["make", "-C", redis_dir, "MALLOC=libc", "USE_JEMALLOC=no"], - # stdout=subprocess.PIPE, stderr=subprocess.PIPE, - universal_newlines=True) + run_cmd(["make", "-C", redis_dir, "MALLOC=libc", "USE_JEMALLOC=no"]) # create symlinks for exe in ["redis-cli", "redis-server", "redis-benchmark"]: diff --git a/src/util.py b/src/util.py index 7992084..3f2ab06 100644 --- a/src/util.py +++ b/src/util.py @@ -24,6 +24,32 @@ import sys import src.globalvars +def run_cmd(cmd, + output_verbosity=3, + capture=False, + check=True, + cwd=None, + input=None): + """subprocess.run wrapper which cares about the set verbosity""" + if capture: + stdout = subprocess.PIPE + stderr = stdout + elif src.globalvars.verbosity < output_verbosity: + stdout = subprocess.DEVNULL + stderr = stdout + else: + stdout = None + stderr = stdout + + return subprocess.run(cmd, + check=check, + universal_newlines=True, + cwd=None, + stdout=stdout, + stderr=stderr, + input=input) + + def is_exe(fpath): """Check if the given path is an exexutable file""" return os.path.isfile(fpath) and os.access(fpath, os.X_OK) -- cgit v1.2.3