p2p_chat/sync/engine/discovery/queries/
maintenance.rs

1//! This module contains maintenance-related query logic for the synchronization engine's
2//! discovery process.
3use crate::sync::engine::SyncEngine;
4use libp2p::kad;
5use std::time::Duration;
6use tracing::trace;
7
8impl SyncEngine {
9    /// Cleans up stale DHT queries from the pending list.
10    ///
11    /// Queries older than a defined `stale_timeout` are removed. This also triggers
12    /// a cleanup of old entries in the backoff manager.
13    pub(crate) fn cleanup_stale_dht_queries(&mut self) {
14        let stale_timeout = Duration::from_secs(10);
15        let mut stale_queries = Vec::new();
16
17        for (&query_id, query_state) in &self.pending_dht_queries {
18            if query_state.started_at.elapsed() > stale_timeout {
19                stale_queries.push(query_id);
20            }
21        }
22
23        for query_id in stale_queries {
24            if let Some(query_state) = self.pending_dht_queries.remove(&query_id) {
25                trace!(
26                    "Removing stale DHT query {:?} (age: {:?}, received_results: {})",
27                    query_id,
28                    query_state.started_at.elapsed(),
29                    query_state.received_results
30                );
31            }
32        }
33
34        self.backoff_manager
35            .cleanup_old_entries(Duration::from_secs(3600));
36    }
37
38    /// Checks if there is a pending DHT query for a specific key.
39    ///
40    /// # Arguments
41    ///
42    /// * `key` - The `kad::RecordKey` to check for.
43    ///
44    /// # Returns
45    ///
46    /// `true` if a pending query exists for the key, `false` otherwise.
47    pub(crate) fn has_pending_query_for(&self, key: &kad::RecordKey) -> bool {
48        self.pending_dht_queries
49            .values()
50            .any(|state| state.key == *key)
51    }
52}