diff --git a/src-tauri/crates/archive-indexer/src/ffmpeg.rs b/src-tauri/crates/archive-indexer/src/ffmpeg.rs index 9abbe29..f9b0403 100644 --- a/src-tauri/crates/archive-indexer/src/ffmpeg.rs +++ b/src-tauri/crates/archive-indexer/src/ffmpeg.rs @@ -81,16 +81,31 @@ fn which(name: &str) -> Option { None } -/// 콘솔 창 없이 실행되는 Command 생성 (Windows CREATE_NO_WINDOW) +/// 콘솔 창 없이 + 저우선순위로 실행되는 Command 생성. +/// ffmpeg/ffprobe는 CPU 집약적이라 자식 프로세스를 저우선순위로 띄워야 +/// (스레드 우선순위는 자식에 상속되지 않음) 영상 다수 처리 중에도 UI가 멈추지 않는다. pub fn command(path: &Path) -> Command { - let cmd = Command::new(path); + let mut cmd = Command::new(path); #[cfg(windows)] - let cmd = { + { use std::os::windows::process::CommandExt; - let mut c = cmd; - c.creation_flags(0x0800_0000); - c - }; + // CREATE_NO_WINDOW(0x0800_0000) | BELOW_NORMAL_PRIORITY_CLASS(0x0000_4000) + cmd.creation_flags(0x0800_0000 | 0x0000_4000); + } + #[cfg(unix)] + { + use std::os::unix::process::CommandExt; + // fork 후 exec 전에 자식 니스값을 올린다(우선순위 하향). setpriority(PRIO_PROCESS,self,10). + unsafe { + cmd.pre_exec(|| { + extern "C" { + fn setpriority(which: i32, who: u32, prio: i32) -> i32; + } + setpriority(0, 0, 10); + Ok(()) + }); + } + } cmd } diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index a22f135..9b128f4 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -187,8 +187,18 @@ fn main() { std::thread::Builder::new() .name("maintenance".into()) .spawn(move || { + // 유지보수는 백그라운드 — 시작 시 UI를 방해하지 않도록 저우선순위. + archive_indexer::prio::set_current_thread_low(); let backup = data_dir.join("archive.db.bak"); - if let Err(e) = archive_indexer::maintenance::backup_db(&db, &backup) { + // 백업(VACUUM INTO = DB 전체 복제)은 하루 한 번만 — 대용량 라이브러리에서 + // 매 실행 백업은 시작을 느리게 하고 디스크를 낭비한다. + let backup_fresh = std::fs::metadata(&backup) + .and_then(|m| m.modified()) + .map(|t| t.elapsed().map(|e| e.as_secs() < 24 * 3600).unwrap_or(false)) + .unwrap_or(false); + if backup_fresh { + tracing::debug!("최근(24h 내) 백업 존재 — 이번 실행은 백업 건너뜀"); + } else if let Err(e) = archive_indexer::maintenance::backup_db(&db, &backup) { tracing::warn!("DB 백업 실패: {e}"); } let cutoff = now_ms() - 30 * 24 * 3600 * 1000;