From 0f3881aa028537a53e4df63465dd310aa4903bd0 Mon Sep 17 00:00:00 2001 From: jaakko Date: Mon, 13 Apr 2026 16:34:51 +0300 Subject: [PATCH] Fix: async RwLock read ennen Mutex-scopea (Send-yhteensopivuus) --- network-poc/hub/src/main.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/network-poc/hub/src/main.rs b/network-poc/hub/src/main.rs index 4c2f795..1890b92 100644 --- a/network-poc/hub/src/main.rs +++ b/network-poc/hub/src/main.rs @@ -1310,12 +1310,13 @@ async fn api_chat_completions( // Etsitään vapaa solmu — älykäs reititys kyvykkyyden mukaan 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 = state.node_max_param_b.read().await.clone(); let (target_node, _total_matching) = { let tasks = state.node_tasks.lock().unwrap(); let _busy = state.node_busy.lock().unwrap(); let node_types = state.node_types.lock().unwrap(); let paused = state.node_paused.lock().unwrap(); - let param_b = state.node_max_param_b.read().await; let matching: Vec = tasks.iter().filter(|(k, task)| { if paused.contains(k) { return false; } // Ei sallita tauotettuja // 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 { // Heavy: priorisoi solmu jolla on suurin malli (B-parametrit) 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(); ranked.sort_by(|a, b| b.1.cmp(&a.1)); // suurin ensin if let Some((best_id, best_b)) = ranked.first() {