fix(test): InMemory 仓储并发安全——加锁模拟 DB partial unique index (#1775) #1784
Reference in New Issue
Block a user
Delete Branch "fix/inmemory-repo-concurrency-1775"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
CI develop 分支 Unit Tests 中
test_concurrent_10_calls_only_one_project失败:根因:
InMemoryProjectRepository和InMemoryAssetLibraryRepository的get_or_create_default_*方法采用 find-then-create 模式,但没有并发保护。多线程同时调用时,多个线程都 find 不到已存在的项目/素材库,各自创建,导致重复。生产环境无此问题:PostgreSQL 的 partial unique index (
uq_projects_owner_default) 在 DB 层面兜底,SQLAlchemy 仓储捕获 IntegrityError 后重试 find。但内存实现没有等效机制。修复
给两个 InMemory 仓储的
get_or_create_default_*方法加threading.Lock,模拟 DB 唯一约束的原子语义。改动
packages/adapters/in_memory/project_repository.py:__init__加self._lock,get_or_create_default_project整体包在with self._lock:中packages/adapters/in_memory/asset_library_repository.py:同理15 个 #1775 测试全过(含并发测试)。
🚀 预览环境已部署
🗑️ 预览环境已清理
PR #1784 已关闭或合并,对应的预览环境已被清理。