All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
@ 2019-05-09  8:03 Robert Yang
  2019-05-09  8:03 ` [PATCH 1/1] " Robert Yang
  0 siblings, 1 reply; 11+ messages in thread
From: Robert Yang @ 2019-05-09  8:03 UTC (permalink / raw)
  To: bitbake-devel

The following changes since commit c0dc72bad92e2e4dc0aedb48b969709f821baf73:

  coreutils: Fix patch upstream status field (2019-05-08 23:36:21 +0100)

are available in the git repository at:

  git://git.pokylinux.org/poky-contrib rbt/python
  http://git.pokylinux.org/cgit.cgi//log/?h=rbt/python

Robert Yang (1):
  bitbake: cookerdata: Avoid double exceptions for bb.fatal()

 bitbake/lib/bb/cookerdata.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

-- 
2.7.4



^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
  2019-05-09  8:03 [PATCH 0/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal() Robert Yang
@ 2019-05-09  8:03 ` Robert Yang
  2019-05-12  8:28   ` Richard Purdie
  0 siblings, 1 reply; 11+ messages in thread
From: Robert Yang @ 2019-05-09  8:03 UTC (permalink / raw)
  To: bitbake-devel

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@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))
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
  2019-05-09  8:03 ` [PATCH 1/1] " Robert Yang
@ 2019-05-12  8:28   ` Richard Purdie
  2019-05-14 11:02     ` Robert Yang
  2019-08-15 10:55     ` Robert Yang
  0 siblings, 2 replies; 11+ messages in thread
From: Richard Purdie @ 2019-05-12  8:28 UTC (permalink / raw)
  To: Robert Yang, bitbake-devel

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@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?

Cheers,

Richard



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
  2019-05-12  8:28   ` Richard Purdie
@ 2019-05-14 11:02     ` Robert Yang
  2019-05-20  8:55       ` Robert Yang
  2019-08-15 11:29       ` Robert Yang
  2019-08-15 10:55     ` Robert Yang
  1 sibling, 2 replies; 11+ messages in thread
From: Robert Yang @ 2019-05-14 11:02 UTC (permalink / raw)
  To: Richard Purdie, bitbake-devel



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@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.

I think that there are two problems:
1) The cooker.py:parse_generator() raises an exception which makes
    one of result_queue or parser_quit have a deadlock, then
    causes the shutdown():process.join() hanged.

2) The sub processes, parser_quit and result_queue are running dependently,
    we can't make sure that cooker.py:Parser():realrun() can get data from
    parser_quit, so there is a race issue, the Parser's subprocess maybe already
    exited before parser_quit sends data to it.

I think that we can move part of parse_next()'s code into parse_generator()
to fix the deadlock problem, and we may need change the working way of
parser_quit. But I'm not sure, I need your suggestions before work on it.

// Robert

> 
> Cheers,
> 
> Richard
> 
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
  2019-05-14 11:02     ` Robert Yang
@ 2019-05-20  8:55       ` Robert Yang
  2019-08-15 11:29       ` Robert Yang
  1 sibling, 0 replies; 11+ messages in thread
From: Robert Yang @ 2019-05-20  8:55 UTC (permalink / raw)
  To: Richard Purdie, bitbake-devel



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@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.
> 
> I think that there are two problems:
> 1) The cooker.py:parse_generator() raises an exception which makes
>     one of result_queue or parser_quit have a deadlock, then
>     causes the shutdown():process.join() hanged.
> 
> 2) The sub processes, parser_quit and result_queue are running dependently,
>     we can't make sure that cooker.py:Parser():realrun() can get data from
>     parser_quit, so there is a race issue, the Parser's subprocess maybe already
>     exited before parser_quit sends data to it.
> 
> I think that we can move part of parse_next()'s code into parse_generator()
> to fix the deadlock problem, and we may need change the working way of
> parser_quit. But I'm not sure, I need your suggestions before work on it.

Hi RP,

Do you have any suggestions, please?

// Robert

> 
> // Robert
> 
>>
>> Cheers,
>>
>> Richard
>>
>>


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
  2019-05-12  8:28   ` Richard Purdie
  2019-05-14 11:02     ` Robert Yang
@ 2019-08-15 10:55     ` Robert Yang
  1 sibling, 0 replies; 11+ messages in thread
From: Robert Yang @ 2019-08-15 10:55 UTC (permalink / raw)
  To: Richard Purdie, bitbake-devel

Hi RP,

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@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?

I think that I've found the root cause, it is because no code handles
BBHandledException during server is starting, so we will *always* get
(double) exceptions when BBHandledException comes during server is starting,
such as call bb.fatal() during parsing configurations files. I will
send a patch to fix it.

// Robert

> 
> Cheers,
> 
> Richard
> 
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
  2019-05-14 11:02     ` Robert Yang
  2019-05-20  8:55       ` Robert Yang
@ 2019-08-15 11:29       ` Robert Yang
  2019-08-15 23:03         ` richard.purdie
  1 sibling, 1 reply; 11+ messages in thread
From: Robert Yang @ 2019-08-15 11:29 UTC (permalink / raw)
  To: Richard Purdie, bitbake-devel



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@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.

// Robert

> 
> I think that there are two problems:
> 1) The cooker.py:parse_generator() raises an exception which makes
>     one of result_queue or parser_quit have a deadlock, then
>     causes the shutdown():process.join() hanged.
> 
> 2) The sub processes, parser_quit and result_queue are running dependently,
>     we can't make sure that cooker.py:Parser():realrun() can get data from
>     parser_quit, so there is a race issue, the Parser's subprocess maybe already
>     exited before parser_quit sends data to it.
> 
> I think that we can move part of parse_next()'s code into parse_generator()
> to fix the deadlock problem, and we may need change the working way of
> parser_quit. But I'm not sure, I need your suggestions before work on it.
> 
> // Robert
> 
>>
>> Cheers,
>>
>> Richard
>>
>>


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
  2019-08-15 11:29       ` Robert Yang
@ 2019-08-15 23:03         ` richard.purdie
  2019-08-19  8:34           ` Robert Yang
  0 siblings, 1 reply; 11+ messages in thread
From: richard.purdie @ 2019-08-15 23:03 UTC (permalink / raw)
  To: Robert Yang, bitbake-devel

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@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?

Thanks for the patches, those were tricky issues to track down and
solve!

Cheers,

Richard




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
  2019-08-15 23:03         ` richard.purdie
@ 2019-08-19  8:34           ` Robert Yang
  2019-08-19  9:04             ` Robert Yang
  2019-08-22  9:06             ` Robert Yang
  0 siblings, 2 replies; 11+ messages in thread
From: Robert Yang @ 2019-08-19  8:34 UTC (permalink / raw)
  To: richard.purdie, bitbake-devel


On 8/16/19 7:03 AM, richard.purdie@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@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
> 
> 
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
  2019-08-19  8:34           ` Robert Yang
@ 2019-08-19  9:04             ` Robert Yang
  2019-08-22  9:06             ` Robert Yang
  1 sibling, 0 replies; 11+ messages in thread
From: Robert Yang @ 2019-08-19  9:04 UTC (permalink / raw)
  To: richard.purdie, bitbake-devel



On 8/19/19 4:34 PM, Robert Yang wrote:
> 
> On 8/16/19 7:03 AM, richard.purdie@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@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

Sorry, the full commands should be:


$ 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

// Rboert

>>>
>>> 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
>>
>>
>>


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal()
  2019-08-19  8:34           ` Robert Yang
  2019-08-19  9:04             ` Robert Yang
@ 2019-08-22  9:06             ` Robert Yang
  1 sibling, 0 replies; 11+ messages in thread
From: Robert Yang @ 2019-08-22  9:06 UTC (permalink / raw)
  To: richard.purdie, bitbake-devel



On 8/19/19 4:34 PM, Robert Yang wrote:
> 
> On 8/16/19 7:03 AM, richard.purdie@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@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.


After a lot tries, the only reliable way to avoid hanging is os.kill(), I've
sent the patch for it, and added reason in the commit message.

// Robert

> 
> // Robert
> 
>>
>> Thanks for the patches, those were tricky issues to track down and
>> solve!
>>
>> Cheers,
>>
>> Richard
>>
>>
>>


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2019-08-22  9:05 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-09  8:03 [PATCH 0/1] bitbake: cookerdata: Avoid double exceptions for bb.fatal() Robert Yang
2019-05-09  8:03 ` [PATCH 1/1] " Robert Yang
2019-05-12  8:28   ` Richard Purdie
2019-05-14 11:02     ` Robert Yang
2019-05-20  8:55       ` Robert Yang
2019-08-15 11:29       ` Robert Yang
2019-08-15 23:03         ` richard.purdie
2019-08-19  8:34           ` Robert Yang
2019-08-19  9:04             ` Robert Yang
2019-08-22  9:06             ` Robert Yang
2019-08-15 10:55     ` Robert Yang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.