diff options
Diffstat (limited to 'bitbake/lib/bb/runqueue.py')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index ca71d213d3..3008b7ad4f 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -1242,6 +1242,7 @@ class RunQueue: | |||
1242 | magic = "decafbad" | 1242 | magic = "decafbad" |
1243 | if self.cooker.configuration.profile: | 1243 | if self.cooker.configuration.profile: |
1244 | magic = "decafbadbad" | 1244 | magic = "decafbadbad" |
1245 | fakerootlogs = None | ||
1245 | if fakeroot: | 1246 | if fakeroot: |
1246 | magic = magic + "beef" | 1247 | magic = magic + "beef" |
1247 | mcdata = self.cooker.databuilder.mcdata[mc] | 1248 | mcdata = self.cooker.databuilder.mcdata[mc] |
@@ -1251,10 +1252,11 @@ class RunQueue: | |||
1251 | for key, value in (var.split('=') for var in fakerootenv): | 1252 | for key, value in (var.split('=') for var in fakerootenv): |
1252 | env[key] = value | 1253 | env[key] = value |
1253 | worker = subprocess.Popen(fakerootcmd + ["bitbake-worker", magic], stdout=subprocess.PIPE, stdin=subprocess.PIPE, env=env) | 1254 | worker = subprocess.Popen(fakerootcmd + ["bitbake-worker", magic], stdout=subprocess.PIPE, stdin=subprocess.PIPE, env=env) |
1255 | fakerootlogs = self.rqdata.dataCaches[mc].fakerootlogs | ||
1254 | else: | 1256 | else: |
1255 | worker = subprocess.Popen(["bitbake-worker", magic], stdout=subprocess.PIPE, stdin=subprocess.PIPE) | 1257 | worker = subprocess.Popen(["bitbake-worker", magic], stdout=subprocess.PIPE, stdin=subprocess.PIPE) |
1256 | bb.utils.nonblockingfd(worker.stdout) | 1258 | bb.utils.nonblockingfd(worker.stdout) |
1257 | workerpipe = runQueuePipe(worker.stdout, None, self.cfgData, self, rqexec) | 1259 | workerpipe = runQueuePipe(worker.stdout, None, self.cfgData, self, rqexec, fakerootlogs=fakerootlogs) |
1258 | 1260 | ||
1259 | workerdata = { | 1261 | workerdata = { |
1260 | "taskdeps" : self.rqdata.dataCaches[mc].task_deps, | 1262 | "taskdeps" : self.rqdata.dataCaches[mc].task_deps, |
@@ -1772,7 +1774,7 @@ class RunQueueExecute: | |||
1772 | self.sqdata = SQData() | 1774 | self.sqdata = SQData() |
1773 | build_scenequeue_data(self.sqdata, self.rqdata, self.rq, self.cooker, self.stampcache, self) | 1775 | build_scenequeue_data(self.sqdata, self.rqdata, self.rq, self.cooker, self.stampcache, self) |
1774 | 1776 | ||
1775 | def runqueue_process_waitpid(self, task, status): | 1777 | def runqueue_process_waitpid(self, task, status, fakerootlog=None): |
1776 | 1778 | ||
1777 | # self.build_stamps[pid] may not exist when use shared work directory. | 1779 | # self.build_stamps[pid] may not exist when use shared work directory. |
1778 | if task in self.build_stamps: | 1780 | if task in self.build_stamps: |
@@ -1787,7 +1789,7 @@ class RunQueueExecute: | |||
1787 | self.sq_live.remove(task) | 1789 | self.sq_live.remove(task) |
1788 | else: | 1790 | else: |
1789 | if status != 0: | 1791 | if status != 0: |
1790 | self.task_fail(task, status) | 1792 | self.task_fail(task, status, fakerootlog=fakerootlog) |
1791 | else: | 1793 | else: |
1792 | self.task_complete(task) | 1794 | self.task_complete(task) |
1793 | return True | 1795 | return True |
@@ -1908,14 +1910,31 @@ class RunQueueExecute: | |||
1908 | self.task_completeoutright(task) | 1910 | self.task_completeoutright(task) |
1909 | self.runq_tasksrun.add(task) | 1911 | self.runq_tasksrun.add(task) |
1910 | 1912 | ||
1911 | def task_fail(self, task, exitcode): | 1913 | def task_fail(self, task, exitcode, fakerootlog=None): |
1912 | """ | 1914 | """ |
1913 | Called when a task has failed | 1915 | Called when a task has failed |
1914 | Updates the state engine with the failure | 1916 | Updates the state engine with the failure |
1915 | """ | 1917 | """ |
1916 | self.stats.taskFailed() | 1918 | self.stats.taskFailed() |
1917 | self.failed_tids.append(task) | 1919 | self.failed_tids.append(task) |
1918 | bb.event.fire(runQueueTaskFailed(task, self.stats, exitcode, self.rq), self.cfgData) | 1920 | |
1921 | fakeroot_log = "" | ||
1922 | if fakerootlog and os.path.exists(fakerootlog): | ||
1923 | with open(fakerootlog) as fakeroot_log_file: | ||
1924 | fakeroot_failed = False | ||
1925 | for line in reversed(fakeroot_log_file.readlines()): | ||
1926 | for fakeroot_error in ['mismatch', 'error', 'fatal']: | ||
1927 | if fakeroot_error in line.lower(): | ||
1928 | fakeroot_failed = True | ||
1929 | if 'doing new pid setup and server start' in line: | ||
1930 | break | ||
1931 | fakeroot_log = line + fakeroot_log | ||
1932 | |||
1933 | if not fakeroot_failed: | ||
1934 | fakeroot_log = None | ||
1935 | |||
1936 | bb.event.fire(runQueueTaskFailed(task, self.stats, exitcode, self.rq, fakeroot_log=fakeroot_log), self.cfgData) | ||
1937 | |||
1919 | if self.rqdata.taskData[''].abort: | 1938 | if self.rqdata.taskData[''].abort: |
1920 | self.rq.state = runQueueCleanUp | 1939 | self.rq.state = runQueueCleanUp |
1921 | 1940 | ||
@@ -2883,12 +2902,16 @@ class runQueueTaskFailed(runQueueEvent): | |||
2883 | """ | 2902 | """ |
2884 | Event notifying a task failed | 2903 | Event notifying a task failed |
2885 | """ | 2904 | """ |
2886 | def __init__(self, task, stats, exitcode, rq): | 2905 | def __init__(self, task, stats, exitcode, rq, fakeroot_log=None): |
2887 | runQueueEvent.__init__(self, task, stats, rq) | 2906 | runQueueEvent.__init__(self, task, stats, rq) |
2888 | self.exitcode = exitcode | 2907 | self.exitcode = exitcode |
2908 | self.fakeroot_log = fakeroot_log | ||
2889 | 2909 | ||
2890 | def __str__(self): | 2910 | def __str__(self): |
2891 | return "Task (%s) failed with exit code '%s'" % (self.taskstring, self.exitcode) | 2911 | if self.fakeroot_log: |
2912 | return "Task (%s) failed with exit code '%s' \nPseudo log:\n%s" % (self.taskstring, self.exitcode, self.fakeroot_log) | ||
2913 | else: | ||
2914 | return "Task (%s) failed with exit code '%s'" % (self.taskstring, self.exitcode) | ||
2892 | 2915 | ||
2893 | class sceneQueueTaskFailed(sceneQueueEvent): | 2916 | class sceneQueueTaskFailed(sceneQueueEvent): |
2894 | """ | 2917 | """ |
@@ -2940,7 +2963,7 @@ class runQueuePipe(): | |||
2940 | """ | 2963 | """ |
2941 | Abstraction for a pipe between a worker thread and the server | 2964 | Abstraction for a pipe between a worker thread and the server |
2942 | """ | 2965 | """ |
2943 | def __init__(self, pipein, pipeout, d, rq, rqexec): | 2966 | def __init__(self, pipein, pipeout, d, rq, rqexec, fakerootlogs=None): |
2944 | self.input = pipein | 2967 | self.input = pipein |
2945 | if pipeout: | 2968 | if pipeout: |
2946 | pipeout.close() | 2969 | pipeout.close() |
@@ -2949,6 +2972,7 @@ class runQueuePipe(): | |||
2949 | self.d = d | 2972 | self.d = d |
2950 | self.rq = rq | 2973 | self.rq = rq |
2951 | self.rqexec = rqexec | 2974 | self.rqexec = rqexec |
2975 | self.fakerootlogs = fakerootlogs | ||
2952 | 2976 | ||
2953 | def setrunqueueexec(self, rqexec): | 2977 | def setrunqueueexec(self, rqexec): |
2954 | self.rqexec = rqexec | 2978 | self.rqexec = rqexec |
@@ -2994,7 +3018,11 @@ class runQueuePipe(): | |||
2994 | task, status = pickle.loads(self.queue[10:index]) | 3018 | task, status = pickle.loads(self.queue[10:index]) |
2995 | except (ValueError, pickle.UnpicklingError, AttributeError, IndexError) as e: | 3019 | except (ValueError, pickle.UnpicklingError, AttributeError, IndexError) as e: |
2996 | bb.msg.fatal("RunQueue", "failed load pickle '%s': '%s'" % (e, self.queue[10:index])) | 3020 | bb.msg.fatal("RunQueue", "failed load pickle '%s': '%s'" % (e, self.queue[10:index])) |
2997 | self.rqexec.runqueue_process_waitpid(task, status) | 3021 | (_, _, _, taskfn) = split_tid_mcfn(task) |
3022 | fakerootlog = None | ||
3023 | if self.fakerootlogs and taskfn and taskfn in self.fakerootlogs: | ||
3024 | fakerootlog = self.fakerootlogs[taskfn] | ||
3025 | self.rqexec.runqueue_process_waitpid(task, status, fakerootlog=fakerootlog) | ||
2998 | found = True | 3026 | found = True |
2999 | self.queue = self.queue[index+11:] | 3027 | self.queue = self.queue[index+11:] |
3000 | index = self.queue.find(b"</exitcode>") | 3028 | index = self.queue.find(b"</exitcode>") |