mirror of https://github.com/telemt/telemt.git
38 lines
1.0 KiB
Rust
38 lines
1.0 KiB
Rust
use std::sync::Arc;
|
|
use std::time::Duration;
|
|
|
|
use tracing::{info, warn};
|
|
|
|
use crate::crypto::SecureRandom;
|
|
|
|
use super::MePool;
|
|
|
|
/// Periodically refresh ME connections to avoid long-lived degradation.
|
|
pub async fn me_rotation_task(pool: Arc<MePool>, rng: Arc<SecureRandom>, interval: Duration) {
|
|
let interval = interval.max(Duration::from_secs(600));
|
|
loop {
|
|
tokio::time::sleep(interval).await;
|
|
|
|
let candidate = {
|
|
let ws = pool.writers.read().await;
|
|
ws.get(0).cloned()
|
|
};
|
|
|
|
let Some(w) = candidate else {
|
|
continue;
|
|
};
|
|
|
|
info!(addr = %w.addr, writer_id = w.id, "Rotating ME connection");
|
|
match pool.connect_one(w.addr, rng.as_ref()).await {
|
|
Ok(()) => {
|
|
// Remove old writer after new one is up.
|
|
pool.remove_writer_and_reroute(w.id).await;
|
|
}
|
|
Err(e) => {
|
|
warn!(addr = %w.addr, writer_id = w.id, error = %e, "ME rotation connect failed");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|