summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/build.py
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2021-09-23 12:16:14 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-09-23 22:13:08 +0100
commit7d0437c4e8063362d9ca127dbd439208fe6ebda4 (patch)
tree0f0aa10bfa692387ffffae18de225b04f026dffb /bitbake/lib/bb/build.py
parent3d06c164dd729484ac1c73e3c73d3b6018749877 (diff)
downloadpoky-7d0437c4e8063362d9ca127dbd439208fe6ebda4.tar.gz
bitbake: build: Fix log flushing race
There is a race between sending the TaskFailed event which could trigger the UI to look at the logs and flushing and closing the log files. Reverse the order of the finally clause and the exception handling to ensure we've handled the logfiles before sending the task events. This should fix a race seen in bblogging.BitBakeLogging.test_python_exit_logging (Bitbake rev: 032190aac31604d37740d8aecf6e74a5448de358) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/build.py')
-rw-r--r--bitbake/lib/bb/build.py76
1 files changed, 38 insertions, 38 deletions
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
index 99954b0c26..7e4ab9f64c 100644
--- a/bitbake/lib/bb/build.py
+++ b/bitbake/lib/bb/build.py
@@ -686,51 +686,51 @@ def _exec_task(fn, task, d, quieterr):
686 try: 686 try:
687 try: 687 try:
688 event.fire(TaskStarted(task, fn, logfn, flags, localdata), localdata) 688 event.fire(TaskStarted(task, fn, logfn, flags, localdata), localdata)
689 except (bb.BBHandledException, SystemExit):
690 return 1
691 689
692 try:
693 for func in (prefuncs or '').split(): 690 for func in (prefuncs or '').split():
694 exec_func(func, localdata) 691 exec_func(func, localdata)
695 exec_func(task, localdata) 692 exec_func(task, localdata)
696 for func in (postfuncs or '').split(): 693 for func in (postfuncs or '').split():
697 exec_func(func, localdata) 694 exec_func(func, localdata)
698 except bb.BBHandledException: 695 finally:
699 event.fire(TaskFailed(task, fn, logfn, localdata, True), localdata) 696 # Need to flush and close the logs before sending events where the
700 return 1 697 # UI may try to look at the logs.
701 except (Exception, SystemExit) as exc: 698 sys.stdout.flush()
702 if quieterr: 699 sys.stderr.flush()
703 event.fire(TaskFailedSilent(task, fn, logfn, localdata), localdata) 700
704 else: 701 bblogger.removeHandler(handler)
705 errprinted = errchk.triggered 702
706 # If the output is already on stdout, we've printed the information in the 703 # Restore the backup fds
707 # logs once already so don't duplicate 704 os.dup2(osi[0], osi[1])
708 if verboseStdoutLogging: 705 os.dup2(oso[0], oso[1])
709 errprinted = True 706 os.dup2(ose[0], ose[1])
710 logger.error(repr(exc)) 707
711 event.fire(TaskFailed(task, fn, logfn, localdata, errprinted), localdata) 708 # Close the backup fds
712 return 1 709 os.close(osi[0])
713 finally: 710 os.close(oso[0])
714 sys.stdout.flush() 711 os.close(ose[0])
715 sys.stderr.flush() 712
716 713 logfile.close()
717 bblogger.removeHandler(handler) 714 if os.path.exists(logfn) and os.path.getsize(logfn) == 0:
718 715 logger.debug2("Zero size logfn %s, removing", logfn)
719 # Restore the backup fds 716 bb.utils.remove(logfn)
720 os.dup2(osi[0], osi[1]) 717 bb.utils.remove(loglink)
721 os.dup2(oso[0], oso[1]) 718 except bb.BBHandledException:
722 os.dup2(ose[0], ose[1]) 719 event.fire(TaskFailed(task, fn, logfn, localdata, True), localdata)
723 720 return 1
724 # Close the backup fds 721 except (Exception, SystemExit) as exc:
725 os.close(osi[0]) 722 if quieterr:
726 os.close(oso[0]) 723 event.fire(TaskFailedSilent(task, fn, logfn, localdata), localdata)
727 os.close(ose[0]) 724 else:
725 errprinted = errchk.triggered
726 # If the output is already on stdout, we've printed the information in the
727 # logs once already so don't duplicate
728 if verboseStdoutLogging:
729 errprinted = True
730 logger.error(repr(exc))
731 event.fire(TaskFailed(task, fn, logfn, localdata, errprinted), localdata)
732 return 1
728 733
729 logfile.close()
730 if os.path.exists(logfn) and os.path.getsize(logfn) == 0:
731 logger.debug2("Zero size logfn %s, removing", logfn)
732 bb.utils.remove(logfn)
733 bb.utils.remove(loglink)
734 event.fire(TaskSucceeded(task, fn, logfn, localdata), localdata) 734 event.fire(TaskSucceeded(task, fn, logfn, localdata), localdata)
735 735
736 if not localdata.getVarFlag(task, 'nostamp', False) and not localdata.getVarFlag(task, 'selfstamp', False): 736 if not localdata.getVarFlag(task, 'nostamp', False) and not localdata.getVarFlag(task, 'selfstamp', False):