diff options
| author | akbash <akbash@herdr.dev> | 2026-08-25 01:08:36 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-08-25 01:08:36 +0300 |
| commit | cafd9e5dd0e59ecc7551ae066c737f23573460a7 (patch) | |
| tree | 82ff1bbf5703f06c906bc22a783a2f18366f73d1 /src/detect/manifest.rs | |
| parent | 7d56b4c51b046a5d477439bcea4512339f8841aa (diff) | |
fix: refresh shared agent manifest caches (#3204)
refs #2711
Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Diffstat (limited to 'src/detect/manifest.rs')
| -rw-r--r-- | src/detect/manifest.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/detect/manifest.rs b/src/detect/manifest.rs index b9fe786a..5e226ece 100644 --- a/src/detect/manifest.rs +++ b/src/detect/manifest.rs @@ -284,6 +284,36 @@ pub(crate) fn reload_manifests() -> Vec<AgentManifestSummary> { summaries } +pub(crate) fn reload_manifests_for_agents(agents: &[Agent]) { + if agents.is_empty() { + return; + } + + let _reload_guard = MANIFEST_RELOAD_LOCK + .get_or_init(|| Mutex::new(())) + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + let lock = manifest_cache(); + let replacements = Agent::SCREEN_MANIFEST_AGENTS + .into_iter() + .filter(|agent| agents.contains(agent)) + .map(|agent| (agent, load_manifest_uncached(agent))) + .collect::<Vec<_>>(); + let mut cache = match lock.write() { + Ok(guard) => guard, + Err(poisoned) => poisoned.into_inner(), + }; + for (agent, replacement) in replacements { + if let Some((_, loaded)) = cache + .manifests + .iter_mut() + .find(|(cached_agent, _)| *cached_agent == agent) + { + *loaded = replacement; + } + } +} + fn manifest_cache() -> &'static RwLock<ManifestCache> { MANIFEST_CACHE.get_or_init(|| RwLock::new(build_manifest_cache())) } |
