mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-30 04:34:27 +00:00
agent: avoid reaping the exit signal of execute_hook in the reaper
Fixes: #1826 Signed-off-by: Tim Zhang <tim@hyper.sh>
This commit is contained in:
parent
979b73c35a
commit
a5bb383cf3
@ -48,6 +48,7 @@ use oci::State as OCIState;
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::os::unix::io::FromRawFd;
|
use std::os::unix::io::FromRawFd;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
use slog::{info, o, Logger};
|
use slog::{info, o, Logger};
|
||||||
|
|
||||||
@ -57,6 +58,7 @@ use crate::sync_with_async::{read_async, write_async};
|
|||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use rlimit::{setrlimit, Resource, Rlim};
|
use rlimit::{setrlimit, Resource, Rlim};
|
||||||
use tokio::io::AsyncBufReadExt;
|
use tokio::io::AsyncBufReadExt;
|
||||||
|
use tokio::sync::Mutex;
|
||||||
|
|
||||||
use crate::utils;
|
use crate::utils;
|
||||||
|
|
||||||
@ -106,6 +108,9 @@ pub type Config = CreateOpts;
|
|||||||
type NamespaceType = String;
|
type NamespaceType = String;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
|
// This locker ensures the child exit signal will be received by the right receiver.
|
||||||
|
pub static ref WAIT_PID_LOCKER: Arc<Mutex<bool>> = Arc::new(Mutex::new(false));
|
||||||
|
|
||||||
static ref NAMESPACES: HashMap<&'static str, CloneFlags> = {
|
static ref NAMESPACES: HashMap<&'static str, CloneFlags> = {
|
||||||
let mut m = HashMap::new();
|
let mut m = HashMap::new();
|
||||||
m.insert("user", CloneFlags::CLONE_NEWUSER);
|
m.insert("user", CloneFlags::CLONE_NEWUSER);
|
||||||
@ -1465,6 +1470,8 @@ async fn execute_hook(logger: &Logger, h: &Hook, st: &OCIState) -> Result<()> {
|
|||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
// Avoid the exit signal to be reaped by the global reaper.
|
||||||
|
let _wait_locker = WAIT_PID_LOCKER.lock().await;
|
||||||
let mut child = tokio::process::Command::new(path)
|
let mut child = tokio::process::Command::new(path)
|
||||||
.args(args.iter())
|
.args(args.iter())
|
||||||
.envs(env.iter())
|
.envs(env.iter())
|
||||||
|
@ -22,6 +22,9 @@ async fn handle_sigchild(logger: Logger, sandbox: Arc<Mutex<Sandbox>>) -> Result
|
|||||||
info!(logger, "handling signal"; "signal" => "SIGCHLD");
|
info!(logger, "handling signal"; "signal" => "SIGCHLD");
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
// Avoid reaping the undesirable child's signal, e.g., execute_hook's
|
||||||
|
// The lock should be released immediately.
|
||||||
|
rustjail::container::WAIT_PID_LOCKER.lock().await;
|
||||||
let result = wait::waitpid(
|
let result = wait::waitpid(
|
||||||
Some(Pid::from_raw(-1)),
|
Some(Pid::from_raw(-1)),
|
||||||
Some(WaitPidFlag::WNOHANG | WaitPidFlag::__WALL),
|
Some(WaitPidFlag::WNOHANG | WaitPidFlag::__WALL),
|
||||||
|
Loading…
Reference in New Issue
Block a user