Reap prewarmed processes

This commit is contained in:
Kovid Goyal 2022-06-13 00:11:16 +05:30
parent 9fcb8e5b6e
commit e2efdf674d
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -45,6 +45,20 @@ class Child:
child_process_pid: int child_process_pid: int
def wait_for_child_death(child_pid: int, timeout: float = 1) -> Optional[int]:
st = time.monotonic()
while time.monotonic() - st < timeout:
try:
pid, status = os.waitpid(child_pid, os.WNOHANG)
except ChildProcessError:
return 0
else:
if pid == child_pid:
return status
time.sleep(0.01)
return None
class PrewarmProcess: class PrewarmProcess:
def __init__( def __init__(
@ -86,19 +100,10 @@ class PrewarmProcess:
self.from_worker.close() self.from_worker.close()
del self.from_worker del self.from_worker
if self.worker_pid > 0: if self.worker_pid > 0:
st = time.monotonic() if wait_for_child_death(self.worker_pid) is None:
while time.monotonic() - st < 1: log_error('Prewarm process failed to quite gracefully, killing it')
try: os.kill(self.worker_pid, signal.SIGKILL)
pid, status = os.waitpid(self.worker_pid, os.WNOHANG) os.waitpid(self.worker_pid, 0)
except ChildProcessError:
return
else:
if pid == self.worker_pid:
return
time.sleep(0.01)
log_error('Prewarm process failed to quite gracefully, killing it')
os.kill(self.worker_pid, signal.SIGKILL)
os.waitpid(self.worker_pid, 0)
def poll_to_send(self, yes: bool = True) -> None: def poll_to_send(self, yes: bool = True) -> None:
if yes: if yes:
@ -426,6 +431,7 @@ def main(stdin_fd: int, stdout_fd: int, notify_child_death_fd: int) -> None:
os.close(xfd) os.close(xfd)
dead_child_pid = child_id_map.pop(dead_child_id) dead_child_pid = child_id_map.pop(dead_child_id)
if dead_child_pid is not None: if dead_child_pid is not None:
wait_for_child_death(dead_child_pid)
child_death_buf += f'{dead_child_pid}\n'.encode() child_death_buf += f'{dead_child_pid}\n'.encode()
try: try: