summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/cooker.py
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2023-11-27 13:38:09 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-11-27 22:52:08 +0000
commit27f7ef2e44b6b5db309c7dd7c41454d0900740ff (patch)
treedbb6acc56d6ef97a537e0e30a7e96d69df23399e /bitbake/lib/bb/cooker.py
parent7943caf90cb667660682e5768123e6bd233e12db (diff)
downloadpoky-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.py36
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
103class EventWriter: 103class 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)