All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robert Yang <liezhi.yang@windriver.com>
To: Ross Burton <ross.burton@intel.com>,
	<bitbake-devel@lists.openembedded.org>
Subject: Re: [PATCH] lib/bb/build: handle incomplete message fragments in log FIFO
Date: Tue, 26 Jul 2016 13:44:12 +0800	[thread overview]
Message-ID: <5796F8AC.9050309@windriver.com> (raw)
In-Reply-To: <1469485946-6370-1-git-send-email-ross.burton@intel.com>


I tested this patch, didn't see the "Unrecognised command" any more.

// Robert

On 07/26/2016 06:32 AM, Ross Burton wrote:
> It's possible that the logging FIFO doesn't do a complete read (or the sender a
> complete write) with the result that an incomplete message is read in bitbake.
> This used to result in silently truncated lines but since 42d727 now also
> results in a warning as the start of the rest of the message isn't a valid
> logging command.
>
> Solve this by storing incoming bytes in a bytearray() across reads, and parsing
> complete messages from that.
>
> [ YOCTO #9999 ]
>
> Signed-off-by: Ross Burton <ross.burton@intel.com>
> ---
>   bitbake/lib/bb/build.py | 67 ++++++++++++++++++++++++++-----------------------
>   1 file changed, 36 insertions(+), 31 deletions(-)
>
> diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
> index a4deb00..c632a27 100644
> --- a/bitbake/lib/bb/build.py
> +++ b/bitbake/lib/bb/build.py
> @@ -385,39 +385,44 @@ exit $ret
>           else:
>               bb.warn('%s: invalid task progress varflag value "%s", ignoring' % (func, progress))
>
> +    fifobuffer = bytearray()
>       def readfifo(data):
> -        lines = data.split(b'\0')
> -        for line in lines:
> -            # Just skip empty commands
> -            if not line:
> -                continue
> -            splitval = line.split(b' ', 1)
> -            cmd = splitval[0].decode("utf-8")
> -            if len(splitval) > 1:
> -                value = splitval[1].decode("utf-8")
> -            else:
> -                value = ''
> -            if cmd == 'bbplain':
> -                bb.plain(value)
> -            elif cmd == 'bbnote':
> -                bb.note(value)
> -            elif cmd == 'bbwarn':
> -                bb.warn(value)
> -            elif cmd == 'bberror':
> -                bb.error(value)
> -            elif cmd == 'bbfatal':
> -                # The caller will call exit themselves, so bb.error() is
> -                # what we want here rather than bb.fatal()
> -                bb.error(value)
> -            elif cmd == 'bbfatal_log':
> -                bb.error(value, forcelog=True)
> -            elif cmd == 'bbdebug':
> -                splitval = value.split(' ', 1)
> -                level = int(splitval[0])
> -                value = splitval[1]
> -                bb.debug(level, value)
> +        nonlocal fifobuffer
> +        fifobuffer.extend(data)
> +        while fifobuffer:
> +            message, token, nextmsg = fifobuffer.partition(b"\00")
> +            if token:
> +                splitval = message.split(b' ', 1)
> +                cmd = splitval[0].decode("utf-8")
> +                if len(splitval) > 1:
> +                    value = splitval[1].decode("utf-8")
> +                else:
> +                    value = ''
> +                if cmd == 'bbplain':
> +                    bb.plain(value)
> +                elif cmd == 'bbnote':
> +                    bb.note(value)
> +                elif cmd == 'bbwarn':
> +                    bb.warn(value)
> +                elif cmd == 'bberror':
> +                    bb.error(value)
> +                elif cmd == 'bbfatal':
> +                    # The caller will call exit themselves, so bb.error() is
> +                    # what we want here rather than bb.fatal()
> +                    bb.error(value)
> +                elif cmd == 'bbfatal_log':
> +                    bb.error(value, forcelog=True)
> +                elif cmd == 'bbdebug':
> +                    splitval = value.split(' ', 1)
> +                    level = int(splitval[0])
> +                    value = splitval[1]
> +                    bb.debug(level, value)
> +                else:
> +                    bb.warn("Unrecognised command '%s' on FIFO" % cmd)
> +                fifobuffer = nextmsg
>               else:
> -                bb.warn("Unrecognised command '%s' on FIFO" % cmd)
> +                break
> +
>       tempdir = d.getVar('T', True)
>       fifopath = os.path.join(tempdir, 'fifo.%s' % os.getpid())
>       if os.path.exists(fifopath):
>


      reply	other threads:[~2016-07-26  5:44 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-25 22:32 [PATCH] lib/bb/build: handle incomplete message fragments in log FIFO Ross Burton
2016-07-26  5:44 ` Robert Yang [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5796F8AC.9050309@windriver.com \
    --to=liezhi.yang@windriver.com \
    --cc=bitbake-devel@lists.openembedded.org \
    --cc=ross.burton@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.