refactor: reduce quality findings

This commit is contained in:
2026-06-28 15:42:12 +08:00
parent 02716d3ccd
commit 3c00659691
11 changed files with 189 additions and 135 deletions
+19 -17
View File
@@ -76,7 +76,8 @@ impl FileSystemCasRepository {
/// 读取对象并验证 Hash。
pub async fn get(&self, hash: &Hash) -> Result<Vec<u8>> {
self.storage.get(hash).await
let data = self.storage.get(hash).await?;
Ok(data)
}
/// 检查对象是否存在。
@@ -92,7 +93,8 @@ impl FileSystemCasRepository {
let size = self.storage.size(hash).await?;
self.ref_counter.ensure_object(hash, size).await?;
self.ref_counter.add_reference(hash).await
let count = self.ref_counter.add_reference(hash).await?;
Ok(count)
}
/// 减少引用计数。
@@ -146,10 +148,15 @@ mod tests {
use super::*;
use std::sync::Arc;
#[tokio::test]
async fn store_increments_reference_count() {
async fn temp_repo() -> (tempfile::TempDir, FileSystemCasRepository) {
let temp_dir = tempfile::tempdir().unwrap();
let repo = FileSystemCasRepository::new(temp_dir.path()).await.unwrap();
(temp_dir, repo)
}
#[tokio::test]
async fn store_increments_reference_count() {
let (_temp_dir, repo) = temp_repo().await;
let hash = repo.store(b"same data").await.unwrap();
let second = repo.store(b"same data").await.unwrap();
@@ -161,8 +168,7 @@ mod tests {
#[tokio::test]
async fn gc_deletes_only_zero_reference_objects() {
let temp_dir = tempfile::tempdir().unwrap();
let repo = FileSystemCasRepository::new(temp_dir.path()).await.unwrap();
let (_temp_dir, repo) = temp_repo().await;
let keep = repo.store(b"keep").await.unwrap();
let delete = repo.store(b"delete").await.unwrap();
@@ -180,8 +186,8 @@ mod tests {
#[tokio::test]
async fn concurrent_store_is_safe_and_counts_references() {
let temp_dir = tempfile::tempdir().unwrap();
let repo = Arc::new(FileSystemCasRepository::new(temp_dir.path()).await.unwrap());
let (_temp_dir, repo) = temp_repo().await;
let repo = Arc::new(repo);
let mut tasks = Vec::new();
for _ in 0..32 {
@@ -203,13 +209,11 @@ mod tests {
#[tokio::test]
async fn corrupted_object_is_detected_through_repository() {
let temp_dir = tempfile::tempdir().unwrap();
let repo = FileSystemCasRepository::new(temp_dir.path()).await.unwrap();
let (_temp_dir, repo) = temp_repo().await;
let hash = repo.store(b"valid").await.unwrap();
tokio::fs::write(repo.storage().object_path(&hash), b"invalid")
.await
.unwrap();
let write_result = tokio::fs::write(repo.storage().object_path(&hash), b"invalid").await;
write_result.unwrap();
assert!(matches!(
repo.get(&hash).await,
@@ -219,8 +223,7 @@ mod tests {
#[tokio::test]
async fn add_reference_requires_existing_object() {
let temp_dir = tempfile::tempdir().unwrap();
let repo = FileSystemCasRepository::new(temp_dir.path()).await.unwrap();
let (_temp_dir, repo) = temp_repo().await;
let missing = compute_hash(b"missing");
assert!(matches!(
@@ -231,8 +234,7 @@ mod tests {
#[tokio::test]
async fn remove_reference_does_not_go_below_zero() {
let temp_dir = tempfile::tempdir().unwrap();
let repo = FileSystemCasRepository::new(temp_dir.path()).await.unwrap();
let (_temp_dir, repo) = temp_repo().await;
let hash = repo.store(b"underflow").await.unwrap();
assert_eq!(repo.remove_reference(&hash).await.unwrap(), 0);