Fix async hang on failure (and other asyncio fixes)
Plus a couple of commits from !381 (closed)
commit 73911c9b
utils: fix spammy BlockingIOError on older python versions
Python < 3.8 used SIGCHLD to reap child proceses and would poll every
process on every SIGCHLD (asyncio.SafeChildWatcher). This may become
overwhelming with lots of short-lived processes. We don't actually
need this functionality of polling individual processes so we can use
the asyncio.FastChildWatcher instead.
We keep the default asyncio.ThreadedChildWatcher for python 3.8 as it
does not produce BlockingIOError
commit bf48611b
cerbero: Use a list for the download command, not a string
We split the string immediately in async_call, so no point doing this.
Just pass a list from the start, which also avoids shell quoting
issues.
commit 93d1c947
cerbero: Log download output to a the fetch log
Not sure how this was missed all this time! The output from fetch to
stdout is unreadable when we download several recipes in parallel,
which is the default.
commit 267fd3ee
oven: fix 'rebuild recipe' on failure
We cannot use the same logic as 'retry failed step' and need to
propagate the retry intention upwards where it reinserted into the queue
of to build recipes.
commit a7ca5b5d
utils: handle nested run_tasks()
As used when building universal variants (ios, android)
We need to propagate the CancelledError from the sub-run_tasks() to the
parent run_tasks() so that the parent knows to stop rather than
continuing.
We attempt to avoid raising the CancelledError if another exception
is thrown somewhere else as a task being cancelled is not an
interesting result from a failure.