From f4d002c615276caa5fc4eca5e7e034f9fd1883fc Mon Sep 17 00:00:00 2001 From: ppom Date: Tue, 5 Aug 2025 12:00:00 +0200 Subject: [PATCH] Fix trigger count on start schedule_exec was called before inserting the data in triggers, resulting in action count being set again after decrement in schedule exec. This could lead to: - trigger not disappearing after done - second action with no "after" not being run - ... --- src/daemon/filter/mod.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/daemon/filter/mod.rs b/src/daemon/filter/mod.rs index 7a6517e..c69a8b8 100644 --- a/src/daemon/filter/mod.rs +++ b/src/daemon/filter/mod.rs @@ -303,20 +303,24 @@ impl FilterManager { .collect::>(); for (m, map) in cloned_triggers.into_iter() { - let mut new_map = BTreeMap::default(); - for (t, remaining) in map.into_iter() { - if remaining > 0 && t + longuest_action_duration > now { - // Insert back the upcoming times - new_map.insert(t, number_of_actions); + let map: BTreeMap<_, _> = map + .into_iter() + // Keep only up-to-date triggers + .filter(|(t, remaining)| *remaining > 0 && *t + longuest_action_duration > now) + // Reset action count + .map(|(t, _)| (t, number_of_actions)) + .collect(); + + if map.is_empty() { + state.triggers.remove(&m); + } else { + let times = map.clone(); + state.triggers.insert(m.clone(), map); + for (t, _) in times { // Schedule the upcoming times self.schedule_exec(m.clone(), t, now, &mut state, true, false); } } - if new_map.is_empty() { - state.triggers.remove(&m); - } else { - state.triggers.insert(m, new_map); - } } } }