dualcache-ff 1.0.1

A wait-free, high-performance concurrent cache optimized for extreme read-to-write ratios.
Documentation
# DualCache-FF 專案原始碼深度審計報告

## 一、 專案概述與 README 聲稱分析
`DualCache-FF` 是一套基於無鎖/待機自由(Wait-Free)架構的高效能多級狀態快取核心。其 README 宣稱具備極限吞吐量、O(1) 的熱度追蹤、無鎖的讀寫通道以及高效的背景回收機制。

### 1.1 聲稱合理性評估
代碼審計表明,其核心讀寫路徑(T0, T1, T2 多級緩衝)確實實現了精確的無鎖設計,特別是與線程局部存儲(TLS)結合的設計,能極大地降低多核心之間的緩存一致性(Cache Coherency)開銷。README 的聲稱在核心數據結構上是成立的,但在背景回收線程的生命週期管理和邊界死鎖風險上,仍存在一定的細節缺陷。

在分佈式數據庫或大型緩存架構中,多核競爭引起的緩存行失效(False Sharing)是限制並發的致命瓶頸。本專案通過嚴格的二進制結構對齊以及線程私有的操作計數,使得大多數寫操作限制在本地核心,這在理論和實踐上都是非常卓越的設計。然而,其垃圾回收線程與 QSBR 的鎖定機制在極端狀況下仍有掛起風險,這在 README 中被刻意簡化了。

---

## 二、 功能完備性與妥協模擬審查
`DualCache-FF` 的代碼庫在功能完備性上表現良好,沒有明顯的硬編碼模擬或功能缺失。核心的 `DualCacheCore` 和多個快取策略(如指數淘汰策略)均已完整實現。

### 2.1 線程局部存儲(TLS)與 QSBR 的複雜性
本專案實現了複雜的 `TlsRegistry`,為每個註冊的線程分配一個 `TlsBlock`:
```rust
pub struct TlsRegistry<K, V, const M: usize, const C: usize, const I: usize> {
    blocks: [UnsafeCell<no_std_tool::sync::CachePadded<TlsBlock<K, V, C, I>>>; M],
    ...
}
```
這個架構利用 `CachePadded` 實現了對齊,防止偽共享(False Sharing)。然而,這種靜態分配上限的設計也帶來了限制:當線程數量超過預設的 `MAX_THREADS` 時,`register_thread` 將直接拋出錯誤並觸發 panic,這使得系統在面對動態高並發請求(如臨時突發的高並發連接)時缺乏彈性,在生產環境中容易引發整個系統的崩潰。

### 2.2 垃圾回收的 Admit 閥門
專案中設置了 admission filter,某些項目需要寫入多次才能通過准入過濾器寫入 Core,這在測試代碼中被證實(例如測試中多次調用 `insert` 才能成功 `get`)。這種設計是合理的性能折衷,以防止一次性突發寫入污染熱區,但在 README 中並未被突出說明,可能導致用戶在初次測試時誤以為數據丟失或寫入失效。

---

## 三、 no_std 封裝與引用規範性審查
`DualCache-FF` 在 no_std 封裝和引用規範性上非常嚴格,成功引入了 `no_std_tool` 作為底層依賴。

### 3.1 no_std 引用分析
專案在非 `std` 模式下宣告為 `no_std`,並從 `no_std_tool` 引用了多個重要原件:
1. **`lazy_static`**:用於全域快取狀態的宣告。
2. **`CachePadded`**:在 `TlsBlock` 的數組對齊中使用,避免多線程訪問時的 Cache Line Bouncing。
3. **`BoundedQueue`**:在 `DaemonMessage` 通道和 hit queue 廣播通道中作為底層無鎖隊列。
4. **`SpinMutex`**:用於靜態全局 cache 鎖定。

這符合「no_std 邏輯完全封裝於 no_std_tool」的架構規範,成功實現了代碼層面的解耦,使核心代碼能夠順利在沒有標準庫支持的邊緣環境下運行。

---

## 四、 執行緒生命週期與記憶體釋放安全審查
`DualCache-FF` 中最重要的執行緒為背景的 `Daemon` 線程。

### 4.1 守護線程生命週期(Daemon Thread Lifecycle)
在啟用 `daemon_mode` 後,專案會調用 `std::thread::spawn` 啟動背景 GC 線程:
```rust
pub fn set_daemon_mode(&'static self, on: bool) {
    ...
    let daemon = crate::componant::daemon::Daemon::spawn(&self.core, rx, broadcast_txs, daemon_node);
    ...
}
```
在 `DualCacheFF` 的 `Drop` 實現中,專案通過以下代碼來保證守護線程的優雅關閉與資源釋放:
```rust
impl Drop for DualCacheFF {
    fn drop(&mut self) {
        self.daemon_mode.store(false, Ordering::SeqCst);
        self.cata_mode.store(false, Ordering::SeqCst);
        if let Ok(mut gtx) = self.global_tx.write() { *gtx = None; }
        self.tls_registry.clear_channels();
        if let Ok(mut handle_guard) = self.daemon_handle.write()
            && let Some(mut daemon) = handle_guard.take() {
            daemon.join();
        }
    }
}
```
### 4.2 內存安全評估
通過 `Drop` 時將 `daemon_handle` 中的線程進行 `join()`,本專案實現了標準的 RAII 模式,保證了在快取銷毀時背景線程的資源和棧內存會被 OS 徹底釋放。
然而,專案存在一個隱藏風險:QSBR 節點(`ThreadStateNode`)在線程註冊時被分配,但如果線程在快取銷毀前沒有主動註銷(或被異常終止),這些節點的內存將會洩漏,並且可能導致 epoch 無法前進,觸發 **Epoch Stall Deadlock**,進而導致全局垃圾無法回收,內存無限制膨脹。

---

## 五、 綜合審計結論與具體改進建議

### 5.1 綜合評級:優良 (Excellent)
`DualCache-FF` 是一套高質量的並發快取庫,no_std 封裝良好,執行緒退出機制健全,核心無鎖算法實現完整且無妥協性模擬。

### 5.2 具體改進建議
1. **動態線程自適應擴容**   `TlsRegistry` 中靜態數組改為基於 `no_std_tool` 的待機自由鏈表,以支持動態線程註冊,避免因高並發線程膨脹導致 panic。
2. **QSBR 節點自動清理**   在線程退出的 thread-local 析構函數中增加自動登出機制,防止因線程未調用登出導致 QSBR 鎖死。
3. **優化垃圾回收退避**   在守護進程讀取無鎖隊列時,如果隊列長期為空,應引入帶超時的等待或指數退避,而非簡單地在 loop 中忙等待,降低 CPU 能耗。