[pdm-devel] [PATCH proxmox-datacenter-manager 18/25] metric collection: periodically clean removed remotes from statefile
Lukas Wagner
l.wagner at proxmox.com
Tue Feb 11 13:05:34 CET 2025
Adding and removing remotes can leave leftover data in the statefile,
hence it makes sense to clean it up periodically.
Signed-off-by: Lukas Wagner <l.wagner at proxmox.com>
---
.../src/metric_collection/collection_task.rs | 10 ++++--
server/src/metric_collection/state.rs | 32 +++++++++++++++++++
2 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/server/src/metric_collection/collection_task.rs b/server/src/metric_collection/collection_task.rs
index 501df9b..7475368 100644
--- a/server/src/metric_collection/collection_task.rs
+++ b/server/src/metric_collection/collection_task.rs
@@ -96,11 +96,11 @@ impl MetricCollectionTask {
self.sleep_for_random_interval_offset().await;
if let Some(remotes) = Self::load_remote_config() {
- let to_fetch = remotes.order.as_slice();
- self.fetch_remotes(&remotes, to_fetch).await;
+ self.cleanup_removed_remotes_from_state(&remotes);
let now = Instant::now();
- self.fetch_remotes(&remotes, &remotes.order).await;
+ let to_fetch = remotes.order.as_slice();
+ self.fetch_remotes(&remotes, to_fetch).await;
let elapsed = now.elapsed();
if let Err(err) = self.metric_data_tx.send(
@@ -196,6 +196,10 @@ impl MetricCollectionTask {
tokio::time::sleep(Duration::from_millis(jitter)).await;
}
+ fn cleanup_removed_remotes_from_state(&mut self, remotes: &SectionConfigData<Remote>) {
+ self.state.retain(|remote| remotes.get(remote).is_some());
+ }
+
fn get_settings_or_default() -> CollectionSettings {
// This function is a bit odd, but not sure if there is a much nicer
// way to do it. We want to fall back to defaults if
diff --git a/server/src/metric_collection/state.rs b/server/src/metric_collection/state.rs
index a9f712d..2e90a4a 100644
--- a/server/src/metric_collection/state.rs
+++ b/server/src/metric_collection/state.rs
@@ -76,6 +76,11 @@ impl MetricCollectionState {
Ok(())
}
+ /// Retain all remotes for which the predicate holds.
+ pub fn retain(&mut self, check: impl Fn(&str) -> bool) {
+ self.state.remote_status.retain(|remote, _| check(remote));
+ }
+
fn load_or_default(path: &Path) -> Result<State, Error> {
let content = proxmox_sys::fs::file_read_optional_string(path)?;
@@ -117,4 +122,31 @@ mod tests {
Ok(())
}
+
+ #[test]
+ fn test_retain() -> Result<(), Error> {
+ let file = NamedTempFile::new(get_create_options())?;
+ let options = get_create_options();
+ let mut state = MetricCollectionState::new(file.path().into(), options.clone());
+
+ state.set_status(
+ "remote-1".into(),
+ RemoteStatus {
+ ..Default::default()
+ },
+ );
+ state.set_status(
+ "remote-2".into(),
+ RemoteStatus {
+ ..Default::default()
+ },
+ );
+
+ state.retain(|remote| remote == "remote-1");
+
+ assert!(state.get_status("remote-1").is_some());
+ assert!(state.get_status("remote-2").is_none());
+
+ Ok(())
+ }
}
--
2.39.5
More information about the pdm-devel
mailing list