fix(watcher): enforce time limit by wall clock instead of RLIMIT_CPU - #311
Open
ZnPdCo wants to merge 4 commits into
Open
fix(watcher): enforce time limit by wall clock instead of RLIMIT_CPU#311ZnPdCo wants to merge 4 commits into
ZnPdCo wants to merge 4 commits into
Conversation
RLIMIT_CPU limits CPU time while the judge measures user time, and a program that merely sleeps never hits it, so a sleep-only program could run forever. The watcher now receives the extra wall-clock grace (argv[12], ms) from the main process and enforces timeLimit + extraTime with timerfd + pidfd (Linux) / kqueue (macOS), killing the child on timeout and reporting TLE. The sandbox stays in the main process (bwrap), which only keeps a 1s backstop against a hung watcher.
RLIMIT_CPU limits CPU time while the judge measures user time, and a program that merely sleeps never hits it, so a sleep-only program could run forever. The watcher now receives the extra wall-clock grace (argv[12], ms) from the main process and enforces timeLimit + extraTime with timerfd + pidfd (Linux) / kqueue (macOS & BSD), killing the child on timeout and reporting TLE. The sandbox stays in the main process (bwrap), which only keeps a 1s backstop against a hung watcher.
…m/ZnPdCo/Project_LemonLime into fix/watcher-wall-clock-time-limit
The watcher now waits for the child with clone3 + CLONE_PIDFD, which requires Linux 5.3+. Distros with older kernels (Ubuntu 18.04, Debian 10, Mint 19.3, Deepin 15.11, openSUSE Leap 15.1) can no longer run the watcher, so remove them from the tested list and keep NOI Linux 2 as the baseline.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
RLIMIT_CPU 限制 CPU time,而主程序仅测量 user time,这会导致部分程序提前结束运行。同时,
sleep这类没有产生 cpu time 的程序会显示成内部错误,不美观。现在 watcher 从主进程接收 extra wall-clock 限制,并使用 timerfd + pidfd 或 kqueue 来进行时间限制。超时后杀死子进程,并报告 TLE。
这个 pr 是 #306 的一个子 pr,由于 #306 进行的「沙箱移进 watcher」的重构仍待商榷,所以这里先把这个 bug 修复抽离出来。