From a2528a13dfba06efb7cd49bc4822ff40e4cab18a Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Thu, 9 Dec 2021 19:58:44 -0700 Subject: [PATCH] correctly handle self as current dependent --- appmgr/src/config/mod.rs | 7 ++++--- appmgr/src/dependencies.rs | 11 ++++++----- appmgr/src/install/cleanup.rs | 4 ++-- appmgr/src/install/mod.rs | 10 +++++++--- appmgr/src/install/update.rs | 2 ++ 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/appmgr/src/config/mod.rs b/appmgr/src/config/mod.rs index 6bb875046..c9ea582c0 100644 --- a/appmgr/src/config/mod.rs +++ b/appmgr/src/config/mod.rs @@ -18,7 +18,7 @@ use crate::context::RpcContext; use crate::db::model::CurrentDependencyInfo; use crate::db::util::WithRevision; use crate::dependencies::{ - break_transitive, heal_all_dependents_transitive, update_current_dependents, BreakageRes, + add_current_dependents, break_transitive, heal_all_dependents_transitive, BreakageRes, DependencyError, DependencyErrors, TaggedDependencyError, }; use crate::install::cleanup::remove_current_dependents; @@ -435,10 +435,11 @@ pub fn configure_rec<'a, Db: DbHandle>( // update dependencies let mut deps = pkg_model.clone().current_dependencies().get_mut(db).await?; - remove_current_dependents(db, id, deps.keys()).await?; + remove_current_dependents(db, id, deps.keys()).await?; // remove previous + add_current_dependents(db, id, ¤t_dependencies).await?; // add new + current_dependencies.remove(id); *deps = current_dependencies.clone(); deps.save(db).await?; - update_current_dependents(db, id, ¤t_dependencies).await?; let mut errs = pkg_model .clone() .status() diff --git a/appmgr/src/dependencies.rs b/appmgr/src/dependencies.rs index 585766b51..1a30b7c8b 100644 --- a/appmgr/src/dependencies.rs +++ b/appmgr/src/dependencies.rs @@ -649,7 +649,7 @@ pub async fn configure_logic( } #[instrument(skip(db, current_dependencies))] -pub async fn update_current_dependents< +pub async fn add_current_dependents< 'a, Db: DbHandle, I: IntoIterator, @@ -658,10 +658,7 @@ pub async fn update_current_dependents< dependent_id: &PackageId, current_dependencies: I, ) -> Result<(), Error> { - for (dependency, dep_info) in current_dependencies - .into_iter() - .filter(|(dependency, _)| dependency != &dependent_id) - { + for (dependency, dep_info) in current_dependencies { if let Some(dependency_model) = crate::db::DatabaseModel::new() .package_data() .idx_model(&dependency) @@ -745,6 +742,8 @@ pub async fn break_all_dependents_transitive<'a, Db: DbHandle>( .current_dependents() .keys(db, true) .await? + .into_iter() + .filter(|dependent| id != dependent) { break_transitive(db, &dependent, id, error.clone(), breakages).await?; } @@ -821,6 +820,8 @@ pub async fn heal_all_dependents_transitive<'a, Db: DbHandle>( .current_dependents() .keys(db, true) .await? + .into_iter() + .filter(|dependent| id != dependent) { heal_transitive(ctx, db, &dependent, id).await?; } diff --git a/appmgr/src/install/cleanup.rs b/appmgr/src/install/cleanup.rs index 99ec32e52..c3e724cc2 100644 --- a/appmgr/src/install/cleanup.rs +++ b/appmgr/src/install/cleanup.rs @@ -197,10 +197,10 @@ pub async fn cleanup_failed( #[instrument(skip(db, current_dependencies))] pub async fn remove_current_dependents<'a, Db: DbHandle, I: IntoIterator>( db: &mut Db, - id: &PackageId, + id: &'a PackageId, current_dependencies: I, ) -> Result<(), Error> { - for dep in current_dependencies { + for dep in current_dependencies.into_iter().chain(std::iter::once(id)) { if let Some(current_dependents) = crate::db::DatabaseModel::new() .package_data() .idx_model(dep) diff --git a/appmgr/src/install/mod.rs b/appmgr/src/install/mod.rs index deefb8590..8a8756bc5 100644 --- a/appmgr/src/install/mod.rs +++ b/appmgr/src/install/mod.rs @@ -23,7 +23,7 @@ use tokio::process::Command; use tokio_stream::wrappers::ReadDirStream; use tracing::instrument; -use self::cleanup::cleanup_failed; +use self::cleanup::{cleanup_failed, remove_current_dependents}; use crate::context::{CliContext, RpcContext}; use crate::core::rpc_continuations::{RequestGuid, RpcContinuation}; use crate::db::model::{ @@ -32,7 +32,7 @@ use crate::db::model::{ }; use crate::db::util::WithRevision; use crate::dependencies::{ - break_all_dependents_transitive, update_current_dependents, BreakageRes, DependencyError, + add_current_dependents, break_all_dependents_transitive, BreakageRes, DependencyError, DependencyErrors, }; use crate::install::cleanup::{cleanup, update_dependents}; @@ -853,7 +853,6 @@ pub async fn install_s9pk( } }) .collect(); - update_current_dependents(&mut tx, pkg_id, ¤t_dependencies).await?; let current_dependents = { // search required dependencies let mut deps = BTreeMap::new(); @@ -997,6 +996,8 @@ pub async fn install_s9pk( *main_status = prev.status.main; main_status.save(&mut tx).await?; } + remove_current_dependents(&mut tx, pkg_id, prev.current_dependencies.keys()).await?; // remove previous + add_current_dependents(&mut tx, pkg_id, ¤t_dependencies).await?; // add new update_dependents( ctx, &mut tx, @@ -1023,6 +1024,7 @@ pub async fn install_s9pk( &manifest.volumes, ) .await?; + add_current_dependents(&mut tx, pkg_id, ¤t_dependencies).await?; update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?; } else if let Some(recovered) = crate::db::DatabaseModel::new() .recovered_packages() @@ -1032,8 +1034,10 @@ pub async fn install_s9pk( .into_owned() { handle_recovered_package(recovered, manifest, ctx, pkg_id, version, &mut tx).await?; + add_current_dependents(&mut tx, pkg_id, ¤t_dependencies).await?; update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?; } else { + add_current_dependents(&mut tx, pkg_id, ¤t_dependencies).await?; update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?; } diff --git a/appmgr/src/install/update.rs b/appmgr/src/install/update.rs index 9e3a35d62..9183926d2 100644 --- a/appmgr/src/install/update.rs +++ b/appmgr/src/install/update.rs @@ -37,6 +37,8 @@ pub async fn dry( .current_dependents() .keys(&mut tx, true) .await? + .into_iter() + .filter(|dependent| &id != dependent) { let version_req = crate::db::DatabaseModel::new() .package_data()