From ca4d77ecd2f0335fd2385d5838a290ca2e2943f4 Mon Sep 17 00:00:00 2001 From: "(null)" Date: Mon, 24 Jul 2023 02:09:54 -0400 Subject: [PATCH] fix purge --- pty_process/src/kqueue_forwarder.rs | 11 +++++------ xc-bin/src/main.rs | 2 +- xc/src/container/process.rs | 3 ++- xc/src/container/runner/mod.rs | 8 ++++++-- xcd/src/context/mod.rs | 10 +++++++++- xcd/src/ipc.rs | 4 +++- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/pty_process/src/kqueue_forwarder.rs b/pty_process/src/kqueue_forwarder.rs index 79cd7a0..346356a 100644 --- a/pty_process/src/kqueue_forwarder.rs +++ b/pty_process/src/kqueue_forwarder.rs @@ -63,11 +63,10 @@ impl PtyForwarder { listener: UnixListener, mut command: Command, output_log: W, - ) -> PtyForwarder { - let pty_result = openpty(None, None).unwrap(); - let maybe_child = command.pty(&pty_result).spawn(); - let child = maybe_child.unwrap(); - PtyForwarder { + ) -> std::io::Result> { + let pty_result = openpty(None, None)?; + let child = command.pty(&pty_result).spawn()?; + Ok(PtyForwarder { child, listener, clients: Vec::new(), @@ -75,7 +74,7 @@ impl PtyForwarder { ingress: Vec::new(), egress: Buffer::new(), output_log, - } + }) } pub fn pid(&self) -> u32 { diff --git a/xc-bin/src/main.rs b/xc-bin/src/main.rs index 7195ecc..14b5a14 100644 --- a/xc-bin/src/main.rs +++ b/xc-bin/src/main.rs @@ -935,7 +935,7 @@ fn main() -> Result<(), ActionError> { _ = attach::run(socket); } let exit = n.notified_sync_take_value(); - std::process::exit(exit.unwrap_or(1) as i32) + std::process::exit(exit.unwrap_or(2) as i32 - 1) } } }; diff --git a/xc/src/container/process.rs b/xc/src/container/process.rs index 32ff7e8..ae0030d 100644 --- a/xc/src/container/process.rs +++ b/xc/src/container/process.rs @@ -158,7 +158,8 @@ pub(super) fn spawn_process_pty( .map_err(|err| ExecError::CannotOpenLogFile(log_path_str.to_string(), err))?; let listener = std::os::unix::net::UnixListener::bind(socket_path.as_ref()) .map_err(ExecError::CannotBindUnixSocket)?; - let forwarder = PtyForwarder::from_command(listener, cmd, file); + let forwarder = + PtyForwarder::from_command(listener, cmd, file).map_err(ExecError::CannotSpawn)?; let pid = forwarder.pid(); std::thread::spawn(move || { // XXX diff --git a/xc/src/container/runner/mod.rs b/xc/src/container/runner/mod.rs index 5b27b52..d425077 100644 --- a/xc/src/container/runner/mod.rs +++ b/xc/src/container/runner/mod.rs @@ -72,7 +72,9 @@ impl ProcessRunnerStat { true }); if let Some(notify) = &self.exit_notify { - notify.clone().notify_waiters_with_value(exit_code as u64); + notify + .clone() + .notify_waiters_with_value(exit_code as u64 + 1); } } @@ -87,7 +89,9 @@ impl ProcessRunnerStat { .borrow() .exit_code .expect("The entire tree exited but not the process itself?!"); - notify.clone().notify_waiters_with_value(exit_code as u64); + notify + .clone() + .notify_waiters_with_value(exit_code as u64 + 1); } } } diff --git a/xcd/src/context/mod.rs b/xcd/src/context/mod.rs index b27fb00..215dfad 100644 --- a/xcd/src/context/mod.rs +++ b/xcd/src/context/mod.rs @@ -199,6 +199,8 @@ impl ServerContext { // XXX: Potential race condition when trying to import/commit/pull images during purge pub(crate) async fn purge_images(&self) -> anyhow::Result<()> { + info!("begin purge"); + let config = self.config(); let layers_dir = &config.layers_dir; let im = self.image_manager.read().await; @@ -231,6 +233,8 @@ impl ServerContext { .and_then(|s| s.parse::().ok()) }); + // eprintln!("chain_ids: {chain_ids:#?}"); + let mut file_set: std::collections::HashSet = std::collections::HashSet::from_iter(files.into_iter()); let mut chain_id_set: std::collections::HashSet = @@ -250,6 +254,7 @@ impl ServerContext { } if !chain_id_set.is_empty() { if let Some(cid) = record.manifest.chain_id() { + info!("keep: {cid}, wanted by: {}:{}", record.name, record.tag); chain_id_set.remove(&cid); let props = zfs.get_props(format!("{}/{cid}", config.image_dataset))?; let mut origin_chain = None; @@ -259,6 +264,7 @@ impl ServerContext { .split_once('@') .and_then(|(_, c)| ChainId::from_str(c).ok()) { + info!("keep: {c}, referenced by {cid}"); chain_id_set.remove(&c); origin_chain = Some(c); } @@ -271,14 +277,16 @@ impl ServerContext { } for garbage in file_set.iter() { + info!("removing orphaned layer: {garbage}"); std::fs::remove_file(format!("{layers_dir}/{garbage}"))?; } for chain_id in chain_id_set.iter() { + info!("destroying ZFS dataset: {chain_id}"); _ = zfs.destroy( format!("{}/{chain_id}", config.image_dataset), false, - false, + true, false, ); } diff --git a/xcd/src/ipc.rs b/xcd/src/ipc.rs index 7812641..af04639 100644 --- a/xcd/src/ipc.rs +++ b/xcd/src/ipc.rs @@ -513,7 +513,9 @@ async fn purge( local_context: &mut ConnectionContext, request: (), ) -> GenericResult<()> { - context.read().await.purge_images().await.unwrap(); + if let Err(error) = context.read().await.purge_images().await { + error!("purge error: {error:#?}"); + } Ok(()) } #[derive(Serialize, Deserialize, Debug)]