您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

59 行
2.1 KiB

  1. use std::collections::{BTreeMap, BTreeSet};
  2. use std::time::SystemTime;
  3. use redis::Commands;
  4. use tracing::{info, warn};
  5. use rayon::prelude::*;
  6. use crate::client_manager::ClientManager;
  7. use crate::models::{TrackerInfo, TrackerMap};
  8. pub fn get_trackers(client_mgr: &ClientManager) -> color_eyre::Result<TrackerMap> {
  9. let mut con = client_mgr.get_master_connection()?;
  10. let trackers: BTreeMap<String, String> = con.hgetall("trackers")?;
  11. let mut errors = vec![];
  12. let trackers: BTreeMap<String, TrackerInfo> = trackers.into_iter()
  13. .map(|(name, info)| {
  14. let info: serde_json::Result<TrackerInfo> = serde_json::from_str(&info);
  15. (name, info)
  16. })
  17. .filter_map(|(n,v)| {
  18. v.map_err(|e| errors.push((n.clone(), e)))
  19. .ok()
  20. .map(|v| (n, v))
  21. })
  22. .collect();
  23. for (n, e) in errors {
  24. warn!("Unable to parse tracker data for {n}: {e}");
  25. }
  26. Ok(trackers)
  27. }
  28. pub fn determine_active_trackers(client_mgr: &ClientManager, trackers: &TrackerMap, inactive_minutes: u64) -> color_eyre::Result<BTreeSet<String>> {
  29. let start = SystemTime::now();
  30. let t = get_last_requests_time()?;
  31. let res: color_eyre::Result<Vec<Option<String>>> = trackers.par_iter().map(|(name, info)| {
  32. let mut con = client_mgr.get_connection_from_tracker(info)?;
  33. for i in 0..inactive_minutes {
  34. let tim = t.clone() - i * 60u64;
  35. let k = format!("{name}:requests_processed:{tim}");
  36. let ex: bool = con.exists(k)?;
  37. if ex {
  38. return Ok(Some(name.clone()))
  39. }
  40. }
  41. Ok(None)
  42. })
  43. .collect();
  44. let res = res?;
  45. let dur = SystemTime::now().duration_since(start).unwrap().as_secs_f32();
  46. info!("Determining active projects took {dur:.04} seconds.");
  47. Ok(res.into_iter().filter_map(|v| v).collect())
  48. }
  49. pub fn get_last_requests_time() -> color_eyre::Result<u64> {
  50. let now = SystemTime::now();
  51. let unix = now.duration_since(SystemTime::UNIX_EPOCH)?.as_secs();
  52. let unix = unix - 60;
  53. let d = unix.clone() % 60;
  54. Ok(unix - d)
  55. }