diff --git a/Cargo.lock b/Cargo.lock index cb826907..51a567c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -491,7 +491,7 @@ dependencies = [ [[package]] name = "config" -version = "0.3.45" +version = "0.3.46" dependencies = [ "base64", "chrono", @@ -598,7 +598,7 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto" -version = "0.3.45" +version = "0.3.46" dependencies = [ "aes-gcm", "base64", @@ -3252,7 +3252,7 @@ dependencies = [ [[package]] name = "testutils" -version = "0.3.45" +version = "0.3.46" dependencies = [ "pem", "rsa", @@ -3522,7 +3522,7 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tower" -version = "0.3.45" +version = "0.3.46" dependencies = [ "tokio", "tower-api", @@ -3547,7 +3547,7 @@ dependencies = [ [[package]] name = "tower-api" -version = "0.3.45" +version = "0.3.46" dependencies = [ "reqwest", "serde", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "tower-cmd" -version = "0.3.45" +version = "0.3.46" dependencies = [ "axum", "bytes", @@ -3629,7 +3629,7 @@ checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-package" -version = "0.3.45" +version = "0.3.46" dependencies = [ "async-compression", "config", @@ -3647,7 +3647,7 @@ dependencies = [ [[package]] name = "tower-runtime" -version = "0.3.45" +version = "0.3.46" dependencies = [ "async-trait", "chrono", @@ -3670,7 +3670,7 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tower-telemetry" -version = "0.3.45" +version = "0.3.46" dependencies = [ "tracing", "tracing-appender", @@ -3679,7 +3679,7 @@ dependencies = [ [[package]] name = "tower-uv" -version = "0.3.45" +version = "0.3.46" dependencies = [ "async-compression", "async_zip", @@ -3697,7 +3697,7 @@ dependencies = [ [[package]] name = "tower-version" -version = "0.3.45" +version = "0.3.46" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 03e0fe35..41114404 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ resolver = "2" [workspace.package] edition = "2021" -version = "0.3.45" +version = "0.3.46" description = "Tower is the best way to host Python data apps in production" rust-version = "1.81" authors = ["Brad Heller "] diff --git a/crates/tower-cmd/src/util/apps.rs b/crates/tower-cmd/src/util/apps.rs index 38012bae..e6e14524 100644 --- a/crates/tower-cmd/src/util/apps.rs +++ b/crates/tower-cmd/src/util/apps.rs @@ -96,9 +96,7 @@ pub async fn ensure_app_exists( } Err(create_err) => { spinner.failure(); - Err(crate::Error::ApiCreateAppError { - source: create_err, - }) + Err(crate::Error::ApiCreateAppError { source: create_err }) } } } diff --git a/crates/tower-runtime/src/subprocess.rs b/crates/tower-runtime/src/subprocess.rs index de3147ce..15603f5b 100644 --- a/crates/tower-runtime/src/subprocess.rs +++ b/crates/tower-runtime/src/subprocess.rs @@ -35,32 +35,51 @@ impl SubprocessBackend { /// Returns the Package (which keeps the temp directory alive) async fn receive_and_unpack_package( &self, + ctx: &tower_telemetry::Context, mut package_stream: Box, ) -> Result { + use tower_telemetry::{debug, error, info}; // Create temp directory for this package - let temp_dir = TmpDir::new("tower-package") - .await - .map_err(|_| Error::PackageCreateFailed)?; + let temp_dir = TmpDir::new("tower-package").await.map_err(|e| { + error!(ctx: ctx, "Failed to create temp directory: {:?}", e); + Error::PackageCreateFailed + })?; // Save stream to tar.gz file let tar_gz_path = temp_dir.to_path_buf().join("package.tar.gz"); - let mut file = File::create(&tar_gz_path) - .await - .map_err(|_| Error::PackageCreateFailed)?; + debug!(ctx: ctx, "Saving package stream to {:?}", tar_gz_path); - tokio::io::copy(&mut package_stream, &mut file) + let mut file = File::create(&tar_gz_path).await.map_err(|e| { + error!(ctx: ctx, "Failed to create package file: {:?}", e); + Error::PackageCreateFailed + })?; + + let bytes_copied = tokio::io::copy(&mut package_stream, &mut file) .await - .map_err(|_| Error::PackageCreateFailed)?; + .map_err(|e| { + error!(ctx: ctx, "Failed to save package stream: {:?}", e); + Error::PackageCreateFailed + })?; + + debug!(ctx: ctx, "Downloaded {} bytes", bytes_copied); - file.flush().await.map_err(|_| Error::PackageCreateFailed)?; + file.flush().await.map_err(|e| { + error!(ctx: ctx, "Failed to flush package file: {:?}", e); + Error::PackageCreateFailed + })?; drop(file); // Unpack the package + info!(ctx: ctx, "Unpacking package"); let mut package = Package::default(); package.package_file_path = Some(tar_gz_path); package.tmp_dir = Some(temp_dir); - package.unpack().await?; + package.unpack().await.map_err(|e| { + error!(ctx: ctx, "Failed to unpack package: {:?}", e); + Error::PackageUnpackFailed + })?; + info!(ctx: ctx, "Successfully unpacked package"); Ok(package) } } @@ -93,7 +112,9 @@ impl ExecutionBackend for SubprocessBackend { }; // Receive package stream and unpack it - let mut package = self.receive_and_unpack_package(spec.package_stream).await?; + let mut package = self + .receive_and_unpack_package(&spec.telemetry_ctx, spec.package_stream) + .await?; let unpacked_path = package .unpacked_path diff --git a/crates/tower-uv/src/lib.rs b/crates/tower-uv/src/lib.rs index 559ddf53..8fb53fc3 100644 --- a/crates/tower-uv/src/lib.rs +++ b/crates/tower-uv/src/lib.rs @@ -159,7 +159,7 @@ pub fn cleanup_stale_uv_lock_files() { Ok(f) => f, Err(e) => { debug!("Failed to open lock file {:?}: {:?}", path, e); - continue + continue; } }; @@ -187,7 +187,8 @@ fn is_uv_lock_file_name>(lock_name: S) -> bool { let uv_lock_pattern = Regex::new(r"^uv-[0-9a-f]{16}\.lock$").unwrap(); let os_str = lock_name.as_ref(); - os_str.to_str() + os_str + .to_str() .map(|name| uv_lock_pattern.is_match(name)) .unwrap_or(false) } @@ -567,10 +568,16 @@ mod tests { cleanup_stale_uv_lock_files(); // UV lock file should be removed (it wasn't locked) - assert!(!uv_lock_file.exists(), "UV lock file should have been cleaned up"); + assert!( + !uv_lock_file.exists(), + "UV lock file should have been cleaned up" + ); // Non-UV file should still exist - assert!(non_uv_file.exists(), "Non-UV file should not have been touched"); + assert!( + non_uv_file.exists(), + "Non-UV file should not have been touched" + ); // Clean up the non-UV file let _ = fs::remove_file(&non_uv_file); diff --git a/pyproject.toml b/pyproject.toml index 77229ded..6f1b2530 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "tower" -version = "0.3.45" +version = "0.3.46" description = "Tower CLI and runtime environment for Tower." authors = [{ name = "Tower Computing Inc.", email = "brad@tower.dev" }] readme = "README.md" diff --git a/uv.lock b/uv.lock index 312a2e16..6e2615d9 100644 --- a/uv.lock +++ b/uv.lock @@ -2744,7 +2744,7 @@ wheels = [ [[package]] name = "tower" -version = "0.3.45" +version = "0.3.46" source = { editable = "." } dependencies = [ { name = "attrs" },