When tinfoil request a command to bitbake is handled in async manner [1], sometimes is this ends on return a Busy status.
This is a workaround a needs to be fixed in proper manner inside bitbake code. For example when running clientComplete and buildFile is on progress, ERROR: Function failed: base_do_unpack Traceback (most recent call last): File "/home/alimon/repos/poky/scripts/lib/devtool/standard.py", line 797, in modify initial_rev = _extract_source(srctree, args.keep_temp, args.branch, False, rd, tinfoil) File "/home/alimon/repos/poky/scripts/lib/devtool/standard.py", line 562, in _extract_source runtask(fn, 'unpack') File "/home/alimon/repos/poky/scripts/lib/devtool/standard.py", line 552, in runtask raise DevtoolError('Task do_%s failed' % task) devtool.DevtoolError: Task do_unpack failed During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/alimon/repos/poky/scripts/devtool", line 351, in <module> ret = main() File "/home/alimon/repos/poky/scripts/devtool", line 338, in main ret = args.func(args, config, basepath, workspace) File "/home/alimon/repos/poky/scripts/lib/devtool/standard.py", line 864, in modify tinfoil.shutdown() File "/home/alimon/repos/poky/bitbake/lib/bb/tinfoil.py", line 427, in shutdown self.run_command('clientComplete') File "/home/alimon/repos/poky/bitbake/lib/bb/tinfoil.py", line 320, in run_command raise TinfoilCommandFailed(result[1]) bb.tinfoil.TinfoilCommandFailed: Busy (buildFile in progress) Signed-off-by: Aníbal Limón <anibal.li...@linux.intel.com> --- bitbake/lib/bb/tinfoil.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/bitbake/lib/bb/tinfoil.py b/bitbake/lib/bb/tinfoil.py index fb0da622433..f3a1563e8f3 100644 --- a/bitbake/lib/bb/tinfoil.py +++ b/bitbake/lib/bb/tinfoil.py @@ -21,6 +21,7 @@ import os import sys import atexit import re +import time from collections import OrderedDict, defaultdict import bb.cache @@ -298,7 +299,7 @@ class Tinfoil: config_params = TinfoilConfigParameters(config_only=False) self.run_actions(config_params) - def run_command(self, command, *params): + def run_command(self, command, *params, ntries=0): """ Run a command on the server (as implemented in bb.command). Note that there are two types of command - synchronous and @@ -315,9 +316,23 @@ class Tinfoil: commandline = [command] if params: commandline.extend(params) - result = self.server_connection.connection.runCommand(commandline) - if result[1]: + + # XXX: Tinfoil commands are run by Cooker in async mode so gives + # some time to get done. + result = None + while True: + result = self.server_connection.connection.runCommand(commandline) + if not result[1]: + break + elif ntries == 0: + break + elif 'Busy' in result[1]: + ntries = ntries - 1 + time.sleep(1) + continue + raise TinfoilCommandFailed(result[1]) + return result[0] def set_event_mask(self, eventlist): @@ -424,7 +439,7 @@ class Tinfoil: def shutdown(self): if self.server_connection: - self.run_command('clientComplete') + self.run_command('clientComplete', ntries=1) _server_connections.remove(self.server_connection) bb.event.ui_queue = [] self.server_connection.terminate() -- 2.11.0 -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core