Follow-up to #57.
Control frames (WorkUnit, FeedEof, TaskMetrics, SetPlan) currently encode their target task in partition with task_id = 0. Move the task to task_id and use partition = 0 for control frames.
Also preserve the original frame kind in chunk reassembly. Once a frame is chunked, a data frame and a control frame can otherwise share (sender_proc, stage_id, task_id, partition) and overwrite or corrupt the same partial assembly.
Acceptance criteria:
- Control-frame routing reads the task from
task_id.
- Chunk assembly distinguishes the original frame kind.
- A deterministic regression test interleaves colliding oversized data and control frames.
- Keep the
stream_cancelled kind guard; this is cleanup, not a reason to remove it.
Follow-up to #57.
Control frames (
WorkUnit,FeedEof,TaskMetrics,SetPlan) currently encode their target task inpartitionwithtask_id = 0. Move the task totask_idand usepartition = 0for control frames.Also preserve the original frame kind in chunk reassembly. Once a frame is chunked, a data frame and a control frame can otherwise share
(sender_proc, stage_id, task_id, partition)and overwrite or corrupt the same partial assembly.Acceptance criteria:
task_id.stream_cancelledkind guard; this is cleanup, not a reason to remove it.