From 2e7910c0d333032ff1f92843c4de65ff83871bde Mon Sep 17 00:00:00 2001 From: pyranota <92104930+pyranota@users.noreply.github.com> Date: Tue, 4 Mar 2025 02:36:11 +0300 Subject: [PATCH] nit: print more information in frontend if something goes wrong with uv (#5411) * nit: print to frontend logs if there is fallback to system python * print to logs if fallback --- .../windmill-worker/src/python_executor.rs | 29 ++++++++++++++----- backend/windmill-worker/src/worker.rs | 2 +- .../windmill-worker/src/worker_lockfiles.rs | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/backend/windmill-worker/src/python_executor.rs b/backend/windmill-worker/src/python_executor.rs index 89e43c94e6..83fbe94cf4 100644 --- a/backend/windmill-worker/src/python_executor.rs +++ b/backend/windmill-worker/src/python_executor.rs @@ -96,19 +96,23 @@ pub enum PyVersion { } impl PyVersion { - pub async fn from_instance_version() -> Self { - match INSTANCE_PYTHON_VERSION.read().await.clone() { + pub async fn from_instance_version(job_id: &Uuid, w_id: &str, db: &Pool) -> Self { + let mut err = None; + let pyv = match INSTANCE_PYTHON_VERSION.read().await.clone() { Some(v) => PyVersion::from_string_with_dots(&v).unwrap_or_else(|| { let v = PyVersion::default(); - tracing::error!( - "Cannot parse INSTANCE_PYTHON_VERSION ({:?}), fallback to latest_stable ({v:?})", - *INSTANCE_PYTHON_VERSION - ); + err = Some(format!("\nCannot parse INSTANCE_PYTHON_VERSION ({:?}), fallback to latest_stable ({v:?})", *INSTANCE_PYTHON_VERSION)); v }), // Use latest stable None => PyVersion::default(), + }; + + if let Some(msg) = err { + append_logs(job_id, w_id, &msg, db).await; + tracing::error!(msg); } + pyv } /// e.g.: `/tmp/windmill/cache/python_3xy` pub fn to_cache_dir(&self) -> String { @@ -223,9 +227,18 @@ impl PyVersion { if let Err(ref e) = res { tracing::error!( - "worker_name: {worker_name}, w_id: {w_id}, job_id: {job_id}\n + "worker_name: {worker_name}, w_id: {w_id}, job_id: {job_id}\n Error while getting python from uv, falling back to system python: {e:?}" ); + append_logs( + job_id, + w_id, + format!( + "\nError while getting python from uv, falling back to system python: {e:?}" + ), + db, + ) + .await; } res } @@ -1430,7 +1443,7 @@ async fn handle_python_deps( let mut annotated_pyv = None; let mut annotated_pyv_numeric = None; let is_deployed = requirements_o.is_some(); - let instance_pyv = PyVersion::from_instance_version().await; + let instance_pyv = PyVersion::from_instance_version(job_id, w_id, db).await; let annotations = windmill_common::worker::PythonAnnotations::parse(inner_content); let requirements = match requirements_o { Some(r) => r, diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index d8421e097e..d01aed481c 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -773,7 +773,7 @@ pub async fn run_worker( worker_dir.clone(), ); tokio::spawn(async move { - if let Err(e) = PyVersion::from_instance_version() + if let Err(e) = PyVersion::from_instance_version(&Uuid::nil(), "", &db) .await .get_python(&Uuid::nil(), &mut 0, &db, &worker_name, "", &mut None) .await diff --git a/backend/windmill-worker/src/worker_lockfiles.rs b/backend/windmill-worker/src/worker_lockfiles.rs index 5df02daa57..7bf0929448 100644 --- a/backend/windmill-worker/src/worker_lockfiles.rs +++ b/backend/windmill-worker/src/worker_lockfiles.rs @@ -1701,7 +1701,7 @@ async fn python_dep( let final_version = annotated_pyv_numeric .and_then(|pyv| PyVersion::from_numeric(pyv)) - .unwrap_or(PyVersion::from_instance_version().await); + .unwrap_or(PyVersion::from_instance_version(job_id, w_id, db).await); let req: std::result::Result = uv_pip_compile( job_id,