[bitbake-devel] [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
Robert Yang
liezhi.yang at windriver.com
Mon Aug 19 08:34:36 UTC 2019
On 8/16/19 7:03 AM, richard.purdie at linuxfoundation.org wrote:
> On Thu, 2019-08-15 at 19:29 +0800, Robert Yang wrote:
>>
>> On 5/14/19 7:02 PM, Robert Yang wrote:
>>>
>>> On 5/12/19 4:28 PM, Richard Purdie wrote:
>>>> On Thu, 2019-05-09 at 16:03 +0800, Robert Yang wrote:
>>>>> The bb.fatal() raises BBHandledException() which causes double
>>>>> exceptions,
>>>>> e.g.:
>>>>>
>>>>> Add 'HOSTTOOLS += "hello"' to conf/local.conf:
>>>>> $ bitbake -p
>>>>> [snip]
>>>>> During handling of the above exception, another exception
>>>>> occurred:
>>>>> [snip]
>>>>> ERROR: The following required tools (as specified by HOSTTOOLS)
>>>>> appear to be
>>>>> unavailable in PATH, please install them in order to proceed:
>>>>> hello
>>>>>
>>>>> Use "raise" rather than "raise bb.BBHandledException" to fix
>>>>> the double
>>>>> exceptions.
>>>>>
>>>>> [YOCTO #13267]
>>>>>
>>>>> Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
>>>>> ---
>>>>> bitbake/lib/bb/cookerdata.py | 4 +++-
>>>>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/bitbake/lib/bb/cookerdata.py
>>>>> b/bitbake/lib/bb/cookerdata.py
>>>>> index f8ae410..585edc5 100644
>>>>> --- a/bitbake/lib/bb/cookerdata.py
>>>>> +++ b/bitbake/lib/bb/cookerdata.py
>>>>> @@ -301,7 +301,9 @@ class CookerDataBuilder(object):
>>>>> if multiconfig:
>>>>>
>>>>> bb.event.fire(bb.event.MultiConfigParsed(self.mcdata
>>>>> ), self.data)
>>>>> - except (SyntaxError, bb.BBHandledException):
>>>>> + except bb.BBHandledException:
>>>>> + raise
>>>>> + except SyntaxError:
>>>>> raise bb.BBHandledException
>>>>> except bb.data_smart.ExpansionError as e:
>>>>> logger.error(str(e))
>>>>
>>>> Hi Robert,
>>>>
>>>> This doesn't sound right, where is this exception being printed a
>>>> second time? The point of "BBHandledException" is to say "don't
>>>> print
>>>> any further traces for this exception". If this fixes the bug, it
>>>> means
>>>> something somewhere is printing a trace for a second time when it
>>>> should pass through BBHandledException?
>>>
>>> Hi RP,
>>>
>>> I found another serious problem when tried to raise
>>> BBHandledException. There
>>> is a deadlock when a recipe is failed to parse, e.g.:
>>>
>>> $ echo helloworld >> meta/recipes-extended/bash/bash_4.4.18.bb
>>> $ bitbake -p
>>> meta/recipes-extended/bash/bash_4.4.18.bb:42: unparsed line:
>>> 'helloworld'
>>> [hangs]
>>>
>>> Then bitbake hangs, we can use Ctrl-C to break it, but the sub
>>> processes
>>> are still existed, and we need kill them manually, otherwise we
>>> can't start
>>> bitbake again.
>>
>> BTW, things becomes much better after the following two patches are
>> merged:
>> bitbake: knotty: Fix for the Second Keyboard Interrupt
>> bitbake: cooker: Cleanup the queue before call process.join()
>>
>> Now we hardly can reproduce the problem:
>> echo helloworld >> meta/recipes-extended/bash/bash_4.4.18.bb
>> $ while true; do kill-bb; rm -fr bitbake-cookerdaemon.log
>> tmp/cache/default-glibc/qemux86-64/x86_64/bb_cache.dat* ; bitbake -p;
>> done
>>
>> It's not easy to hang any more, but still hangs sometimes, I tried to
>> debug it,
>> but didn't find the root cause, the ui/knotty.py can't get event from
>> server,
>> and goes into a dead loop.
>>
>> event = eventHandler.waitEvent(0)
>> if event is None:
>> if main.shutdown > 1:
>> break
>> termfilter.updateFooter()
>> event = eventHandler.waitEvent(0.25)
>> if event is None:
>> continue
>>
>> The main.shutdown is always 0 when it hangs.
>
> In theory there are timeouts there so it should never hang waiting for
> an event. Is it looping and not getting an event? or is the other end
> disconnected?
>
> I guess the question is what we can do to detect a dead connection, or
> if the server is still alive, why the server is hanging and not sending
> any events?
After more investigations, it may hang at two places, they are very rarely to
happen, but does happen, I can use the following command to reproduce it in
10 minutes:
$ while true; do kill-bb; rm -fr bitbake-cookerdaemon.log
tmp/cache/default-glibc/qemux86-64/x86_64/bb_cache.dat* ; bitbake -p; done
* Hangs #1 in cooker.py:
2065 # Cleanup the queue before call process.join(), otherwise there
might be
2066 # deadlocks.
2067 while True:
2068 try:
2069 self.result_queue.get(timeout=0.25)
2070 except queue.Empty:
2071 break
It hangs at self.result_queue.get(timeout=0.25), the timeout doesn't work
here, I tried python 3.5.2 and 3.6.7, the later one is a little better,
but still have the problem, I think that it's a bug of python3's
multiprocessing, and we can call self.result_queue.cancel_join_thread()
to fix the problem.
* Hangs #2 in cooker.py:
2073 for process in self.processes:
2074 if force:
2075 process.join(.1)
2076 process.terminate()
2077 else:
2078 process.join()
It hangs at process.join(), I added debug code there, it is because the process
is alive when join() it, I think that we can use a while loop to check whether
the process is alive or not before join(), and force join() after many tries.
I will do more testing before send the patches, make sure it won't hang in hours.
// Robert
>
> Thanks for the patches, those were tricky issues to track down and
> solve!
>
> Cheers,
>
> Richard
>
>
>
More information about the bitbake-devel
mailing list