Preflight all externalized payload sizes before starting uploads

未关闭
#170 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
54/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
go
领域
backend, testing

调研方向

Read internal/largepayload/bounded.go and internal/largepayload/codec.go, then inspect the existing tests under internal/largepayload. Add a message-wide size-validation pass before storage operations begin, preserving the stated concurrency and cancellation behavior. Verify orchestration and entity batch cases, including valid fields before an oversized field, UTF-8 boundaries, all-valid messages, and cancellation; done means deterministic size failures make zero storage calls and leave original fields unchanged.

由索引模型根据 Issue 内容生成。

描述

bug

Outgoing payload transformations collect a plan, but the plan does not validate all payload sizes before dispatching storage operations. MaxPayloadBytes is checked inside each operation. A deterministically oversized later field can therefore be rejected only after valid earlier fields have already created stored payloads.

Current source evidence

Inspected current main at c713409eb9a4295884169c144df9221f9a42aef6.

  • TransformOrchestratorResponse adds custom status and action fields to a transformation plan.
  • transformPlan.add and run snapshot a field and queue a closure that calls the transform inside runBounded; they do not perform a message-wide size-validation pass.
  • Externalize checks the current raw payload maximum and then calls StoreToken or Store.
  • The worker abandons the orchestration work item if transformation fails. Earlier successful storage operations are not rolled back or registered with the backend by that abandonment.

Requested regression

Add a source-level regression to the existing internal/largepayload tests using a counting in-memory store/resolver, actual protobuf types and TransformOrchestratorResponse:

  1. Configure ThresholdBytes: 8 and MaxPayloadBytes: 32.
  2. Create a response with a valid 16-byte custom status, eight valid 20-byte ScheduleTask.Input fields, and a final 33-byte ScheduleTask.Input.
  3. Record store calls and original response field values before calling the real transform.
  4. Expect errors.Is(err, api.ErrLargePayloadTooLarge), zero Store/StoreToken calls, and unchanged original fields.

The response intentionally contains more fields than the eight-operation concurrency cap. With the current scheduler, a valid operation must complete and release a slot before the late oversized operation is reached, exposing the avoidable earlier storage write without relying on the relative start order of two goroutines. Repeat for TransformEntityBatchResult.

Evidence boundary: the current code establishes the missing message-wide preflight. The proposed Go regression has not been executed for this filing; the equivalent JavaScript case was reproduced and fixed.

Acceptance Criteria

  • Validate all relevant raw payload sizes in an outgoing transformation plan before starting any storage operation.
  • A deterministic maximum-size violation produces zero storage calls and leaves original payload fields unchanged.
  • Preserve current Go size-validation scope, provider-specific inclusive threshold policy, defaults and option normalization.
  • Preserve native-token and wrapped-reference idempotency, field deduplication, and snapshot-based transformation.
  • Once validation succeeds, retain bounded concurrency, cooperative cancellation, draining of dispatched operations and message-order I/O failure selection.
  • Preserve no-op/missing-configuration behavior and do not change hydration semantics as an unrelated part of this repair.
  • Add valid-first/oversized-later orchestration/entity cases, UTF-8 boundaries, all-valid messages and cancellation coverage.
  • Document that deterministic invalid size is found before hypothetical earlier storage I/O failures.

Non-goals

This is not a cross-store transaction or a generic orphan collector. Real I/O/cancellation/uncertain-submission failures can still leave stored data. Do not unconditionally delete earlier uploads after an uncertain completion outcome: the backend may already have accepted a reference.

Carryover history is already explicitly traversed, and TestTransformContinueAsNewCarryoverEvents covers a large event. The JavaScript carryover field omission does not need a separate Go issue.

Related

主要语言
Go
星标
312
派生
68
平均合并
1 天 5 小时
30 天内合并 PR
7

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

microsoft/durabletask-go 的其他 Issue

查看 microsoft/durabletask-go 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。