aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2022-12-20 14:17:49 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2022-12-30 21:38:13 +0000
commit8c36c90afc392980d999a981a924dc7d22e2766e (patch)
treef4ccc0ccd4ae8f002804bf99b5ab6c529fe7a423 /lib
parent2d0940b920a22b244f3ba6849c7cd019578386b4 (diff)
downloadbitbake-8c36c90afc392980d999a981a924dc7d22e2766e.tar.gz
event: Add enable/disable heartbeat code
Currently heartbeat events are always generated by the server whilst it is active. Change this so they only appear when builds are running, which is when most code would expect to be executed. This removes a number of races around changes in the datastore which can happen outside of builds. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/bb/cooker.py4
-rw-r--r--lib/bb/event.py9
-rw-r--r--lib/bb/server/process.py4
3 files changed, 15 insertions, 2 deletions
diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py
index 4e49b0e90..c71274438 100644
--- a/lib/bb/cooker.py
+++ b/lib/bb/cooker.py
@@ -1467,6 +1467,7 @@ class BBCooker:
buildname = self.databuilder.mcdata[mc].getVar("BUILDNAME")
if fireevents:
bb.event.fire(bb.event.BuildStarted(buildname, [item]), self.databuilder.mcdata[mc])
+ bb.event.enable_heartbeat()
# Execute the runqueue
runlist = [[mc, item, task, fn]]
@@ -1500,6 +1501,7 @@ class BBCooker:
if not retval:
if fireevents:
bb.event.fire(bb.event.BuildCompleted(len(rq.rqdata.runtaskentries), buildname, item, failures, interrupted), self.databuilder.mcdata[mc])
+ bb.event.disable_heartbeat()
self.command.finishAsyncCommand(msg)
# We trashed self.recipecaches above
self.parsecache_valid = False
@@ -1545,6 +1547,7 @@ class BBCooker:
for mc in self.multiconfigs:
bb.event.fire(bb.event.BuildCompleted(len(rq.rqdata.runtaskentries), buildname, targets, failures, interrupted), self.databuilder.mcdata[mc])
finally:
+ bb.event.disable_heartbeat()
self.command.finishAsyncCommand(msg)
return False
if retval is True:
@@ -1578,6 +1581,7 @@ class BBCooker:
for mc in self.multiconfigs:
bb.event.fire(bb.event.BuildStarted(buildname, ntargets), self.databuilder.mcdata[mc])
+ bb.event.enable_heartbeat()
rq = bb.runqueue.RunQueue(self, self.data, self.recipecaches, taskdata, runlist)
if 'universe' in targets:
diff --git a/lib/bb/event.py b/lib/bb/event.py
index 303b7a943..db9072444 100644
--- a/lib/bb/event.py
+++ b/lib/bb/event.py
@@ -69,6 +69,7 @@ _eventfilter = None
_uiready = False
_thread_lock = threading.Lock()
_thread_lock_enabled = False
+_heartbeat_enabled = False
def enable_threadlock():
global _thread_lock_enabled
@@ -78,6 +79,14 @@ def disable_threadlock():
global _thread_lock_enabled
_thread_lock_enabled = False
+def enable_heartbeat():
+ global _heartbeat_enabled
+ _heartbeat_enabled = True
+
+def disable_heartbeat():
+ global _heartbeat_enabled
+ _heartbeat_enabled = False
+
def execute_handler(name, handler, event, d):
event.data = d
try:
diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py
index 586d46af8..91eb6e0ad 100644
--- a/lib/bb/server/process.py
+++ b/lib/bb/server/process.py
@@ -382,7 +382,7 @@ class ProcessServer():
# Create new heartbeat event?
now = time.time()
- if now >= self.next_heartbeat:
+ if bb.event._heartbeat_enabled and now >= self.next_heartbeat:
# We might have missed heartbeats. Just trigger once in
# that case and continue after the usual delay.
self.next_heartbeat += self.heartbeat_seconds
@@ -396,7 +396,7 @@ class ProcessServer():
if not isinstance(exc, bb.BBHandledException):
logger.exception('Running heartbeat function')
self.quit = True
- if nextsleep and now + nextsleep > self.next_heartbeat:
+ if nextsleep and bb.event._heartbeat_enabled and now + nextsleep > self.next_heartbeat:
# Shorten timeout so that we we wake up in time for
# the heartbeat.
nextsleep = self.next_heartbeat - now