Skip to content

[Bug]: reverse tunnel 中断写入缺少跨 driver 原子提交与清理契约 #555

Description

@AptS-1547

背景

reverse tunnel 的 shutdown / EOF / heartbeat 失败会终止 follower 侧 internal-storage 请求,但不同 storage driver 对“写入进行中连接断开”的结果没有统一的原子提交和清理合同。当前隧道层可以让 pending request 返回 transient error、取消 follower 本地请求,并在 Primary lane drop 时释放等待者;这只能保证传输层收尾,不能证明最终对象状态一致。

已确认的风险面

  • Local put_reader 先写临时文件、校验 declared size 后 rename,失败路径相对明确。
  • S3 单对象 PUT 通常在完整请求后才产生可见对象,但需要测试连接取消、重试和同 key 覆盖。
  • SFTP put_reader 直接 create 最终远端路径并流式写入;连接中断可能留下可见的半对象,下一次重试还可能覆盖或读到错误内容。
  • Azure Blob / OneDrive 等 multipart 或 upload-session driver 可能已上传 provider-side part / fragment,但最终 commit 尚未发生;需要定义未提交分片的清理、过期和重试归属。
  • Remote follower relay、compose、presigned / resumable 路径需要分别证明 abort 后的对象可见性、引用和临时资源状态。

目标

建立跨 driver 的 interrupted-write contract:传输取消、Primary shutdown drain 超时、follower shutdown、EOF/reset、heartbeat timeout 和请求重试之后,调用方能明确知道对象是完整提交、未提交、可安全重试还是需要后台清理。

验收标准

  • 每个 stream-upload driver 明确并测试 successdeclared-size mismatch、reader error、transport cancellation、peer disconnect、process shutdown、retry same key 的最终对象状态。
  • SFTP 不直接把未完成内容暴露为最终对象,采用临时路径 + 原子 rename 或等价提交策略;失败、取消和超时清理临时对象。
  • Azure / OneDrive / 其他 multipart session 在取消后定义 provider-side part/session 的清理或过期机制,并记录无法立即清理的可观测状态。
  • Local、S3、Remote relay、compose、presigned/resumable 的成功对象、半对象、临时对象和引用计数边界有集成测试。
  • Primary shutdown drain 超时和 tunnel registration drop 的错误映射不吞掉底层 cleanup 失败;重试不会读到旧版本或半对象。
  • audit / task / metrics 只记录结构化错误分类和对象标识,不写入 access key、secret、signature、token。

Metadata

Metadata

Assignees

Labels

Priority: MediumMedium priority issueScope: Remote NodesPrimary/follower nodes, remote storage targets, and internal routingScope: RuntimeRuntime lifecycle, async execution, tasks, and process-level performanceScope: StorageStorage policies, connectors, drivers, provider capabilities, and storage backendsScope: UploadUpload negotiation, sessions, staging, completion, and ingress consistencyStatus: ReadyTriaged and ready to start in its assigned milestone

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions