From 763b93396c628aec04a815f63fc5dc4c5474d178 Mon Sep 17 00:00:00 2001 From: jaakko Date: Mon, 13 Apr 2026 21:09:24 +0300 Subject: [PATCH] =?UTF-8?q?Reititys:=20busy-solmut=20suodatetaan=20pois=20?= =?UTF-8?q?=E2=80=94=20ty=C3=B6=20jakautuu=20solmuille?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aiemmin busy-lukko luettiin mutta sitä ei käytetty suodatukseen, joten sama solmu valittiin aina uudelleen vaikka se oli varattu. Nyt matching-lista suodattaa pois busy-solmut, joten toinen vapaa solmu saa tehtävän. Heavy-fallback kevyempään solmuun jos kaikki isot mallit ovat varattuja. --- network-poc/hub/src/main.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/network-poc/hub/src/main.rs b/network-poc/hub/src/main.rs index 1890b92..14591b3 100644 --- a/network-poc/hub/src/main.rs +++ b/network-poc/hub/src/main.rs @@ -1314,12 +1314,12 @@ async fn api_chat_completions( 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 busy = state.node_busy.lock().unwrap(); let node_types = state.node_types.lock().unwrap(); let paused = state.node_paused.lock().unwrap(); 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) + if paused.contains(k) { return false; } // Ei tauotettuja + if busy.contains(k) { return false; } // Ei varattuja let req_model = payload.model.to_lowercase(); let node_task = task.to_lowercase(); if req_model.starts_with("qwen") { @@ -1341,10 +1341,16 @@ async fn api_chat_completions( tracing::info!("Heavy-reititys: solmu {} valittu ({}B parametria)", best_id, best_b); Some(*best_id) } else { - None + // Kaikki heavy-solmut busy — fallback mihin tahansa vapaaseen + let all_matching: Vec = tasks.iter().filter(|(k, task)| { + if paused.contains(k) || busy.contains(k) { return false; } + let req_model = payload.model.to_lowercase(); + task.to_lowercase().starts_with(&req_model.split('-').next().unwrap_or("")) + }).map(|(k, _)| *k).collect(); + all_matching.first().copied() } } else { - // Oletus: natiivi ensin, sitten mikä tahansa + // Oletus: vapaa natiivi ensin, sitten mikä tahansa vapaa let native = matching.iter().find(|id| { node_types.get(id).map(|t| t == "native").unwrap_or(false) }).copied();