Files
markbase/filetree-rocksdb/src/poc.rs
Warren 1300a4e223
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
MarkBase架构升级:Multi-Volume Virtual Tree + Dual-View Management + Git Remote修正
核心功能:
-  Categories/Series双视图管理(category_view.rs + import_markdown.rs)
-  FUSE Multi-Volume支持(tree_type参数)
-  SSH/SFTP/SCP/rsync协议完整实现(4042行)
-  NFS/SMB Module Phase 1-3完成
-  Archive Module Phase 1-4完成(2916行)
-  Download Center API完整实现
-  S3兼容API实现(560行)

Git配置修正:
-  删除错误origin(gitea.momentry.ddns.net)
-  删除m5max128(指向机器名)
-  设置origin = m5max128gitea.momentry.ddns.net/admin/markbase
-  设置m4minigitea = m4minigitea.momentry.ddns.net/warren/markbase

数据清理:
-  删除38个临时SQLite(保留accusys.sqlite、demo.sqlite)
-  删除.bak、test_*.bin、调试脚本等临时文件
-  删除临时目录(build/、download files/、raid_test/等)
-  更新.gitignore排除临时文件

架构优化:
- 52个文件修改,2434行新增,4739行删除
- Workspace成员整合(16个crate)
- 数据库状态:accusys.sqlite保留(主demo测试)

远程同步:
-  准备推送到m5max128gitea(远程Gitea)
-  准备推送到m4minigitea(本地Gitea)
2026-06-12 12:59:54 +08:00

121 lines
4.3 KiB
Rust

use anyhow::Result;
use std::time::{Duration, Instant};
fn main() -> Result<()> {
println!("=== FileTree RocksDB POC Performance Test ===\n");
let user_id = "test_rocksdb";
println!("Step 1: Initialize RocksDB database...");
let start = Instant::now();
let tree = filetree_rocksdb::FileTreeRocksDB::init_user_db(user_id)?;
let init_time = start.elapsed();
println!(" ✓ Init time: {:?}", init_time);
println!("\nStep 2: Insert 1,000 nodes (single insert)...");
let nodes: Vec<filetree_rocksdb::FileNode> = (0..1000)
.map(|i| filetree_rocksdb::FileTreeRocksDB::new_folder(&format!("folder_{}", i), None))
.collect();
let start = Instant::now();
for node in &nodes {
tree.insert_node(node)?;
}
let single_insert_time = start.elapsed();
let single_throughput = nodes.len() as f64 / single_insert_time.as_secs_f64();
println!(" ✓ Single insert: {:?}", single_insert_time);
println!(" ✓ Throughput: {:.2} nodes/sec", single_throughput);
println!("\nStep 3: Insert 10,000 nodes (batch insert)...");
let nodes_batch: Vec<filetree_rocksdb::FileNode> = (0..10000)
.map(|i| {
filetree_rocksdb::FileTreeRocksDB::new_folder(&format!("batch_folder_{}", i), None)
})
.collect();
let start = Instant::now();
tree.insert_node_batch(&nodes_batch)?;
let batch_insert_time = start.elapsed();
let batch_throughput = nodes_batch.len() as f64 / batch_insert_time.as_secs_f64();
println!(" ✓ Batch insert: {:?}", batch_insert_time);
println!(" ✓ Throughput: {:.2} nodes/sec", batch_throughput);
println!("\nStep 4: Query single node (10,000 iterations)...");
let test_node_id = &nodes_batch[5000].node_id;
let start = Instant::now();
for _ in 0..10000 {
let _ = tree.get_node(test_node_id)?;
}
let query_time = start.elapsed();
let query_latency = query_time.as_nanos() as f64 / 10000.0;
println!(" ✓ Total time: {:?}", query_time);
println!(" ✓ Average latency: {:.2} ns", query_latency);
println!("\nStep 5: Load all nodes...");
let start = Instant::now();
let all_nodes = tree.load_all()?;
let load_time = start.elapsed();
println!(" ✓ Load time: {:?}", load_time);
println!(" ✓ Nodes loaded: {}", all_nodes.len());
println!("\nStep 6: Concurrent reads (single process, simulated)...");
let db_path = filetree_rocksdb::FileTreeRocksDB::user_db_path(user_id);
let start = Instant::now();
for i in 0..10000 {
let node_id = format!("batch_folder_{}", i % 1000);
let _ = tree.get_node(&node_id)?;
}
let concurrent_time = start.elapsed();
let concurrent_ops = 10000;
let concurrent_throughput = concurrent_ops as f64 / concurrent_time.as_secs_f64();
println!(" ✓ Concurrent time: {:?}", concurrent_time);
println!(" ✓ Total ops: {}", concurrent_ops);
println!(" ✓ Throughput: {:.2} ops/sec", concurrent_throughput);
println!("\nStep 7: Database size...");
let db_size = get_directory_size(&db_path)?;
println!(
" ✓ DB size: {} bytes ({:.2} MB)",
db_size,
db_size as f64 / 1024.0 / 1024.0
);
println!(" ✓ Nodes count: {}", tree.count_nodes()?);
println!("\n=== Performance Summary ===");
println!(
"Single insert: {:?} ({:.2} nodes/sec)",
single_insert_time, single_throughput
);
println!(
"Batch insert: {:?} ({:.2} nodes/sec)",
batch_insert_time, batch_throughput
);
println!("Query latency: {:.2} ns", query_latency);
println!("Concurrent reads: {:.2} ops/sec", concurrent_throughput);
println!("DB size: {:.2} MB", db_size as f64 / 1024.0 / 1024.0);
println!("\nStep 8: Cleanup...");
std::fs::remove_dir_all(&db_path)?;
println!(" ✓ Test database removed");
println!("\n✅ POC Test completed successfully!");
Ok(())
}
fn get_directory_size(path: &str) -> Result<u64> {
let mut total_size = 0;
for entry in std::fs::read_dir(path)? {
let entry = entry?;
let metadata = entry.metadata()?;
if metadata.is_file() {
total_size += metadata.len();
} else if metadata.is_dir() {
total_size += get_directory_size(entry.path().to_str().unwrap())?;
}
}
Ok(total_size)
}