diff --git a/src/info_storages/file_info_storage.rs b/src/info_storages/file_info_storage.rs index fad265b4f4420aeeea4286fef41fc153f4035fdb..51f55674cd42aae557f4fefeaaee56ebfbd36171 100644 --- a/src/info_storages/file_info_storage.rs +++ b/src/info_storages/file_info_storage.rs @@ -45,12 +45,8 @@ impl InfoStorage for FileInfoStorage { error!("{:?}", err); RustusError::UnableToWrite(err.to_string()) })?; - let data = serde_json::to_string(&file_info).map_err(|err| { - error!("{:#?}", err); - err - })?; - copy(&mut data.as_bytes(), &mut file).await?; - file.sync_data().await?; + copy(&mut file_info.json().await?.as_bytes(), &mut file).await?; + tokio::task::spawn(async move { file.sync_data().await }); Ok(()) } diff --git a/src/info_storages/models/file_info.rs b/src/info_storages/models/file_info.rs index bace48bd72d78095b72a280a05396a0e0d2e5c09..52027062fdbd23d5167614793cae8c5b99b21dc5 100644 --- a/src/info_storages/models/file_info.rs +++ b/src/info_storages/models/file_info.rs @@ -1,7 +1,10 @@ use std::collections::HashMap; +use crate::errors::RustusError; +use crate::RustusResult; use chrono::serde::ts_seconds; use chrono::{DateTime, Utc}; +use log::error; use serde::{Deserialize, Serialize}; /// Information about file. @@ -88,6 +91,17 @@ impl FileInfo { } } + pub async fn json(&self) -> RustusResult<String> { + let info_clone = self.clone(); + let data = tokio::task::spawn_blocking(move || serde_json::to_string(&info_clone)) + .await + .map_err(|err| { + error!("{}", err); + RustusError::UnableToWrite("Can't serialize info".into()) + })??; + Ok(data) + } + #[cfg(test)] pub fn new_test() -> Self { FileInfo::new( diff --git a/src/info_storages/redis_info_storage.rs b/src/info_storages/redis_info_storage.rs index b9e0b3b11b4686f9e454b593f38188ea589f8dfd..5e412a0177e07d8da08a346137ae4a20aa0b4f4b 100644 --- a/src/info_storages/redis_info_storage.rs +++ b/src/info_storages/redis_info_storage.rs @@ -30,7 +30,7 @@ impl InfoStorage for RedisStorage { let mut conn = self.pool.get().await?; redis::cmd("SET") .arg(file_info.id.as_str()) - .arg(serde_json::to_string(file_info)?.as_str()) + .arg(file_info.json().await?.as_str()) .query_async::<Connection, String>(&mut conn) .await .map_err(RustusError::from)?; diff --git a/src/storages/file_storage.rs b/src/storages/file_storage.rs index 2653412bab29c66685484ee632194a04e4794356..b2a850b5e86e5b272f89ffda69d596dcb40cc843 100644 --- a/src/storages/file_storage.rs +++ b/src/storages/file_storage.rs @@ -4,7 +4,7 @@ use actix_files::NamedFile; use async_trait::async_trait; use log::error; use tokio::fs::{remove_file, DirBuilder, OpenOptions}; -use tokio::io::{copy, BufReader}; +use tokio::io::copy; use crate::errors::{RustusError, RustusResult}; use crate::info_storages::FileInfo; @@ -95,9 +95,10 @@ impl Storage for FileStorage { error!("{:?}", err); RustusError::UnableToWrite(err.to_string()) })?; - let mut reader = BufReader::new(bytes); - copy(&mut reader, &mut file).await?; - file.sync_data().await?; + #[allow(clippy::clone_double_ref)] + let mut buffer = bytes.clone(); + copy(&mut buffer, &mut file).await?; + tokio::task::spawn(async move { file.sync_data().await }); Ok(()) }