Add CLI implementation and MVP performance review

- Implement functional CLI with clap argument parsing
- Add directory scanning and metadata extraction at startup
- Fix filesystem.rs to store tokio Handle for async/sync bridge
- Fix flake.nix with LD_LIBRARY_PATH for libfuse3
- Add MVP performance review with real-world benchmark results

Benchmarks show:
- Mount time: 8ms (target <500ms)
- Throughput: 2-3 GB/s (target >500 MB/s)
- Identifies critical gap: incomplete file caching (only ~2MB per file)
- Identifies missing CDC chunking per architecture spec
This commit is contained in:
Alexander
2026-05-12 19:28:13 +02:00
parent c46750b1ec
commit 7ad554f8d5
7 changed files with 698 additions and 11 deletions
+15 -5
View File
@@ -9,6 +9,7 @@ use std::ffi::OsStr;
use std::path::Path;
use std::sync::{Arc, RwLock};
use std::time::{Duration, SystemTime};
use tokio::runtime::Handle;
use tracing::{debug, info, warn};
const TTL: Duration = Duration::from_secs(1);
@@ -17,24 +18,27 @@ const BLOCK_SIZE: u32 = 512;
pub struct MusicFs {
tree: Arc<RwLock<VirtualTree>>,
reader: Option<Arc<FileReader>>,
runtime_handle: Handle,
uid: u32,
gid: u32,
}
impl MusicFs {
pub fn new(tree: Arc<RwLock<VirtualTree>>) -> Self {
pub fn new(tree: Arc<RwLock<VirtualTree>>, runtime_handle: Handle) -> Self {
Self {
tree,
reader: None,
runtime_handle,
uid: unsafe { libc::getuid() },
gid: unsafe { libc::getgid() },
}
}
pub fn with_reader(tree: Arc<RwLock<VirtualTree>>, reader: Arc<FileReader>) -> Self {
pub fn with_reader(tree: Arc<RwLock<VirtualTree>>, reader: Arc<FileReader>, runtime_handle: Handle) -> Self {
Self {
tree,
reader: Some(reader),
runtime_handle,
uid: unsafe { libc::getuid() },
gid: unsafe { libc::getgid() },
}
@@ -241,8 +245,11 @@ impl Filesystem for MusicFs {
};
let reader = reader.clone();
let result = tokio::runtime::Handle::current().block_on(async {
reader.read(file_id, offset as u64, size).await
let handle = self.runtime_handle.clone();
let result = std::thread::scope(|_| {
handle.block_on(async {
reader.read(file_id, offset as u64, size).await
})
});
match result {
@@ -410,11 +417,14 @@ mod tests {
#[test]
fn test_tree_integration() {
let runtime = tokio::runtime::Runtime::new().unwrap();
let handle = runtime.handle().clone();
let mut builder = TreeBuilder::new();
builder.add_file(&make_file_meta(1, "/Artist/Album/Track.flac", 30_000_000));
let tree = Arc::new(RwLock::new(builder.build()));
let _fs = MusicFs::new(tree.clone());
let _fs = MusicFs::new(tree.clone(), handle);
let tree_read = tree.read().unwrap();
assert!(tree_read.get(ROOT_INODE).is_some());