Skip to content

Separate (delayed) responses (roadmap 1.2)#38

Merged
cvik merged 4 commits intomainfrom
separate-responses
Mar 16, 2026
Merged

Separate (delayed) responses (roadmap 1.2)#38
cvik merged 4 commits intomainfrom
separate-responses

Conversation

@cvik
Copy link
Owner

@cvik cvik commented Mar 16, 2026

Summary

Handlers can now defer CON responses — the server sends an empty ACK immediately and delivers the actual response later as a separate CON with retransmission.

API

fn slow_handler(req: coap.Request) ?coap.Response {
    const deferred = req.deferResponse() orelse return Response.ok("sync");
    my_worker.submit(deferred, req.payload());
    return null; // server sends empty ACK
}
// Later, from any thread:
deferred.respond(coap.Response.ok(result));

Implementation

  • deferred.zig: Pre-allocated pending pool (default 16 slots), lock-free MPSC queue, DeferredResponse handle with respond()/cancel()
  • handler.zig: Request.deferResponse() method, DeferContext type
  • Server.zig: Config.max_deferred, pool init/deinit, tick-loop queue drain + CON retransmit with exponential backoff, ACK/RST handling for separate responses

Performance

  • Zero overhead for synchronous handlers (one null check on deferred field, skipped queue drain when count_active == 0)
  • Bench regression check: no measurable change in plain CON throughput

Test plan

  • zig build test — all tests pass (8 new deferred pool tests + existing 120+)
  • Bench regression: plain CON 1T within normal range (~600-720K req/s)

@cvik cvik merged commit 41d7cd9 into main Mar 16, 2026
1 check passed
@cvik cvik deleted the separate-responses branch March 16, 2026 22:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant