aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2023-01-11 16:09:22 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-01-11 23:15:37 +0000
commit0f9a0c7853b181817bf01863a26da21412376294 (patch)
tree21613f9278dacb2c760d468debce046a88fef460
parent412a6d8701a92efe4dd6db8ec713c0013f7db64d (diff)
downloadbitbake-contrib-0f9a0c7853b181817bf01863a26da21412376294.tar.gz
server/process: Move heartbeat to idle thread
Rather than risk the heartbeat event code locking up the server control socket, handle it in the 'idle' thread with the other work. The aim is to remove it as a possible issue with some ongoing hangs. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/server/process.py44
1 files changed, 22 insertions, 22 deletions
diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py
index a25f04d14..529196b78 100644
--- a/lib/bb/server/process.py
+++ b/lib/bb/server/process.py
@@ -439,6 +439,28 @@ class ProcessServer():
serverlog("Exception %s broke the idle_thread, exiting" % traceback.format_exc())
self.quit = True
+ # Create new heartbeat event?
+ now = time.time()
+ 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
+ if self.next_heartbeat <= now:
+ self.next_heartbeat = now + self.heartbeat_seconds
+ if hasattr(self.cooker, "data"):
+ heartbeat = bb.event.HeartbeatEvent(now)
+ try:
+ bb.event.fire(heartbeat, self.cooker.data)
+ except Exception as exc:
+ if not isinstance(exc, bb.BBHandledException):
+ logger.exception('Running heartbeat function')
+ serverlog("Exception %s broke in idle_thread, exiting" % traceback.format_exc())
+ self.quit = True
+ 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
+
if nextsleep is not None:
select.select(fds,[],[],nextsleep)[0]
@@ -451,28 +473,6 @@ class ProcessServer():
self.idle = threading.Thread(target=self.idle_thread)
self.idle.start()
- # Create new heartbeat event?
- now = time.time()
- 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
- if self.next_heartbeat <= now:
- self.next_heartbeat = now + self.heartbeat_seconds
- if hasattr(self.cooker, "data"):
- heartbeat = bb.event.HeartbeatEvent(now)
- try:
- bb.event.fire(heartbeat, self.cooker.data)
- except Exception as exc:
- if not isinstance(exc, bb.BBHandledException):
- logger.exception('Running heartbeat function')
- serverlog("Exception %s broke in idle_commands, exiting" % traceback.format_exc())
- self.quit = True
- 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
-
if nextsleep is not None:
if self.xmlrpc:
nextsleep = self.xmlrpc.get_timeout(nextsleep)