feat: harden multi-user download concurrency
This commit is contained in:
@@ -105,3 +105,19 @@ go build -o am-downloader .
|
||||
升级前仍建议先备份 `data/downloader.db`。Docker 部署时不要把 `data/` 或 `downloads/` 加入 Git。
|
||||
|
||||
当前版本不会主动删除旧媒体文件;媒体资源记录缺失本地文件时会在下一次请求中重新取得资源。
|
||||
|
||||
## 多用户并发与恢复
|
||||
|
||||
下载任务和共享媒体资源分离:
|
||||
|
||||
- 同一 source + rid + quality 只允许一个 Asset 物理下载,多个用户 Task 可以共享。
|
||||
- 每个用户 Task 保留独立 WebDAV 目标路径、状态和额度预留。
|
||||
- Task 使用数据库条件更新抢占状态,重复点击不会启动多个 worker。
|
||||
- Asset 使用数据库租约(heartbeat/lease)防止 worker 崩溃后永久占锁;过期租约会自动恢复旧任务。
|
||||
- 下载文件使用按 Asset/generation 隔离的缓存目录和 task-specific .part 临时文件,避免并发用户覆盖同一个本地文件。
|
||||
- WebDAV 上传采用独立的 upload_pending -> uploading -> done 状态机;上传失败只重试上传,不重新扣积分。
|
||||
- 已提交额度的历史失败任务会自动恢复;已退款任务不会因为后台 resync 被无条件重新扣费。
|
||||
- SQLite 使用 WAL + busy timeout,并对关键事务做锁冲突重试;高并发写入仍由 SQLite 单写者模型串行化。
|
||||
- 本地共享文件只有在没有其他活动 Task 需要时才允许清理。
|
||||
|
||||
并发回归测试覆盖:Task 抢占、共享 Asset 租约恢复、已提交额度重试、已退款额度重试、并发积分预留以及 Asset generation 隔离。
|
||||
|
||||
Reference in New Issue
Block a user