Fix: async RwLock read ennen Mutex-scopea (Send-yhteensopivuus)

This commit is contained in:
2026-04-13 16:34:51 +03:00
parent fa85dcc5b3
commit 0f3881aa02

View File

@@ -1310,12 +1310,13 @@ async fn api_chat_completions(
// Etsitään vapaa solmu — älykäs reititys kyvykkyyden mukaan // Etsitään vapaa solmu — älykäs reititys kyvykkyyden mukaan
let want_heavy = payload.capability.as_deref() == Some("heavy"); let want_heavy = payload.capability.as_deref() == Some("heavy");
// Haetaan param_b-snapshot ennen Mutex-lukituksia (async RwLock ei saa olla Mutex-scopen sisällä)
let param_b_snapshot: HashMap<u64, u32> = state.node_max_param_b.read().await.clone();
let (target_node, _total_matching) = { let (target_node, _total_matching) = {
let tasks = state.node_tasks.lock().unwrap(); let tasks = state.node_tasks.lock().unwrap();
let _busy = state.node_busy.lock().unwrap(); let _busy = state.node_busy.lock().unwrap();
let node_types = state.node_types.lock().unwrap(); let node_types = state.node_types.lock().unwrap();
let paused = state.node_paused.lock().unwrap(); let paused = state.node_paused.lock().unwrap();
let param_b = state.node_max_param_b.read().await;
let matching: Vec<u64> = tasks.iter().filter(|(k, task)| { let matching: Vec<u64> = tasks.iter().filter(|(k, task)| {
if paused.contains(k) { return false; } // Ei sallita tauotettuja if paused.contains(k) { return false; } // Ei sallita tauotettuja
// Eksakti match tai qwen-perheen yhteensopivuus (selain: qwen-coder-05b, natiivi: qwen2.5-coder:7b) // Eksakti match tai qwen-perheen yhteensopivuus (selain: qwen-coder-05b, natiivi: qwen2.5-coder:7b)
@@ -1333,7 +1334,7 @@ async fn api_chat_completions(
let any = if want_heavy { let any = if want_heavy {
// Heavy: priorisoi solmu jolla on suurin malli (B-parametrit) // Heavy: priorisoi solmu jolla on suurin malli (B-parametrit)
let mut ranked: Vec<(u64, u32)> = matching.iter().map(|id| { let mut ranked: Vec<(u64, u32)> = matching.iter().map(|id| {
(*id, param_b.get(id).copied().unwrap_or(0)) (*id, param_b_snapshot.get(id).copied().unwrap_or(0))
}).collect(); }).collect();
ranked.sort_by(|a, b| b.1.cmp(&a.1)); // suurin ensin ranked.sort_by(|a, b| b.1.cmp(&a.1)); // suurin ensin
if let Some((best_id, best_b)) = ranked.first() { if let Some((best_id, best_b)) = ranked.first() {