diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2023-11-27 13:38:09 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2023-11-27 22:52:08 +0000 |
commit | 27f7ef2e44b6b5db309c7dd7c41454d0900740ff (patch) | |
tree | dbb6acc56d6ef97a537e0e30a7e96d69df23399e /bitbake/lib/bb/cooker.py | |
parent | 7943caf90cb667660682e5768123e6bd233e12db (diff) | |
download | poky-27f7ef2e44b6b5db309c7dd7c41454d0900740ff.tar.gz |
bitbake: cooker: Avoid eventlog variable listing lockups
If the event log is enabled and parsing the metadata triggers log messages,
the event code and deadlock. Iterating the variables inside the event handling
code causes this. SOURCE_DATE_EPOCH triggers a python function which calls
bb.debug() and can trigger a lockup as one example.
Move the code around and add it to the BuildStarted events explictly. This
does mean runs without builds no longer get variables added to the eventlog
however we can look into a more targetted version of data if/as/where neded.
(Bitbake rev: 4135a617ae16d509362b5bf56378139cdc0876d2)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/cooker.py')
-rw-r--r-- | bitbake/lib/bb/cooker.py | 36 |
1 files changed, 11 insertions, 25 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index d658db9bd8..c5bfef55d6 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
@@ -102,12 +102,15 @@ class CookerFeatures(object): | |||
102 | 102 | ||
103 | class EventWriter: | 103 | class EventWriter: |
104 | def __init__(self, cooker, eventfile): | 104 | def __init__(self, cooker, eventfile): |
105 | self.file_inited = None | ||
106 | self.cooker = cooker | 105 | self.cooker = cooker |
107 | self.eventfile = eventfile | 106 | self.eventfile = eventfile |
108 | self.event_queue = [] | 107 | self.event_queue = [] |
109 | 108 | ||
110 | def write_event(self, event): | 109 | def write_variables(self): |
110 | with open(self.eventfile, "a") as f: | ||
111 | f.write("%s\n" % json.dumps({ "allvariables" : self.cooker.getAllKeysWithFlags(["doc", "func"])})) | ||
112 | |||
113 | def send(self, event): | ||
111 | with open(self.eventfile, "a") as f: | 114 | with open(self.eventfile, "a") as f: |
112 | try: | 115 | try: |
113 | str_event = codecs.encode(pickle.dumps(event), 'base64').decode('utf-8') | 116 | str_event = codecs.encode(pickle.dumps(event), 'base64').decode('utf-8') |
@@ -117,28 +120,6 @@ class EventWriter: | |||
117 | import traceback | 120 | import traceback |
118 | print(err, traceback.format_exc()) | 121 | print(err, traceback.format_exc()) |
119 | 122 | ||
120 | def send(self, event): | ||
121 | if self.file_inited: | ||
122 | # we have the file, just write the event | ||
123 | self.write_event(event) | ||
124 | else: | ||
125 | # init on bb.event.BuildStarted | ||
126 | name = "%s.%s" % (event.__module__, event.__class__.__name__) | ||
127 | if name in ("bb.event.BuildStarted", "bb.cooker.CookerExit"): | ||
128 | with open(self.eventfile, "w") as f: | ||
129 | f.write("%s\n" % json.dumps({ "allvariables" : self.cooker.getAllKeysWithFlags(["doc", "func"])})) | ||
130 | |||
131 | self.file_inited = True | ||
132 | |||
133 | # write pending events | ||
134 | for evt in self.event_queue: | ||
135 | self.write_event(evt) | ||
136 | |||
137 | # also write the current event | ||
138 | self.write_event(event) | ||
139 | else: | ||
140 | # queue all events until the file is inited | ||
141 | self.event_queue.append(event) | ||
142 | 123 | ||
143 | #============================================================================# | 124 | #============================================================================# |
144 | # BBCooker | 125 | # BBCooker |
@@ -416,6 +397,7 @@ class BBCooker: | |||
416 | def setupEventLog(self, eventlog): | 397 | def setupEventLog(self, eventlog): |
417 | if self.eventlog and self.eventlog[0] != eventlog: | 398 | if self.eventlog and self.eventlog[0] != eventlog: |
418 | bb.event.unregister_UIHhandler(self.eventlog[1]) | 399 | bb.event.unregister_UIHhandler(self.eventlog[1]) |
400 | self.eventlog = None | ||
419 | if not self.eventlog or self.eventlog[0] != eventlog: | 401 | if not self.eventlog or self.eventlog[0] != eventlog: |
420 | # we log all events to a file if so directed | 402 | # we log all events to a file if so directed |
421 | # register the log file writer as UI Handler | 403 | # register the log file writer as UI Handler |
@@ -423,7 +405,7 @@ class BBCooker: | |||
423 | bb.utils.mkdirhier(os.path.dirname(eventlog)) | 405 | bb.utils.mkdirhier(os.path.dirname(eventlog)) |
424 | writer = EventWriter(self, eventlog) | 406 | writer = EventWriter(self, eventlog) |
425 | EventLogWriteHandler = namedtuple('EventLogWriteHandler', ['event']) | 407 | EventLogWriteHandler = namedtuple('EventLogWriteHandler', ['event']) |
426 | self.eventlog = (eventlog, bb.event.register_UIHhandler(EventLogWriteHandler(writer))) | 408 | self.eventlog = (eventlog, bb.event.register_UIHhandler(EventLogWriteHandler(writer)), writer) |
427 | 409 | ||
428 | def updateConfigOpts(self, options, environment, cmdline): | 410 | def updateConfigOpts(self, options, environment, cmdline): |
429 | self.ui_cmdline = cmdline | 411 | self.ui_cmdline = cmdline |
@@ -1404,6 +1386,8 @@ class BBCooker: | |||
1404 | buildname = self.databuilder.mcdata[mc].getVar("BUILDNAME") | 1386 | buildname = self.databuilder.mcdata[mc].getVar("BUILDNAME") |
1405 | if fireevents: | 1387 | if fireevents: |
1406 | bb.event.fire(bb.event.BuildStarted(buildname, [item]), self.databuilder.mcdata[mc]) | 1388 | bb.event.fire(bb.event.BuildStarted(buildname, [item]), self.databuilder.mcdata[mc]) |
1389 | if self.eventlog: | ||
1390 | self.eventlog[2].write_variables() | ||
1407 | bb.event.enable_heartbeat() | 1391 | bb.event.enable_heartbeat() |
1408 | 1392 | ||
1409 | # Execute the runqueue | 1393 | # Execute the runqueue |
@@ -1547,6 +1531,8 @@ class BBCooker: | |||
1547 | 1531 | ||
1548 | for mc in self.multiconfigs: | 1532 | for mc in self.multiconfigs: |
1549 | bb.event.fire(bb.event.BuildStarted(buildname, ntargets), self.databuilder.mcdata[mc]) | 1533 | bb.event.fire(bb.event.BuildStarted(buildname, ntargets), self.databuilder.mcdata[mc]) |
1534 | if self.eventlog: | ||
1535 | self.eventlog[2].write_variables() | ||
1550 | bb.event.enable_heartbeat() | 1536 | bb.event.enable_heartbeat() |
1551 | 1537 | ||
1552 | rq = bb.runqueue.RunQueue(self, self.data, self.recipecaches, taskdata, runlist) | 1538 | rq = bb.runqueue.RunQueue(self, self.data, self.recipecaches, taskdata, runlist) |