Spurious blockingio error

Summary

Today it happened to me that I could not use BuildStream due to a stack trace which happens at the beginning of the session.

After applying an fcntl workaround which clears the file descriptor flags on stderr/stdio, BuildStream started working again.

After removing the workaround, BuildStream no longer produces the unreproducible error.

Steps to reproduce

None.

What is the current bug behavior?

Spurious stack traces which rarely happen.

What is the expected correct behavior?

No spurious stack traces

Relevant logs and/or screenshots

Here is a sample of the log file:

      cached 15d0d536e33e473b6cdc71fce2c8d935cefa2480aa53e1c13e7d5878ff8fe6e8 freedesktop-sdk.bst:base/libassuan.bst 
      cached 63c47a9a99233e6c20f720202a952cee77d278edd4578c5807493a35d05aa19b freedesktop-sdk.bst:base/libksba.bst 
      cached e8b2afa8d69c88aeb6e148af8290c80eea616c11b6ef10bb3a85a6770d24bf07 freedesktop-sdk.bst:base/npth.bst 
      cached 0277075af66ca787c632cfeb8633dcdbe8fb20875a8cdf55159b56205b8ec38d freedesktop-sdk.bst:base/gnupg.bst 
      cached 7043a1feb89f7c416525cce0b315dbaccb2d61de92fca1994a545c5d952cb1b1 freedesktop-sdk.bst:base/pcre2.bst 
      cached bf4f16eebdd80ff8b70a4fdd4e10f8a922db73e6f6b69a7c663c6638f932a527 freedesktop-sdk.bst:base/git.bst 
      cached 61a91a356e8af39cd6f448cda9b621859b56293c414c9de309423e9040f8ca3d[--:--:--][][] BUG     [Errno 11] write could not complete without blocking

    Traceback (most recent call last):
      File "/home/tristan/.local/bin/bst", line 8, in <module>
        sys.exit(cli())
      File "/home/tristan/.local/lib/python3.5/site-packages/click/core.py", line 764, in __call__
        return self.main(*args, **kwargs)
      File "/codethink/GNOME/buildstream/buildstream/_frontend/cli.py", line 162, in override_main
        standalone_mode=standalone_mode, **extra)
      File "/home/tristan/.local/lib/python3.5/site-packages/click/core.py", line 717, in main
        rv = self.invoke(ctx)
      File "/home/tristan/.local/lib/python3.5/site-packages/click/core.py", line 1137, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/home/tristan/.local/lib/python3.5/site-packages/click/core.py", line 956, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/home/tristan/.local/lib/python3.5/site-packages/click/core.py", line 555, in invoke
        return callback(*args, **kwargs)
      File "/home/tristan/.local/lib/python3.5/site-packages/click/decorators.py", line 27, in new_func
        return f(get_current_context().obj, *args, **kwargs)
      File "/codethink/GNOME/buildstream/buildstream/_frontend/cli.py", line 330, in build
        build_all=all_)
      File "/codethink/GNOME/buildstream/buildstream/_stream.py", line 213, in build
        self._run()
      File "/codethink/GNOME/buildstream/buildstream/_stream.py", line 1006, in _run
        self._session_start_callback()
      File "/codethink/GNOME/buildstream/buildstream/_frontend/app.py", line 637, in session_start_cb
        styling=self.colors)
      File "/codethink/GNOME/buildstream/buildstream/_frontend/widget.py", line 498, in print_heading
        click.echo(text, color=styling, nl=False, err=True)
      File "/home/tristan/.local/lib/python3.5/site-packages/click/utils.py", line 260, in echo
        file.write(message)
    BlockingIOError: [Errno 11] write could not complete without blocking

Possible fixes

Clear file descriptor flags unconditionally at startup, can't say right now that this workaround is completely safe.

The idea for the workaround was taken from a similar issue