Skip to main content

dbx_core/storage/
manager.rs

1use std::fs;
2use std::io;
3use std::path::{Path, PathBuf};
4use tracing::info;
5
6/// 스토리지 경로 관리자 (StoragePathManager)
7///
8/// 5-Tier 하이브리드 스토리지 시스템의 파편화된 파일 경로를 하나의 루트 디렉토리 산하로 통합 관리합니다.
9/// 단일 폴더(Virtual File System 대체) 방식을 통해 유저의 단순 백업/복제를 지원합니다.
10#[derive(Debug, Clone)]
11pub struct StoragePathManager {
12    root_dir: PathBuf,
13}
14
15impl StoragePathManager {
16    /// 새로운 스토리지 경로 관리자를 생성합니다.
17    pub fn new<P: AsRef<Path>>(root: P) -> Self {
18        Self {
19            root_dir: root.as_ref().to_path_buf(),
20        }
21    }
22
23    /// 원시 루트 디렉토리
24    pub fn root_dir(&self) -> &Path {
25        &self.root_dir
26    }
27
28    /// Write-Optimized Storage (WOS) 경로 반환 및 보장
29    pub fn wos_dir(&self) -> io::Result<PathBuf> {
30        let p = self.root_dir.join("wos");
31        fs::create_dir_all(&p)?;
32        Ok(p)
33    }
34
35    /// Read-Optimized Storage (ROS / Parquet) 경로 반환 및 보장
36    pub fn ros_dir(&self) -> io::Result<PathBuf> {
37        let p = self.root_dir.join("ros");
38        fs::create_dir_all(&p)?;
39        Ok(p)
40    }
41
42    /// Erasure Coding (Cold Tier) 저장 경로 반환 및 보장
43    pub fn cold_ec_dir(&self) -> io::Result<PathBuf> {
44        let p = self.root_dir.join("cold_ec");
45        fs::create_dir_all(&p)?;
46        Ok(p)
47    }
48
49    /// Write Ahead Log 경로 (파일)
50    pub fn wal_path(&self) -> PathBuf {
51        self.root_dir.join("wal.log")
52    }
53
54    /// 암호화된 Write Ahead Log 경로 (파일)
55    pub fn encrypted_wal_path(&self) -> PathBuf {
56        self.root_dir.join("wal.enc.log")
57    }
58
59    /// Columnar Cache 분할 파일 보관 경로
60    pub fn columnar_cache_dir(&self) -> io::Result<PathBuf> {
61        let p = self.root_dir.join("columnar_cache");
62        fs::create_dir_all(&p)?;
63        Ok(p)
64    }
65
66    /// 메모리 초과 시 스필링할 객체 캐시(L2 Cache) 경로
67    pub fn l2_cache_dir(&self) -> io::Result<PathBuf> {
68        let p = self.root_dir.join("l2_cache");
69        fs::create_dir_all(&p)?;
70        Ok(p)
71    }
72
73    /// 임시 파일 저장소 (Plan 중간 산출물, Parquet 변환 등의 스왑 공간)
74    pub fn temp_dir(&self) -> io::Result<PathBuf> {
75        let p = self.root_dir.join("tmp");
76        fs::create_dir_all(&p)?;
77        Ok(p)
78    }
79
80    /// 데몬 기동 시 비정상 종료로 남은 고아 파일(Garbage)을 청소합니다.
81    pub fn cleanup_orphans(&self) -> io::Result<()> {
82        let tmp = self.root_dir.join("tmp");
83        if tmp.exists() {
84            info!("Cleaning up orphan temporary files in {:?}", tmp);
85            // 기존 폴더를 지우고 새로 생성 (모든 안의 내용물 파기)
86            fs::remove_dir_all(&tmp).ok();
87            fs::create_dir_all(&tmp)?;
88        }
89        Ok(())
90    }
91}