Preflight all externalized payload sizes before starting uploads
还没有人认领这个 Issue。
评估
调研方向
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 内容生成。
描述
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.
TransformOrchestratorResponseadds custom status and action fields to a transformation plan.transformPlan.addandrunsnapshot a field and queue a closure that calls the transform insiderunBounded; they do not perform a message-wide size-validation pass.Externalizechecks the current raw payload maximum and then callsStoreTokenorStore.- 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:
- Configure
ThresholdBytes: 8andMaxPayloadBytes: 32. - Create a response with a valid 16-byte custom status, eight valid 20-byte
ScheduleTask.Inputfields, and a final 33-byteScheduleTask.Input. - Record store calls and original response field values before calling the real transform.
- Expect
errors.Is(err, api.ErrLargePayloadTooLarge), zeroStore/StoreTokencalls, 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
- JavaScript zero-upload preflight fix.
- .NET tracking issue 820.
- Go issue 169 tracks late worker failure completion and entity unlock cleanup. It does not cover message-wide validation before storage writes.
- 主要语言
- Go
- 星标
- 312
- 派生
- 68
- 平均合并
- 1 天 5 小时
- 30 天内合并 PR
- 7
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
microsoft/durabletask-go 的其他 Issue
-
bug
难度 5/5 一周以上 新手友好度 43/100
microsoft/durabletask-go#169 ·
-
难度 5/5 一周以上 新手友好度 25/100
microsoft/durabletask-go#156 · 1 个 reaction ·
查看 microsoft/durabletask-go 的全部 Issue
相似的 Issue
-
bug good first issue help wanted
难度 2/5 1-3 小时 新手友好度 70/100
-
[mesheryctl] design delete fails when passing file or URL as positional argument可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭component/mesheryctl kind/bug language/go
难度 2/5 1-3 小时 新手友好度 74/100
meshery/meshery#22772 · 3 条评论 ·
维护者通常 1 天内回复
-
backend security size:S
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
limitlessprojects/Go-Hybrid#3342 ·
维护者通常 1 天内回复
-
status/ready type/bug
难度 2/5 1-3 小时 新手友好度 65/100
buildpacks/pack#2733 ·
维护者通常 1 天内回复