From e77305d3dc7e89474b14f86b180fc0ac51db3678 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 30 Sep 2023 20:21:09 +0200 Subject: Update dependencies --- crates/driver/Cargo.toml | 8 ++++---- crates/driver/src/driver.rs | 21 ++++++++++++++------- crates/driver/src/main.rs | 2 +- crates/runner/Cargo.toml | 10 +++++----- crates/runner/src/jobserver.rs | 11 +++++++++-- crates/runner/src/lib.rs | 35 ++++++++++++++++++++--------------- crates/runner/src/util/unix.rs | 10 ++++------ 7 files changed, 57 insertions(+), 40 deletions(-) (limited to 'crates') diff --git a/crates/driver/Cargo.toml b/crates/driver/Cargo.toml index 9913a83..ecea8b8 100644 --- a/crates/driver/Cargo.toml +++ b/crates/driver/Cargo.toml @@ -11,15 +11,15 @@ edition = "2021" common = { path = "../common", package = "rebel-common" } runner = { path = "../runner", package = "rebel-runner" } -clap = "3.0.0-beta.2" +clap = { version = "4.0.0", features = ["derive"] } deb-version = "0.1.1" enum-kinds = "0.5.1" handlebars = "4.1.3" -indoc = "1.0.3" +indoc = "2.0.4" lazy_static = "1.4.0" -nix = "0.23.0" +nix = { version = "0.27.1", features = ["poll"] } nom = "7.1.0" scoped-tls-hkt = "0.1.2" serde = { version = "1", features = ["derive", "rc"] } -serde_yaml = "0.8" +serde_yaml = "0.9" walkdir = "2" diff --git a/crates/driver/src/driver.rs b/crates/driver/src/driver.rs index dfdd6e9..d0abbcb 100644 --- a/crates/driver/src/driver.rs +++ b/crates/driver/src/driver.rs @@ -349,17 +349,25 @@ impl<'ctx> Driver<'ctx> { } fn wait_for_task(&mut self) -> Result<()> { - let mut pollfds: Box<[_]> = self + let mut pollfds: Vec<_> = self .tasks_running - .keys() - .copied() - .map(|fd| poll::PollFd::new(fd, poll::PollFlags::POLLIN)) + .values() + .map(|(socket, _)| poll::PollFd::new(socket, poll::PollFlags::POLLIN)) .collect(); while poll::poll(&mut pollfds, -1).context("poll()")? == 0 {} - for pollfd in &*pollfds { - let events = pollfd.revents().expect("Unknown events in poll() return"); + let pollevents: Vec<_> = pollfds + .into_iter() + .map(|pollfd| { + ( + pollfd.as_fd().as_raw_fd(), + pollfd.revents().expect("Unknown events in poll() return"), + ) + }) + .collect(); + + for (fd, events) in pollevents { if !events.contains(poll::PollFlags::POLLIN) { if events.intersects(!poll::PollFlags::POLLIN) { return Err(Error::new( @@ -369,7 +377,6 @@ impl<'ctx> Driver<'ctx> { continue; } - let fd = pollfd.as_raw_fd(); let (socket, task_ref) = self.tasks_running.remove(&fd).unwrap(); let task_output = Runner::result(&socket)?; diff --git a/crates/driver/src/main.rs b/crates/driver/src/main.rs index ea97ee5..98aa10a 100644 --- a/crates/driver/src/main.rs +++ b/crates/driver/src/main.rs @@ -16,7 +16,7 @@ use clap::Parser; use runner::Runner; #[derive(Parser)] -#[clap(version = clap::crate_version!())] +#[clap(version, about)] struct Opts { /// Allow N jobs at once. /// Defaults to the number of available CPUs diff --git a/crates/runner/Cargo.toml b/crates/runner/Cargo.toml index 19ad124..bd1287e 100644 --- a/crates/runner/Cargo.toml +++ b/crates/runner/Cargo.toml @@ -11,15 +11,15 @@ edition = "2021" common = { path = "../common", package = "rebel-common" } bincode = "1.3.3" -blake3 = { version = "1.0.0", features = ["traits-preview"] } +blake3 = { version = "1.3.0", features = ["traits-preview"] } capctl = "0.2.0" -digest = "0.9.0" +digest = "0.10.1" libc = "0.2.84" -nix = "0.23.0" +nix = { version = "0.27.1", features = ["user", "fs", "process", "mount", "sched", "poll", "signal", "hostname"] } olpc-cjson = "0.1.0" serde = { version = "1", features = ["derive"] } serde_json = "1.0.62" tar = "0.4.32" -tee_readwrite = "0.1.0" -uds = "0.2.6" +tee_readwrite = "0.2.0" +uds = "0.4.1" walkdir = "2.3.2" diff --git a/crates/runner/src/jobserver.rs b/crates/runner/src/jobserver.rs index 3b6c856..d4c670c 100644 --- a/crates/runner/src/jobserver.rs +++ b/crates/runner/src/jobserver.rs @@ -1,4 +1,7 @@ -use std::{os::unix::prelude::RawFd, slice}; +use std::{ + os::{fd::BorrowedFd, unix::prelude::RawFd}, + slice, +}; use nix::{errno::Errno, fcntl::OFlag, poll, unistd}; @@ -27,10 +30,14 @@ impl Jobserver { Ok(Jobserver { tokens, r, w }) } + fn read_fd(&self) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(self.r) } + } + pub fn wait(&mut self) -> u8 { loop { poll::poll( - &mut [poll::PollFd::new(self.r, poll::PollFlags::POLLIN)], + &mut [poll::PollFd::new(&self.read_fd(), poll::PollFlags::POLLIN)], -1, ) .expect("poll()"); diff --git a/crates/runner/src/lib.rs b/crates/runner/src/lib.rs index cfaf658..308b54c 100644 --- a/crates/runner/src/lib.rs +++ b/crates/runner/src/lib.rs @@ -95,6 +95,10 @@ fn handle_socket(ctx: &mut RunnerContext) -> bool { true } +fn borrow_socket_fd(socket: &UnixSeqpacketConn) -> BorrowedFd<'_> { + unsafe { BorrowedFd::borrow_raw(socket.as_raw_fd()) } +} + fn runner(uid: Uid, gid: Gid, socket: UnixSeqpacketConn, _lockfile: File, options: &Options) -> ! { ns::mount_proc(); ns::setup_userns(Uid::from_raw(0), Gid::from_raw(0), uid, gid); @@ -117,35 +121,36 @@ fn runner(uid: Uid, gid: Gid, socket: UnixSeqpacketConn, _lockfile: File, option signals.add(signal::Signal::SIGCHLD); signal::pthread_sigmask(signal::SigmaskHow::SIG_BLOCK, Some(&signals), None) .expect("pthread_sigmask()"); - let mut sfd = SignalFd::with_flags(&signals, SfdFlags::SFD_CLOEXEC) + let mut signal_fd = SignalFd::with_flags(&signals, SfdFlags::SFD_CLOEXEC) .expect("Failed to create signal file descriptor"); - let mut pollfds = [ - poll::PollFd::new(sfd.as_raw_fd(), poll::PollFlags::POLLIN), - poll::PollFd::new(ctx.socket.as_raw_fd(), poll::PollFlags::POLLIN), - ]; - loop { + let socket_fd = borrow_socket_fd(&ctx.socket); + let mut pollfds = [ + poll::PollFd::new(&signal_fd, poll::PollFlags::POLLIN), + poll::PollFd::new(&socket_fd, poll::PollFlags::POLLIN), + ]; poll::poll(&mut pollfds, -1).expect("poll()"); - let events = pollfds[0] + let signal_events = pollfds[0] + .revents() + .expect("Unknown events in poll() return"); + let socket_events = pollfds[1] .revents() .expect("Unknown events in poll() return"); - if events.contains(poll::PollFlags::POLLIN) { - let _signal = sfd.read_signal().expect("read_signal()").unwrap(); + + if signal_events.contains(poll::PollFlags::POLLIN) { + let _signal = signal_fd.read_signal().expect("read_signal()").unwrap(); handle_sigchld(&mut ctx).expect("Task process exited abnormally"); - } else if events.intersects(!poll::PollFlags::POLLIN) { + } else if signal_events.intersects(!poll::PollFlags::POLLIN) { panic!("Unexpected error status for signal file descriptor"); } - let events = pollfds[1] - .revents() - .expect("Unknown events in poll() return"); - if events.contains(poll::PollFlags::POLLIN) { + if socket_events.contains(poll::PollFlags::POLLIN) { if !handle_socket(&mut ctx) { break; } - } else if events.intersects(!poll::PollFlags::POLLIN) { + } else if socket_events.intersects(!poll::PollFlags::POLLIN) { panic!("Unexpected error status for socket file descriptor"); } } diff --git a/crates/runner/src/util/unix.rs b/crates/runner/src/util/unix.rs index 710138c..c3e9ddb 100644 --- a/crates/runner/src/util/unix.rs +++ b/crates/runner/src/util/unix.rs @@ -11,9 +11,8 @@ use common::error::*; use super::fs; pub fn set_blocking(fd: RawFd, blocking: bool) -> Result<()> { - let flags = unsafe { - OFlag::from_bits_unchecked(fcntl::fcntl(fd, FcntlArg::F_GETFL).context("fcntl(F_GETFL)")?) - }; + let flags = + OFlag::from_bits_retain(fcntl::fcntl(fd, FcntlArg::F_GETFL).context("fcntl(F_GETFL)")?); let new_flags = if blocking { flags & !OFlag::O_NONBLOCK @@ -29,9 +28,8 @@ pub fn set_blocking(fd: RawFd, blocking: bool) -> Result<()> { } pub fn set_cloexec(fd: RawFd, cloexec: bool) -> Result<()> { - let flags = unsafe { - FdFlag::from_bits_unchecked(fcntl::fcntl(fd, FcntlArg::F_GETFD).context("fcntl(F_GETFD)")?) - }; + let flags = + FdFlag::from_bits_retain(fcntl::fcntl(fd, FcntlArg::F_GETFD).context("fcntl(F_GETFD)")?); let new_flags = if cloexec { flags | FdFlag::FD_CLOEXEC -- cgit v1.2.3