1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-30 12:29:55 +00:00

bitbake: bitbake-worker: Allow shutdown/database flush of pseudo server at task exit

We have a problem where pseudo server processes exist after bitbake exits
and hold the pseudo database in memory. In a docker container, the processes
will be killed as the container is destroyed with no warning and no opportunity
to write the data to disk. This leads to permissions/inode corruptions and
data loss.

Send a shutdown message to pseudo which in new versions of pseudo will flush
the database, thereby fixing some of the issues people using docker containers
see.

(Bitbake rev: a07a971b40acd3eee12e203d2cfa3e49f56109f6)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie
2021-09-25 10:39:16 +01:00
parent 2692037fec
commit eab1c2087f
+9 -1
View File
@@ -17,6 +17,8 @@ import signal
import pickle import pickle
import traceback import traceback
import queue import queue
import shlex
import subprocess
from multiprocessing import Lock from multiprocessing import Lock
from threading import Thread from threading import Thread
@@ -146,6 +148,7 @@ def fork_off_task(cfg, data, databuilder, workerdata, fn, task, taskname, taskha
# a fork() or exec*() activates PSEUDO... # a fork() or exec*() activates PSEUDO...
envbackup = {} envbackup = {}
fakeroot = False
fakeenv = {} fakeenv = {}
umask = None umask = None
@@ -165,6 +168,7 @@ def fork_off_task(cfg, data, databuilder, workerdata, fn, task, taskname, taskha
# We can't use the fakeroot environment in a dry run as it possibly hasn't been built # We can't use the fakeroot environment in a dry run as it possibly hasn't been built
if 'fakeroot' in taskdep and taskname in taskdep['fakeroot'] and not dry_run: if 'fakeroot' in taskdep and taskname in taskdep['fakeroot'] and not dry_run:
fakeroot = True
envvars = (workerdata["fakerootenv"][fn] or "").split() envvars = (workerdata["fakerootenv"][fn] or "").split()
for key, value in (var.split('=') for var in envvars): for key, value in (var.split('=') for var in envvars):
envbackup[key] = os.environ.get(key) envbackup[key] = os.environ.get(key)
@@ -283,7 +287,11 @@ def fork_off_task(cfg, data, databuilder, workerdata, fn, task, taskname, taskha
try: try:
if dry_run: if dry_run:
return 0 return 0
return bb.build.exec_task(fn, taskname, the_data, cfg.profile) ret = bb.build.exec_task(fn, taskname, the_data, cfg.profile)
if fakeroot:
fakerootcmd = shlex.split(the_data.getVar("FAKEROOTCMD"))
subprocess.run(fakerootcmd + ['-S'], check=True, stdout=subprocess.PIPE)
return ret
except: except:
os._exit(1) os._exit(1)
if not profiling: if not profiling: