(
&self,
guild_id: Id<GuildMarker>,
premium_tier: Option<PremiumSlotTier>,
)
| 82 | } |
| 83 | |
| 84 | async fn inner_get_worker( |
| 85 | &self, |
| 86 | guild_id: Id<GuildMarker>, |
| 87 | premium_tier: Option<PremiumSlotTier>, |
| 88 | ) -> WorkerHandle { |
| 89 | let started_at = Instant::now(); |
| 90 | let priority_index = premium_tier_index(premium_tier); |
| 91 | |
| 92 | let rx = { |
| 93 | let mut w = self.inner.lock().unwrap(); |
| 94 | |
| 95 | // try to find one with identical guild id, avoids us having to reload all scripts |
| 96 | let mut i = priority_index; |
| 97 | loop { |
| 98 | let pool = &mut w.pools[i]; |
| 99 | let pref_worker = pool |
| 100 | .iter() |
| 101 | .enumerate() |
| 102 | .find(|(_, v)| matches!(v.last_active_guild, Some(g) if g == guild_id)) |
| 103 | .map(|(i, _)| i); |
| 104 | |
| 105 | if let Some(pref_worker) = pref_worker { |
| 106 | metrics::gauge!("bl.scheduler.workerpool_available_workers", "priority_index" => i.to_string()).decrement(1.0); |
| 107 | let worker = pool.remove(pref_worker); |
| 108 | w.track_claimed_worker(ClaimedWorker::new_claim(guild_id, &worker)); |
| 109 | info!("found worker in preferred search"); |
| 110 | record_claim_wait("preferred", priority_index, started_at); |
| 111 | return worker; |
| 112 | } |
| 113 | |
| 114 | if i == 0 { |
| 115 | break; |
| 116 | } |
| 117 | |
| 118 | i -= 1; |
| 119 | } |
| 120 | |
| 121 | // take the least recently used worker |
| 122 | let mut i = priority_index; |
| 123 | loop { |
| 124 | let pool = &mut w.pools[i]; |
| 125 | |
| 126 | let mut candidate = None; |
| 127 | let mut canditate_age = Duration::MAX; |
| 128 | for (i, worker) in pool.iter().enumerate() { |
| 129 | let elapsed = Instant::elapsed(&worker.returned_at); |
| 130 | if candidate.is_none() || elapsed > canditate_age { |
| 131 | candidate = Some(i); |
| 132 | canditate_age = elapsed; |
| 133 | } |
| 134 | } |
| 135 | |
| 136 | if let Some(can) = candidate { |
| 137 | metrics::gauge!("bl.scheduler.workerpool_available_workers", "priority_index" => i.to_string()).decrement(1.0); |
| 138 | let worker = pool.remove(can); |
| 139 | w.track_claimed_worker(ClaimedWorker::new_claim(guild_id, &worker)); |
| 140 | info!("found worker in least recently used search"); |
| 141 | record_claim_wait("lru", priority_index, started_at); |
no test coverage detected