Files
fanqie-go/internal/fqapi/cache_manager_test.go
T
chenxin f0d89b462b ⚡️ perf(fqapi): 移除缓存层全局串行锁
- 删除 cache_manager/audio_proxy/device_key_pool 中 21 处 cacheMutex:database/sql 连接池本身并发安全,SQLite 已配 WAL + busy_timeout,PostgreSQL 无并发写限制
- contentRequestCount 三函数由互斥锁改为 atomic.Int64
- cache_manager 中 config.GetConfig() 改为 GetAppConfig(),消除配置未初始化时 log.Fatal 崩溃整个进程的隐患
- VACUUM 与写操作的低频并发冲突由 busy_timeout 兜底(已注释说明)
- 新增 TestConcurrentCacheAccess:8 goroutine 并发读写缓存,-race 验证无死锁无竞争
2026-09-29 23:21:10 +08:00

58 lines
1.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package fqapi
import (
"database/sql"
"fanqie/internal/config"
"fmt"
"sync"
"testing"
_ "github.com/mattn/go-sqlite3"
)
// TestConcurrentCacheAccess 验证删除全局串行锁后并发读写缓存不死锁、不 panic、数据正确(配合 -race)
func TestConcurrentCacheAccess(t *testing.T) {
if err := config.LoadConfig("../../config/config.yaml"); err != nil {
t.Skipf("无法加载配置: %v", err)
}
db, err := sql.Open("sqlite3", t.TempDir()+"/test.db?_journal_mode=WAL&_busy_timeout=5000")
if err != nil {
t.Fatal(err)
}
oldDB, oldDriver := cacheDB, dbDriver
cacheDB, dbDriver = db, "sqlite3"
defer func() {
cacheDB, dbDriver = oldDB, oldDriver
db.Close()
}()
if _, err := db.Exec(`CREATE TABLE IF NOT EXISTS cache (
key TEXT PRIMARY KEY,
value TEXT,
created_at INTEGER DEFAULT (strftime('%s', 'now'))
)`); err != nil {
t.Fatal(err)
}
var wg sync.WaitGroup
for i := 0; i < 8; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
for j := 0; j < 30; j++ {
key := fmt.Sprintf("k-%d-%d", i, j)
if err := UpdateCache(key, "value-"+key, 60); err != nil {
t.Errorf("UpdateCache(%s): %v", key, err)
return
}
if got := GetCache(key); got != "value-"+key {
t.Errorf("GetCache(%s) = %q, want %q", key, got, "value-"+key)
return
}
}
}(i)
}
wg.Wait()
}