buildstats.bbclass: improve timeout handling

The subprocess that runs the commands periodically
times out prematurely even when there is sufficient
time available within the given interval for the
commands to run.

This change improves timeout handling and give all the
commands equal time to run.

(From OE-Core rev: 74e5c438025ed42cfacb993261dc664c3b7959a8)

Signed-off-by: Sakib Sajal <sakib.sajal@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Sakib Sajal 2021-03-09 02:17:43 -05:00 committed by Richard Purdie
parent aafa7a3f3a
commit 1d7da7a6fa

View File

@ -106,26 +106,54 @@ def write_task_data(status, logfile, e, d):
def write_host_data(logfile, e, d):
import subprocess, os, datetime
# minimum time allowed for each command to run, in seconds
time_threshold = 0.5
# the total number of commands
num_cmds = 0
# interval at which data will be logged
interval = int(d.getVar("BB_HEARTBEAT_EVENT", False))
# the commands to be run at each interval
cmds = d.getVar('BB_LOG_HOST_STAT_CMDS')
# if no commands are passed, issue a warning and return
if cmds is None:
d.setVar("BB_LOG_HOST_STAT_ON_INTERVAL", "0")
d.setVar("BB_LOG_HOST_STAT_ON_FAILURE", "0")
bb.warn("buildstats: Collecting host data failed. Set BB_LOG_HOST_STAT_CMDS=\"command1 ; command2 ; ... \" in conf\/local.conf\n")
bb.warn("buildstats: Collecting host data failed. Set BB_LOG_HOST_STAT_CMDS=\"command1 ; command2 ; ... \" in conf/local.conf\n")
return
# find the total commands
c_san = []
for cmd in cmds.split(";"):
if len(cmd) == 0:
continue
num_cmds += 1
c_san.append(cmd)
if num_cmds <= 0:
d.setVar("BB_LOG_HOST_STAT_ON_INTERVAL", "0")
d.setVar("BB_LOG_HOST_STAT_ON_FAILURE", "0")
return
# return if the interval is not enough to run all commands within the specified BB_HEARTBEAT_EVENT interval
limit = interval / num_cmds
if limit <= time_threshold:
d.setVar("BB_LOG_HOST_STAT_ON_INTERVAL", "0")
d.setVar("BB_LOG_HOST_STAT_ON_FAILURE", "0")
bb.warn("buildstats: Collecting host data failed. BB_HEARTBEAT_EVENT interval not enough to run the specified commands. HINT: Increase value of BB_HEARTBEAT_EVENT in conf/local.conf\n")
return
# set the environment variables
path = d.getVar("PATH")
opath = d.getVar("BB_ORIGENV", False).getVar("PATH")
ospath = os.environ['PATH']
os.environ['PATH'] = path + ":" + opath + ":" + ospath
with open(logfile, "a") as f:
f.write("Event Time: %f\nDate: %s\n" % (e.time, datetime.datetime.now()))
for cmd in cmds.split(";"):
if len(cmd) == 0:
continue
for c in c_san:
try:
output = subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT, timeout=1).decode('utf-8')
output = subprocess.check_output(c.split(), stderr=subprocess.STDOUT, timeout=limit).decode('utf-8')
except (subprocess.CalledProcessError, subprocess.TimeoutExpired, FileNotFoundError) as err:
output = "Error running command: %s\n%s\n" % (cmd, err)
f.write("%s\n%s\n" % (cmd, output))
output = "Error running command: %s\n%s\n" % (c, err)
f.write("%s\n%s\n" % (c, output))
# reset the environment
os.environ['PATH'] = ospath
python run_buildstats () {