feat(bt): BT 下载完成后做种与做种限制 - #226
Merged
Merged
Conversation
下载完成后保留 librqbit torrent 句柄继续做种;做种限制支持总分享率/做种后 分享率/做种时长/不活跃时长四条件 AND/OR 组合,达标后可停止做种、删除任务 或删除任务和文件。上传量增量累计落库(uploaded_bytes/uploaded_at_completion), BT 上传纳入全局限速(speed_limit_bytes),任务列表与详情面板展示上传速度与 双分享率,做种设置页支持条件开关、时间单位与达标动作选择。 - 做种求值节拍经 aux 泵进主循环(主 select! 已满 64 分支,不新增分支) - 启动时重置残留做种态;会话失效/任务删除写入对应停止原因(SessionReleased/TaskDeleted) - 六个 bt.seed_* 配置键运行时热读,变更不再重建 BT 会话 - 云同步目录新增 6 键(bt.seed_*),44→50 基于 #118(作者 @lingdiansr)在最新 main 上重建,冲突一律以 main 现行代码为准。 Closes #74
- 迁移清单补 uploaded_bytes / uploaded_at_completion / seeding_status / seeding_message / seeding_started_at 五列:旧库升级后 TASK_COLUMNS 查询 会直接 no such column,任务列表加载失败,所有做种写库报错 - 删除下载期对 uploaded_bytes 的绝对值覆盖写:与 progress_reporter 的 增量累计(add_task_uploaded_bytes)互斥,librqbit 计数器在暂停/恢复后 归零时覆盖写会清掉已累计值;同步移除唯一调用方消失后的 update_task_uploaded_bytes helper
- 做种限制默认全部禁用(ratio/post_ratio/time/inactive 均 0),组合默认 OR、达标动作默认停止;完成任务默认持续做种直到用户手动停止 - 新增活动做种数上限 seed_max_active(kv bt_seed_max_active,0=不限): 超限完成任务进 FIFO 做种队列(librqbit 暂停、seeding_status=8), 槽位释放或上限热调后由 5s tick 的 reconcile 升/降级;下载并发 has_capacity 恢复只计 HTTP/FTP,做种与 BT 下载不再挤占下载槽 - 做种时长跨暂停/重启累计:新列 seeding_time_secs 存累计秒数, 激活 stint 叠加计时,每 tick 快照落库、停止/降级时结算;排队与 暂停期间不计时 - 分享率分母兜底:downloaded < total_size/100 时改用 total_size, 0 分母且有上传按无穷大处理,避免 recheck 恢复的任务比率失真 - 契约补齐:server WS TaskProgress 增补 uploadedBytes/seedingStatus/ seedingMessage 并保留做种期 live_speeds;REST TaskDto 同步增补 四字段并重新生成 openapi.json;hub/server bt_config_from_map 解析 seed_max_active(热读键,不触发会话重建)
- 设置页/Provider:四个做种限制默认关闭;新增「最大活动做种数」 数字选择器(0=不限制);云同步 enable 语义修复——对外值为 enabled ? value : 0,应用 0 即禁用且保留本地缓存值,关闭状态 不再被其他设备同步回开 - 云同步目录新增 bt.seed_max_active,44→51 键;同步行为测试覆盖 禁用上报 0 / 应用 0 禁用 / 应用正值启用与往返 - SeedingStatus 新增 queued(8):做种 Tab 归类可见、独立文案 (排队做种/Queued for seeding),i18n en/zh 成对补齐
每任务 4 项覆盖:总分享率/做种后分享率(千分比整数存储,1500=1.5)、 做种时长/不活跃时长(分钟)。哨兵:-2 跟随全局、-1 不限制、>=0 自定义 (0 视同不限制);组合方式与达标动作恒取全局。 - tasks 表新增 4 列(DEFAULT -2,幂等迁移),TaskInfo/TASK_COLUMNS 同步 - 做种求值改为逐任务生效配置:SeedLimitOverrides::apply 解析后进 evaluate_limits,全局全关时任务自定义值仍可生效 - 写入路径热生效:桌面走 SetTaskSeedLimits 信号(经 aux 泵,不占主 select! 分支),headless 走 WS setTaskSeedLimits → ActorCmd - REST/WS 快照 TaskDto 增补同名 4 字段并重新生成 openapi.json - 补齐 api crate 测试夹具历史缺口(aria2/jsonrpc/mcp/tests 的 TaskDto、 task_referrer 的 TaskInfo 缺做种字段,此前测试目标无法编译)
详情面板 BT 做种区新增「做种限制」行:三态摘要(跟随全局/不限制/ 自定义)+ 编辑对话框;自定义模式按条件逐行开关,分享率小数输入 (内部千分比取整)、时长按分钟。确认后乐观更新本地任务并发 SetTaskSeedLimits 信号。copyWith 透传 4 个覆盖字段,避免进度更新 把值重置。i18n en/zh 成对新增 4 键。
引擎(review 发现 1 blocker + 2 major + 6 minor,全部修复):
- batch_pause 补做种/排队任务收集(status=3 且 seeding_status∈{1,8} 不在
active_tasks/pending_queue,此前「暂停全部」对做种者完全无效)
- batch_resume 经 try_resume_seeding 走做种恢复,不再把已完成种子重新
拉回下载流水线;单任务与批量共用同一分支,停止态(2..=7)均可重新做种
- uploaded_at_completion 基线改用跨会话累计尺度(DB 累计与会话计数器
取大者):下载期暂停/续传过的任务完成瞬间 post-ratio 不再虚高误停
- last_uploaded_bytes 统一 DB 累计尺度,apply_upload_snapshot 只按
正增量/速度刷新不活跃计时器,消除双尺度误重置
- promote/恢复 unpause 失败回滚注册并保持停止态,不再谎报做种中
- 完成注册与 reconcile 的跨运行时竞争自愈:暂停后以 SeedingManager
内存态为准复核,消除 DB=排队/内存=活跃/torrent=暂停 的永久失配
- 删除前的 TaskDeleted 状态写入是死写(行随即被删),移除
- reset_stale_seeding 查询失败改 break,保留已收集行的重置
- progress_reporter 不再为做种任务保留状态表项(做种统计不经 reporter,
保留只会常驻泄漏);删除无调用方的 TaskInfo::is_seeding/seed_ratio
与 SeedingManager::active_count
桌面端:
- 补「继续做种」入口:停止态任务的悬浮操作与右键菜单显示恢复按钮,
resumeTask 乐观守卫从仅 userStopped 扩展到全部停止态,限制达标的
任务不再被误标为 resuming;i18n en/zh 新增 seedingResume
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概述
取代 #118:将其真实改动(+3,446 −470)在最新
main上重建,原 PR 的 3.2 万行 CRLF/LF 行尾噪音已全部剔除,功能提交保留原作者 @lingdiansr 署名。uploaded_bytes/uploaded_at_completion),暂停/恢复与会话重建后不清零。speed_limit_bytes);列表/详情展示上传速度与双分享率;做种设置页支持条件开关、时间单位与达标动作。bt.seed_*),44→50,无需改动 FluxCloud。冲突取舍(一律以 main 现行代码为准)
select!已顶满 64 分支硬上限,原 PR 的独立 tick 分支会直接编译失败;现按 main 既定范式并入AuxSignal::SeedingTick(hub 侧)。server 侧 select! 未近上限,保留独立分支。build_opts闭包)、暂停 webhook(task.paused)、_selectTaskView导航、settings 的 notify 分类、RSS/任务组信号泵与rss_source_id/origin_url/auto_route列。相比 #118 额外修复(review 硬伤)
uploaded_bytes/uploaded_at_completion/seeding_status/seeding_message/seeding_started_at五列的add_column_if_missing——否则升级用户的TASK_COLUMNS查询直接no such column,任务列表加载失败。uploaded_bytes的绝对值覆盖写(librqbit 计数器暂停/恢复归零后会清掉已累计值),统一由progress_reporter增量累计;移除失去调用方的update_task_uploaded_bytes。验证
cargo fmt --check✅cargo clippy -p fluxdown_engine -p hub -p fluxdown_server --lib -- -D warnings✅cargo check -p fluxdown_api -p fluxdown_cli✅cargo nextest run -p fluxdown_engine -p fluxdown_server -p hub:1056 passed ✅rinf gen+flutter analyze lib test:No issues ✅flutter test(sync_catalog / task_referrer / number_selector / shutdown_service):49 passed ✅后续更新(对齐 qBittorrent 语义)
原「遗留跟进」四项已全部在
663dedc/26c3d20落地,语义按 qBittorrent 对标:has_capacity恢复只计 HTTP/FTP;做种与 BT 下载不占下载槽。新增 最大活动做种数bt_seed_max_active(0=不限,默认 0),超限完成任务进 FIFO 做种队列(seeding_status=8排队做种),槽位释放/上限热调后 5s tick 自动升降级。seeding_time_secs,激活期间叠加计时、每 tick 快照、停止结算;排队/暂停不计时。seeding_started_at保留为本次 stint 起点信息。downloaded < total_size/100时以total_size为分母;零分母且有上传视作无穷大。TaskProgress增补uploadedBytes/seedingStatus/seedingMessage,做种期保留live_speeds;RESTTaskDto同步增补并重新生成openapi.json。bt.seed_max_active(51 键),行为测试覆盖。任务级做种限制覆盖(
ba9bf6e/b71570b)-2跟随全局、-1不限制、>=0自定义;组合方式与达标动作恒取全局。SetTaskSeedLimits信号(经 aux 泵);headless WSsetTaskSeedLimits→ActorCmd;TaskDto快照/REST 同步透出并重新生成 openapi.json。终审(独立 reviewer + 主控双轨,发现 9 项全部修复,
c8f9859)uploaded_at_completion误用 librqbit 会话计数器(暂停/续传过的任务完成瞬间 post-ratio 虚高,可致误停甚至误删)→ 基线改跨会话累计尺度。try_resume_seeding单任务/批量共用;停止态(含限制达标)均可重新做种,桌面补「继续做种」入口。last_uploaded_bytes双尺度、TaskDeleted 死写、promote 失败谎报、注册/reconcile 跨运行时竞态自愈、reset_stale_seeding半途丢弃、reporter 做种表项泄漏与死代码清理。已复核无问题:状态迁移矩阵(含 8=排队全路径)、计时无双计/回退窗口、reconcile 单线程无重入、任务级覆盖三态解析与参数顺序、无过时注释/非测试 unwrap。
仍为后续项:无(qBit 语义对标完成)。
验证(最新 head
c8f9859)cargo fmt --check/clippy -D warnings(engine+hub+server+api) ✅cargo nextest run(engine+server+hub+api):1239 passed ✅(api 测试目标首次纳入,顺带修复了分支上既有的夹具缺字段)cargo test --doc -p fluxdown_api✅ · openapi.json 已再生成 ✅rinf gen+flutter analyze lib test:No issues ✅ ·flutter test:54 passed ✅Closes #74