跳转到内容
AsterDrive Developer Docs开发者

Issue #486 Future 体积与分配证据

状态:历史快照。本文记录基线 revision 9b55dbfd18892e09227bfb0ff5de950586071dd5 与 issue #486 实现分支在 2026-08-08 的聚焦测量,不作为当前实现规范。当前行为以相关源码、测试和 clippy::large_futures 输出为准。

  • rustc 1.97.1 (8bab26f4f 2026-07-14),LLVM 22.1.6
  • cargo 1.97.1 (c980f4866 2026-06-30)
  • x86_64-unknown-linux-gnu,Linux 6.12.85+deb13-amd64
  • 基线与改后 checkout 共享同一 target,分别重新编译 AsterDrive crate
  • Future 体积来自同一条全 feature Clippy 命令;归档 copy helper 的精确体积来自 std::mem::size_of_val
  • 分配数据由线程局部启用的 System counting allocator 记录;输入、状态构造、认证 warm-up 和 5 MiB 上传 Bytes 均在测量区间外创建

默认 16 KiB 阈值命令:

Terminal window
RUSTC_WRAPPER= cargo clippy -p aster_drive --lib --all-features \
--message-format=short -- \
-W clippy::unused_async \
-W clippy::large_futures
边界基线改后结论
归档预览 copy helper65,792 B272 B内联 64 KiB 数组已移出状态机
归档解包 copy helper65,792 B272 B内联 64 KiB 数组已移出状态机
解包任务处理 Future67,448 B10,712 B改后值由临时 8 KiB 阈值复核
解包 task-spec 上层 Future67,736 B11,000 B不再触发默认阈值
预览任务处理 Future67,312 B< 8,192 B改后在临时 8 KiB 阈值下也未报告
预览 task-spec 上层 Future67,600 B< 8,192 B改后在临时 8 KiB 阈值下也未报告
个人上传 route23,616 B23,584 B同步化 helper 后减少 32 B,无装箱
团队上传 route23,624 B23,592 B同步化 helper 后减少 32 B,无装箱
上传 service 六个入口16,432/23,264 B16,400/23,232 B每个减少 32 B,无装箱
WebDAV dispatch27,280 B27,280 B未改变 dispatch 结构

临时 8 KiB 配置只用于取得归档上层改后数值,没有修改仓库阈值。该检查仍显示其他 8–16 KiB Future,因此不适合作为通用 CI 门槛。

归档 copy 测量使用空的精确长度输入和 sink writer,只覆盖 Future 首次 poll 到完成。上传测量使用 预先构造的 5 MiB Bytes 执行第一个 offset-staging chunk。WebDAV 测量先 warm-up 认证缓存,再执行 一次完整的 authenticated OPTIONS /webdav/ dispatch。

操作基线分配改后分配差值
归档预览 copy0 次 / 0 B1 次 / 65,536 B+1 次 / +65,536 B
归档解包 copy0 次 / 0 B1 次 / 65,536 B+1 次 / +65,536 B
5 MiB chunk upload346 次 / 2,184,661 B346 次 / 2,184,661 B0 次 / 0 B
WebDAV authenticated OPTIONS73 次 / 34,233 B73 次 / 34,233 B0 次 / 0 B

归档新增分配就是每次 copy 的一个固定 64 KiB Box<[u8]>,完整循环复用该缓冲区。上传和 WebDAV 没有新增每请求分配,因而没有引入 Box::pin、动态 Future dispatch 或其他热路径分配边界。

默认阈值下,主 crate 的 large_futures 从 17 条降至 9 条:

  • 归档 8 条级联警告全部消失;
  • 余下 8 条属于 upload route/service,1 条属于 WebDAV dispatch;
  • 四条 migration 警告保持不变,仍按顺序执行的 migration 路径单独处理。

五个生产 helper 的 unused_async 已清理。余下三条均为 src/services/auth/local/tokens/refresh.rs 的 debug/test-support hook:一次 contention 通知以及 test hook 的安装、清理入口。相邻的 pause hook 确实等待通知且未触发该 lint;这些入口均不属于本次生产路径清理。

两个 archive copy helper 的单元测试均覆盖:

  • 精确长度及内容保持;
  • 输入提前结束;
  • 输入超过声明长度;
  • shutdown/cancellation;
  • writer 失败传播;
  • Future 小于 16 KiB;
  • 每次 copy 恰好一次 65,536 B 缓冲区分配。