]> code.ossystems Code Review - openembedded-core.git/commitdiff
buildstats.bbclass: improve timeout handling
authorSakib Sajal <sakib.sajal@windriver.com>
Tue, 9 Mar 2021 07:17:43 +0000 (02:17 -0500)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 11 Mar 2021 13:59:34 +0000 (13:59 +0000)
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.

Signed-off-by: Sakib Sajal <sakib.sajal@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/buildstats.bbclass

index a8ee6e69a64c6099889525005f0a886c17745ccf..8e03039aeb6701eeff7fed2c080dc229c26f7ca3 100644 (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 () {