[pdm-devel] [PATCH proxmox-datacenter-manager v2 18/28] metric collection: periodically clean removed remotes from statefile
Lukas Wagner
l.wagner at proxmox.com
Fri Feb 14 14:06:43 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 | 6 ++++
server/src/metric_collection/state.rs | 32 +++++++++++++++++++
2 files changed, 38 insertions(+)
diff --git a/server/src/metric_collection/collection_task.rs b/server/src/metric_collection/collection_task.rs
index 60c62c87..2ea735c5 100644
--- a/server/src/metric_collection/collection_task.rs
+++ b/server/src/metric_collection/collection_task.rs
@@ -98,6 +98,8 @@ impl MetricCollectionTask {
).await;
if let Some(remotes) = Self::load_remote_config() {
+ self.cleanup_removed_remotes_from_state(&remotes);
+
let now = Instant::now();
let to_fetch = remotes.order.as_slice();
self.fetch_remotes(&remotes, to_fetch).await;
@@ -177,6 +179,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 {
// We want to fall back to defaults if
// - the config file does not exist (no error should be logged)
diff --git a/server/src/metric_collection/state.rs b/server/src/metric_collection/state.rs
index 86375a65..a8d49e5d 100644
--- a/server/src/metric_collection/state.rs
+++ b/server/src/metric_collection/state.rs
@@ -74,6 +74,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)?;
@@ -115,4 +120,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