diff --git a/openpilot/starpilot/flm/live_tracking_bootstrap_producer.py b/openpilot/starpilot/flm/live_tracking_bootstrap_producer.py index ff4a3e6217..ed2f0126f2 100644 --- a/openpilot/starpilot/flm/live_tracking_bootstrap_producer.py +++ b/openpilot/starpilot/flm/live_tracking_bootstrap_producer.py @@ -321,6 +321,7 @@ class ResponseSnapshotProcess: if ctypes.CDLL(None).prctl(1, signal.SIGKILL, 0, 0, 0) != 0 or os.getppid() != parent: os._exit(1) os.sched_setscheduler(0, os.SCHED_OTHER, os.sched_param(0)) + os.nice(10) soft, hard = resource.getrlimit(resource.RLIMIT_CPU) limit = min([30] + [x for x in (soft, hard) if x >= 0]) resource.setrlimit(resource.RLIMIT_CPU, (limit, hard)) diff --git a/openpilot/starpilot/flm/tests/test_snapshot_priority.py b/openpilot/starpilot/flm/tests/test_snapshot_priority.py new file mode 100644 index 0000000000..b7173ae42f --- /dev/null +++ b/openpilot/starpilot/flm/tests/test_snapshot_priority.py @@ -0,0 +1,38 @@ +"""Frozen snapshot preparation stays below its normal-priority receiver.""" +import json +import subprocess +import sys + +import pytest + + +@pytest.mark.skipif(not sys.platform.startswith('linux'), reason='Production fork/scheduler path is Linux') +def test_actual_snapshot_child_runs_below_receiver_and_is_reaped(): + code = ''' +import json,os,resource,time +from openpilot.starpilot.flm.live_tracking_bootstrap_producer import ResponseSnapshotProcess +os.sched_setscheduler(0,os.SCHED_OTHER,os.sched_param(0)) +os.setpriority(os.PRIO_PROCESS,0,0) +job=ResponseSnapshotProcess() +try: + def prepare(): + return {'nice':os.getpriority(os.PRIO_PROCESS,0),'scheduler':os.sched_getscheduler(0), + 'cpu':resource.getrlimit(resource.RLIMIT_CPU)[0]} + stamp=time.monotonic_ns() + assert job.submit_preparation(prepare,token='priority-check',epoch=1,now_ns=stamp) + deadline=time.monotonic()+3 + result=None + while job.pid is not None and time.monotonic()