You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
core: side-channel frames for executor progress and task logs #590
extra_len follows the result_len convention already in Success: None is no payload, Some(0) an empty one. publish is a TaskLog at level result, so it needs no frame of its own.
Added to SchedulerMessage::Job, both #[serde(default)] so an executor built before this ignores them:
Neither addition bumps PROTOCOL_VERSION. Bumping it would reject every mismatched peer outright — deliberate for a real wire break, wrong here, and it would couple scheduler and executor releases in the one place #546 exists to decouple.
Client
ExecutorClient grows an outbound side-channel the bindings can hand to their dispatchers — the sink a running task reports through. Requirements:
Tasks never touch the shared Mutex<FrameWriter>; the sink is a bounded channel drained by the existing result thread, so a task in a progress loop cannot stall the writer or starve results.
Progress coalesces to latest-per-job under backlog. Logs cannot (each is data), so the queue drops oldest and counts what it dropped.
Nothing is emitted unless hello_ack advertised the capability. Dropping silently on an unadvertised scheduler is correct — the executor cannot know why, and failing the job over a progress call would be worse than the degradation this replaces.
Done when
executor_tests.rs covers, over MemoryTransport against a real RemoteDispatcher: a progress frame reaching the scheduler; a publish arriving as a TaskLog at level result; the job frame carrying disabled_middleware and metadata intact; a full outbound queue coalescing progress and dropping logs rather than blocking the task; and a scheduler advertising no capability receiving no such frames at all.
Done in #604 (5134fcf). ExecutorSideChannel::dropped_task_logs() exposes the shed counter, and a_full_outbound_queue_coalesces_progress_and_sheds_the_oldest_logs fills the queue deterministically — a gated write half rather than a race against the drain — asserting the flood never parks the task, that the oldest lines are shed, that the newest still arrives, and that 500 progress reports coalesce to at most two frames.
Activity
feat: close the executor side-channel gaps (#590, #591, #593) (#604)
pratyush618 commentedon Aug 2, 2026
Done in #604 (5134fcf).
ExecutorSideChannel::dropped_task_logs()exposes the shed counter, anda_full_outbound_queue_coalesces_progress_and_sheds_the_oldest_logsfills the queue deterministically — a gated write half rather than a race against the drain — asserting the flood never parks the task, that the oldest lines are shed, that the newest still arrives, and that 500 progress reports coalesce to at most two frames.