MCPcopy Create free account
hub / github.com/Botloader/botloader / inner_get_worker

Method inner_get_worker

components/scheduler/src/vmworkerpool.rs:84–165  ·  view source on GitHub ↗
(
        &self,
        guild_id: Id<GuildMarker>,
        premium_tier: Option<PremiumSlotTier>,
    )

Source from the content-addressed store, hash-verified

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);

Callers 1

req_workerMethod · 0.80

Calls 6

premium_tier_indexFunction · 0.85
record_claim_waitFunction · 0.85
lockMethod · 0.80
decrementMethod · 0.80
removeMethod · 0.80
track_claimed_workerMethod · 0.80

Tested by

no test coverage detected