mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-29 12:14:48 +00:00
agent: allow multiple wait on the same process
Until a container is deleted, agent should allow runtime to wait for a process in parallel, as being supported by the go agent. Signed-off-by: Peng Tao <bergwolf@hyper.sh>
This commit is contained in:
parent
6487044fa1
commit
22876b2da6
@ -7,6 +7,7 @@
|
||||
use libc::pid_t;
|
||||
use std::fs::File;
|
||||
use std::os::unix::io::RawFd;
|
||||
use std::sync::mpsc::Sender;
|
||||
|
||||
// use crate::configs::{Capabilities, Rlimit};
|
||||
// use crate::cgroups::Manager as CgroupManager;
|
||||
@ -45,6 +46,7 @@ pub struct Process {
|
||||
pub pid: pid_t,
|
||||
|
||||
pub exit_code: i32,
|
||||
pub exit_watchers: Vec<Sender<i32>>,
|
||||
pub oci: OCIProcess,
|
||||
pub logger: Logger,
|
||||
}
|
||||
@ -95,6 +97,7 @@ impl Process {
|
||||
init,
|
||||
pid: -1,
|
||||
exit_code: 0,
|
||||
exit_watchers: Vec::new(),
|
||||
oci: ocip.clone(),
|
||||
logger: logger.clone(),
|
||||
};
|
||||
|
@ -4,6 +4,7 @@
|
||||
//
|
||||
|
||||
use std::path::Path;
|
||||
use std::sync::mpsc::{channel, Sender};
|
||||
use std::sync::{Arc, Mutex};
|
||||
use ttrpc;
|
||||
|
||||
@ -365,6 +366,7 @@ impl agentService {
|
||||
let pid: pid_t;
|
||||
let mut exit_pipe_r: RawFd = -1;
|
||||
let mut buf: Vec<u8> = vec![0, 1];
|
||||
let (exit_send, exit_recv) = channel();
|
||||
|
||||
info!(
|
||||
sl!(),
|
||||
@ -382,6 +384,7 @@ impl agentService {
|
||||
exit_pipe_r = p.exit_pipe_r.unwrap();
|
||||
}
|
||||
|
||||
p.exit_watchers.push(exit_send);
|
||||
pid = p.pid;
|
||||
}
|
||||
|
||||
@ -398,9 +401,16 @@ impl agentService {
|
||||
}
|
||||
};
|
||||
|
||||
// need to close all fds
|
||||
let mut p = ctr.processes.get_mut(&pid).unwrap();
|
||||
let mut p = match ctr.processes.get_mut(&pid) {
|
||||
Some(p) => p,
|
||||
None => {
|
||||
// Lost race, pick up exit code from channel
|
||||
resp.status = exit_recv.recv().unwrap();
|
||||
return Ok(resp);
|
||||
}
|
||||
};
|
||||
|
||||
// need to close all fds
|
||||
if p.parent_stdin.is_some() {
|
||||
let _ = unistd::close(p.parent_stdin.unwrap());
|
||||
}
|
||||
@ -427,6 +437,11 @@ impl agentService {
|
||||
p.term_master = None;
|
||||
|
||||
resp.status = p.exit_code;
|
||||
// broadcast exit code to all parallel watchers
|
||||
for s in p.exit_watchers.iter() {
|
||||
// Just ignore errors in case any watcher quits unexpectedly
|
||||
let _ = s.send(p.exit_code);
|
||||
}
|
||||
|
||||
ctr.processes.remove(&pid);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user