Merge pull request #158 from DioCrafts/claude/optimize-performance-XMWwR

perf: use Arc<str> for repetitive DTO fields to eliminate clone alloc…
This commit is contained in:
Dionisio Pozo
2026-03-03 17:04:17 +01:00
committed by GitHub
9 changed files with 52 additions and 47 deletions
+18 -15
View File
@@ -1,3 +1,5 @@
use std::sync::Arc;
use crate::domain::entities::file::File; use crate::domain::entities::file::File;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@@ -20,8 +22,9 @@ pub struct FileDto {
/// Size in bytes /// Size in bytes
pub size: u64, pub size: u64,
/// MIME type /// MIME type — `Arc<str>` because MIME values repeat across files
pub mime_type: String, /// and DTOs are cloned on every request (clone is O(1) atomic increment).
pub mime_type: Arc<str>,
/// Parent folder ID /// Parent folder ID
pub folder_id: Option<String>, pub folder_id: Option<String>,
@@ -32,15 +35,15 @@ pub struct FileDto {
/// Last modification timestamp /// Last modification timestamp
pub modified_at: u64, pub modified_at: u64,
// ── Pre-computed display fields ── // ── Pre-computed display fields (Arc<str>: values come from static tables) ──
/// FontAwesome icon CSS class (e.g. "fas fa-file-image") /// FontAwesome icon CSS class (e.g. "fas fa-file-image")
pub icon_class: String, pub icon_class: Arc<str>,
/// Extra CSS class for icon styling (e.g. "image-icon", "" when default) /// Extra CSS class for icon styling (e.g. "image-icon", "" when default)
pub icon_special_class: String, pub icon_special_class: Arc<str>,
/// Human-readable file category (e.g. "Image", "Document") /// Human-readable file category (e.g. "Image", "Document")
pub category: String, pub category: Arc<str>,
/// Human-readable formatted size (e.g. "3.27 MB") /// Human-readable formatted size (e.g. "3.27 MB")
pub size_formatted: String, pub size_formatted: String,
@@ -61,13 +64,13 @@ impl From<File> for FileDto {
name: name.to_string(), name: name.to_string(),
path: file.path_string().to_string(), path: file.path_string().to_string(),
size, size,
mime_type: mime.to_string(), mime_type: Arc::from(mime),
folder_id: file.folder_id().map(String::from), folder_id: file.folder_id().map(String::from),
created_at: file.created_at(), created_at: file.created_at(),
modified_at: file.modified_at(), modified_at: file.modified_at(),
icon_class: icon_class_for(name, mime).to_string(), icon_class: Arc::from(icon_class_for(name, mime)),
icon_special_class: icon_special_class_for(name, mime).to_string(), icon_special_class: Arc::from(icon_special_class_for(name, mime)),
category: category_for(name, mime).to_string(), category: Arc::from(category_for(name, mime)),
size_formatted: format_file_size(size), size_formatted: format_file_size(size),
owner_id: file.owner_id().map(String::from), owner_id: file.owner_id().map(String::from),
} }
@@ -84,7 +87,7 @@ impl From<FileDto> for File {
dto.name, dto.name,
dto.path, dto.path,
dto.size, dto.size,
dto.mime_type, dto.mime_type.to_string(),
dto.folder_id, dto.folder_id,
dto.created_at, dto.created_at,
dto.modified_at, dto.modified_at,
@@ -100,13 +103,13 @@ impl FileDto {
name: "stub-file".to_string(), name: "stub-file".to_string(),
path: "/stub/path".to_string(), path: "/stub/path".to_string(),
size: 0, size: 0,
mime_type: "application/octet-stream".to_string(), mime_type: Arc::from("application/octet-stream"),
folder_id: None, folder_id: None,
created_at: 0, created_at: 0,
modified_at: 0, modified_at: 0,
icon_class: "fas fa-file".to_string(), icon_class: Arc::from("fas fa-file"),
icon_special_class: String::new(), icon_special_class: Arc::from(""),
category: "Document".to_string(), category: Arc::from("Document"),
size_formatted: "0 Bytes".to_string(), size_formatted: "0 Bytes".to_string(),
owner_id: None, owner_id: None,
} }
+12 -10
View File
@@ -1,3 +1,5 @@
use std::sync::Arc;
use crate::domain::entities::folder::Folder; use crate::domain::entities::folder::Folder;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@@ -53,15 +55,15 @@ pub struct FolderDto {
/// Whether this is a root folder /// Whether this is a root folder
pub is_root: bool, pub is_root: bool,
// ── Pre-computed display fields ── // ── Pre-computed display fields (Arc<str>: always identical values) ──
/// FontAwesome icon CSS class (always "fas fa-folder") /// FontAwesome icon CSS class (always "fas fa-folder")
pub icon_class: String, pub icon_class: Arc<str>,
/// Extra CSS class for icon styling (always "folder-icon") /// Extra CSS class for icon styling (always "folder-icon")
pub icon_special_class: String, pub icon_special_class: Arc<str>,
/// Human-readable category (always "Folder") /// Human-readable category (always "Folder")
pub category: String, pub category: Arc<str>,
} }
impl From<Folder> for FolderDto { impl From<Folder> for FolderDto {
@@ -77,9 +79,9 @@ impl From<Folder> for FolderDto {
created_at: folder.created_at(), created_at: folder.created_at(),
modified_at: folder.modified_at(), modified_at: folder.modified_at(),
is_root, is_root,
icon_class: "fas fa-folder".to_string(), icon_class: Arc::from("fas fa-folder"),
icon_special_class: "folder-icon".to_string(), icon_special_class: Arc::from("folder-icon"),
category: "Folder".to_string(), category: Arc::from("Folder"),
} }
} }
} }
@@ -112,9 +114,9 @@ impl FolderDto {
created_at: 0, created_at: 0,
modified_at: 0, modified_at: 0,
is_root: true, is_root: true,
icon_class: "fas fa-folder".to_string(), icon_class: Arc::from("fas fa-folder"),
icon_special_class: "folder-icon".to_string(), icon_special_class: Arc::from("folder-icon"),
category: "Folder".to_string(), category: Arc::from("Folder"),
} }
} }
} }
+1 -1
View File
@@ -93,7 +93,7 @@ pub enum OptimizedFileContent {
/// Small-file content (possibly transcoded / compressed) already in RAM. /// Small-file content (possibly transcoded / compressed) already in RAM.
Bytes { Bytes {
data: Bytes, data: Bytes,
mime_type: String, mime_type: Arc<str>,
was_transcoded: bool, was_transcoded: bool,
}, },
/// Memory-mapped file (10–100 MB). /// Memory-mapped file (10–100 MB).
@@ -61,7 +61,7 @@ impl FileRetrievalService {
mime: &str, mime: &str,
file_size: u64, file_size: u64,
accept_webp: bool, accept_webp: bool,
) -> Option<(Bytes, String)> { ) -> Option<(Bytes, Arc<str>)> {
if !accept_webp { if !accept_webp {
return None; return None;
} }
@@ -81,7 +81,7 @@ impl FileRetrievalService {
transcoded.len(), transcoded.len(),
(1.0 - transcoded.len() as f64 / content.len().max(1) as f64) * 100.0 (1.0 - transcoded.len() as f64 / content.len().max(1) as f64) * 100.0
); );
Some((transcoded, webp_mime)) Some((transcoded, Arc::from(&*webp_mime)))
} }
_ => None, _ => None,
} }
@@ -152,7 +152,7 @@ impl FileRetrievalService {
// Store in cache // Store in cache
if let Some(cache) = &self.content_cache { if let Some(cache) = &self.content_cache {
let etag: Arc<str> = format!("\"{}-{}\"", id, modified_at).into(); let etag: Arc<str> = format!("\"{}-{}\"", id, modified_at).into();
let ct: Arc<str> = Arc::from(&*mime_type); let ct: Arc<str> = mime_type.clone();
cache cache
.put(id.to_string(), content_bytes.clone(), etag, ct) .put(id.to_string(), content_bytes.clone(), etag, ct)
.await; .await;
+1 -1
View File
@@ -158,7 +158,7 @@ impl SearchService {
name: file.name.clone(), name: file.name.clone(),
path: file.path.clone(), path: file.path.clone(),
size: file.size, size: file.size,
mime_type: file.mime_type.clone(), mime_type: file.mime_type.to_string(),
folder_id: file.folder_id.clone(), folder_id: file.folder_id.clone(),
created_at: file.created_at, created_at: file.created_at,
modified_at: file.modified_at, modified_at: file.modified_at,
+1 -1
View File
@@ -505,7 +505,7 @@ impl FileRetrievalUseCase for StubFileRetrievalUseCase {
FileDto::default(), FileDto::default(),
OptimizedFileContent::Bytes { OptimizedFileContent::Bytes {
data: Bytes::new(), data: Bytes::new(),
mime_type: String::new(), mime_type: Arc::from(""),
was_transcoded: false, was_transcoded: false,
}, },
)) ))
@@ -149,9 +149,9 @@ impl PathResolverService {
created_at: created_at as u64, created_at: created_at as u64,
modified_at: modified_at as u64, modified_at: modified_at as u64,
is_root: false, is_root: false,
icon_class: "fas fa-folder".to_string(), icon_class: Arc::from("fas fa-folder"),
icon_special_class: "folder-icon".to_string(), icon_special_class: Arc::from("folder-icon"),
category: "Folder".to_string(), category: Arc::from("Folder"),
})), })),
_ => { _ => {
let mime = mime_type.unwrap_or_else(|| "application/octet-stream".to_string()); let mime = mime_type.unwrap_or_else(|| "application/octet-stream".to_string());
@@ -161,13 +161,13 @@ impl PathResolverService {
name: name.clone(), name: name.clone(),
path: res_path, path: res_path,
size: sz, size: sz,
mime_type: mime.clone(), mime_type: Arc::from(&*mime),
folder_id, folder_id,
created_at: created_at as u64, created_at: created_at as u64,
modified_at: modified_at as u64, modified_at: modified_at as u64,
icon_class: icon_class_for(&name, &mime).to_string(), icon_class: Arc::from(icon_class_for(&name, &mime)),
icon_special_class: icon_special_class_for(&name, &mime).to_string(), icon_special_class: Arc::from(icon_special_class_for(&name, &mime)),
category: category_for(&name, &mime).to_string(), category: Arc::from(category_for(&name, &mime)),
size_formatted: format_file_size(sz), size_formatted: format_file_size(sz),
owner_id: user_id, owner_id: user_id,
})) }))
+3 -3
View File
@@ -433,7 +433,7 @@ impl FileHandler {
Ok(stream) => { Ok(stream) => {
return Response::builder() return Response::builder()
.status(StatusCode::PARTIAL_CONTENT) .status(StatusCode::PARTIAL_CONTENT)
.header(header::CONTENT_TYPE, &file_dto.mime_type) .header(header::CONTENT_TYPE, &*file_dto.mime_type)
.header(header::CONTENT_DISPOSITION, &disposition) .header(header::CONTENT_DISPOSITION, &disposition)
.header(header::CONTENT_LENGTH, range_length) .header(header::CONTENT_LENGTH, range_length)
.header( .header(
@@ -488,7 +488,7 @@ impl FileHandler {
.into_response(), .into_response(),
OptimizedFileContent::Mmap(mmap_data) => Response::builder() OptimizedFileContent::Mmap(mmap_data) => Response::builder()
.status(StatusCode::OK) .status(StatusCode::OK)
.header(header::CONTENT_TYPE, &file_dto.mime_type) .header(header::CONTENT_TYPE, &*file_dto.mime_type)
.header(header::CONTENT_DISPOSITION, &disposition) .header(header::CONTENT_DISPOSITION, &disposition)
.header(header::CONTENT_LENGTH, mmap_data.len()) .header(header::CONTENT_LENGTH, mmap_data.len())
.header(header::ETAG, &etag) .header(header::ETAG, &etag)
@@ -502,7 +502,7 @@ impl FileHandler {
.into_response(), .into_response(),
OptimizedFileContent::Stream(pinned_stream) => Response::builder() OptimizedFileContent::Stream(pinned_stream) => Response::builder()
.status(StatusCode::OK) .status(StatusCode::OK)
.header(header::CONTENT_TYPE, &file_dto.mime_type) .header(header::CONTENT_TYPE, &*file_dto.mime_type)
.header(header::CONTENT_DISPOSITION, &disposition) .header(header::CONTENT_DISPOSITION, &disposition)
.header(header::CONTENT_LENGTH, file_dto.size) .header(header::CONTENT_LENGTH, file_dto.size)
.header(header::ETAG, &etag) .header(header::ETAG, &etag)
@@ -286,9 +286,9 @@ async fn handle_propfind(
created_at: Utc::now().timestamp() as u64, created_at: Utc::now().timestamp() as u64,
modified_at: Utc::now().timestamp() as u64, modified_at: Utc::now().timestamp() as u64,
is_root: true, is_root: true,
icon_class: "fas fa-folder".to_string(), icon_class: Arc::from("fas fa-folder"),
icon_special_class: "folder-icon".to_string(), icon_special_class: Arc::from("folder-icon"),
category: "Folder".to_string(), category: Arc::from("Folder"),
}; };
return build_streaming_propfind_response( return build_streaming_propfind_response(
@@ -609,7 +609,7 @@ async fn handle_get(
// Build streaming response using Content-Length from metadata // Build streaming response using Content-Length from metadata
Ok(Response::builder() Ok(Response::builder()
.status(StatusCode::OK) .status(StatusCode::OK)
.header(header::CONTENT_TYPE, file.mime_type) .header(header::CONTENT_TYPE, &*file.mime_type)
.header(header::CONTENT_LENGTH, file.size) .header(header::CONTENT_LENGTH, file.size)
.header(header::ETAG, format!("\"{}\"", file.id)) .header(header::ETAG, format!("\"{}\"", file.id))
.header( .header(
@@ -658,7 +658,7 @@ async fn handle_head(
Ok(ResolvedResource::File(file)) => { Ok(ResolvedResource::File(file)) => {
return Ok(Response::builder() return Ok(Response::builder()
.status(StatusCode::OK) .status(StatusCode::OK)
.header(header::CONTENT_TYPE, &file.mime_type) .header(header::CONTENT_TYPE, &*file.mime_type)
.header(header::CONTENT_LENGTH, file.size) .header(header::CONTENT_LENGTH, file.size)
.header(header::ETAG, format!("\"{}\"", file.id)) .header(header::ETAG, format!("\"{}\"", file.id))
.header( .header(
@@ -693,7 +693,7 @@ async fn handle_head(
Ok(Response::builder() Ok(Response::builder()
.status(StatusCode::OK) .status(StatusCode::OK)
.header(header::CONTENT_TYPE, &file.mime_type) .header(header::CONTENT_TYPE, &*file.mime_type)
.header(header::CONTENT_LENGTH, file.size) .header(header::CONTENT_LENGTH, file.size)
.header(header::ETAG, format!("\"{}\"", file.id)) .header(header::ETAG, format!("\"{}\"", file.id))
.header( .header(