test(sync): 验证四个并发大型 HTTP 上传

This commit is contained in:
2026-09-09 06:40:45 +08:00
parent bab8d5ee4e
commit 866e7af444
4 changed files with 265 additions and 0 deletions
@@ -652,3 +652,12 @@ Core 的独立数据目录目前不等于已授权 Vault。Python 旧笔记写
- upload_chunk 原先在 async 路由中直接执行同步数据库锁等待、文件写入和 fsync,会阻塞该 worker 事件循环。现将整段事务/文件持久化交给 Starlette run_in_threadpool,连接在同一工作线程创建和提交,仍保持先刷盘再确认 offset 的协议顺序。接收块先检查剩余额度再扩展 bytearray,避免把超限块复制进应用缓冲区;ASGI 自身收到的块不计入该应用缓冲上限证明。
- 新增故障测试以 Event 持续阻塞 fsync,在同一 TestClient ASGI 事件循环中要求 /health 在 2 秒内响应且上传仍在等待;释放后检查偏移与 complete。另测 1 MiB 加 1 字节拒绝、fsync 异常事务回滚、未确认尾部协调截断、恰好 1 MiB 重试成功。
- uv run --project "server sync" pytest "server sync/tests" -q 全套 25 通过,耗时 7.80 秒,JUnit.build/sync-server-upload-threadpool.xml。依赖报告 2 项 TestClient/AnyIO 弃用警告,无测试失败。环境为 SQLite/DiskObjects 受控测试,不是 PostgreSQL/MinIO 两 worker 或 S-09 四并发 100 MiB 服务总 RSS/30 分钟负载证明;线程池饱和与真实部署验收仍需继续。完整生产化目标未完成。
## 增量:四客户端大附件传输验收入口
- 新增 server sync/tools/upload_benchmark.py,固定种子 20260908,两测试账号各两个新 Vault,四任务屏障同时开始默认 100 MiB 上传。内容逐个 1 MiB 生成,下载也逐块验证,不在驱动器构造完整附件。逐 offset、完整回执与 revision 重放、SHA256/长度、跨账号对象拒绝均为必过条件;准备失败会取消其他等待任务。
- 命令入口从本地凭据文件读取两个测试账号,不把凭据/令牌/异常原文写入输出;拒绝带认证信息/query/fragment 的 origin,不跟随重定向,HTTP 要求显式测试开关。整体运行限时 30 分钟;保留四个新测试 Vault,不删除既有数据。README 已列命令与隔离数据要求。
- 实际运行 Uvicorn TCP 回环测试:四个 1 MiB + 17 字节验证非整块末尾;四个 100 MiB 验证实际大对象。两项通过,耗时 16.28 秒;大对象上传至下载/隔离验证全部完成约 9.31 秒,400 MiB 内容全部摘要一致。日志 .build/sync-upload-benchmark.logJUnit .build/sync-upload-benchmark.xml。
- 此结果是同一 Python 进程内 SQLite/DiskObjects 单服务实例与 HTTP 客户端的受控检查,不是 PostgreSQL/MinIO 两 worker 基准。service_rss_bytes 明确 nullacceptance 明确 NOT_ASSESSED,不能将传输通过当作 RSS≤2 GiB 或完整 S-09 通过。本机 Get-Command docker 未找到可执行文件;生产拓扑/服务内存采集/30 分钟负载仍需继续。
- 最终 Sync 服务端全套 27 通过、2 项依赖弃用警告,22.39 秒;日志 .build/sync-server-four-upload-full.logJUnit .build/sync-server-four-upload-full.xml。用户 Vault 修改保持原状,完整生产化目标未完成。