diff --git a/src/tts_download_job.rs b/src/tts_download_job.rs index cd695ff799..7a97041849 100644 --- a/src/tts_download_job.rs +++ b/src/tts_download_job.rs @@ -51,12 +51,13 @@ use ring::digest::{Context, Digest, SHA256}; use sqlx::MySqlPool; use sqlx::mysql::MySqlPoolOptions; use std::fs::File; -use std::io::{BufReader, Read}; +use std::io::{BufReader, Read, Error}; use std::ops::Deref; use std::path::{PathBuf, Path}; use std::process::Command; use std::time::Duration; use tempdir::TempDir; +use std::fs; // Buckets const ENV_ACCESS_KEY : &'static str = "ACCESS_KEY"; @@ -336,8 +337,13 @@ async fn process_job(downloader: &Downloader, job: &TtsUploadJobRecord) -> Anyho .map(|c| c.to_string()) .unwrap_or("".to_string()); - let download_filename = downloader.google_drive_downloader - .download_file(&download_url, &temp_dir).await?; + let download_filename = match downloader.google_drive_downloader.download_file(&download_url, &temp_dir).await { + Ok(filename) => filename, + Err(e) => { + delete_temp_directory(&temp_dir); + return Err(e); + } + }; let model_type = if download_filename.to_lowercase().ends_with("zip") { TtsModelType::Talknet @@ -365,18 +371,28 @@ async fn process_job(downloader: &Downloader, job: &TtsUploadJobRecord) -> Anyho match model_type { TtsModelType::Tacotron2 => { - downloader.tacotron_tts_check.execute( + let result = downloader.tacotron_tts_check.execute( &file_path, &output_metadata_fs_path, false, - )?; + ); + + if let Err(e) = result { + delete_temp_file(&file_path); + delete_temp_directory(&temp_dir); + } }, TtsModelType::Talknet => { - downloader.talknet_tts_check.execute( + let result = downloader.talknet_tts_check.execute( &file_path, &output_metadata_fs_path, false, - )?; + ); + + if let Err(e) = result { + delete_temp_file(&file_path); + delete_temp_directory(&temp_dir); + } }, } @@ -386,7 +402,15 @@ async fn process_job(downloader: &Downloader, job: &TtsUploadJobRecord) -> Anyho check_file_exists(&output_metadata_fs_path)?; - let file_metadata = read_metadata_file(&output_metadata_fs_path)?; + let file_metadata = match read_metadata_file(&output_metadata_fs_path) { + Ok(metadata) => metadata, + Err(e) => { + delete_temp_file(&file_path); + delete_temp_file(&output_metadata_fs_path); + delete_temp_directory(&temp_dir); + return Err(e); + } + }; // ==================== UPLOAD MODEL FILE ==================== // @@ -405,7 +429,19 @@ async fn process_job(downloader: &Downloader, job: &TtsUploadJobRecord) -> Anyho redis_logger.log_status("uploading model")?; - downloader.bucket_client.upload_filename(&synthesizer_model_bucket_path, &file_path).await?; + if let Err(e) = downloader.bucket_client.upload_filename(&synthesizer_model_bucket_path, &file_path).await { + delete_temp_file(&output_metadata_fs_path); + delete_temp_file(&file_path); + delete_temp_directory(&temp_dir); + return Err(e); + } + + // ==================== DELETE DOWNLOADED FILE ==================== // + + // NB: We should be using a tempdir, but to make absolutely certain we don't overflow the disk... + delete_temp_file(&output_metadata_fs_path); + delete_temp_file(&file_path); + delete_temp_directory(&temp_dir); // ==================== SAVE RECORDS ==================== // @@ -448,3 +484,23 @@ async fn process_job(downloader: &Downloader, job: &TtsUploadJobRecord) -> Anyho Ok(()) } + +fn delete_temp_file>(file_path: P) { + // NB: We should be using a tempdir, but to make absolutely certain we don't overflow the disk... + let printable_name = file_path.as_ref().to_str().unwrap_or("bad filename"); + match fs::remove_file(&file_path) { + Ok(_) => info!("File deleted: {}", printable_name), + Err(e) => warn!("Could not delete file {:?} (not a fatal error): {:?}", + printable_name, e), + } +} + +fn delete_temp_directory>(directory_path: P) { + // NB: We should be using a tempdir, but to make absolutely certain we don't overflow the disk... + let printable_name = directory_path.as_ref().to_str().unwrap_or("bad directory"); + match fs::remove_dir_all(&directory_path) { + Ok(_) => info!("Directory deleted: {}", printable_name), + Err(e) => warn!("Could not delete directory{:?} (not a fatal error): {:?}", + printable_name, e), + } +}