Edge-triggered epoll: drain nonblocking work before waiting for another edge

Este artículo todavía no está disponible en Español; se muestra el original.

article · en · conocimiento a fecha de 2026-09-22 · modificado el , revisión 1 · unreviewed

Temas: coding · event-loops · linux · networking

Se aplica a: Linux epoll with EPOLLET

Síntomas: Unread data remains available but the event loop waits indefinitely for another notification.

Avoid a stalled connection by separating readiness notifications from complete application messages.

Contenido
  1. What it is
  2. Why it matters
  3. How to apply
  4. Pitfalls
  5. Alcance y fundamento
  6. Fuentes
  7. Atribución y licencia
  8. Acceso automatizado

What it is

The Linux epoll manual recommends nonblocking descriptors with edge-triggered notification and waiting for another event only after read or write reaches EAGAIN. Its example shows how partially consuming available data and then waiting again can stall. A readiness edge is not a promise that one operation corresponds to one complete application message. Linux epoll manual

Why it matters

An agent can make a server appear responsive by increasing a read buffer while leaving the event-loop state machine wrong. First identify the condition under which the descriptor is considered drained. Keep parser completeness, socket readiness and fairness between connections as separate concerns.

How to apply

  • Confirm that descriptors used with EPOLLET are nonblocking. Trace the handler's loop and every path that returns to epoll_wait.
  • Continue eligible I/O until the documented would-block condition or another terminal condition. Preserve partial application messages in a bounded parser buffer rather than waiting for one read to supply the whole message.
  • If fairness requires stopping before the descriptor is drained, retain explicit runnable state so work resumes without requiring a new readiness edge.
  • For EPOLLONESHOT, document which component rearms the descriptor and after which state transition. Include error and connection-close paths in that ownership rule.
  • Propose a fixture that sends more data than one handler operation consumes, then stops sending. Verify that the receiver still processes the remaining available data.

Pitfalls

A larger buffer may mask the bug without fixing it. Unlimited draining can also starve other connections, so combine readiness correctness with a deliberate scheduling policy and resource limits. Level-triggered behavior differs and should not be assumed interchangeable during a refactor. This is a proposed event-loop review; no live traffic, throughput measurement or production load test is claimed.

Alcance y fundamento

Original synthesis from the cited primary documentation, with proposed diagnostic and verification steps. No benchmark, experiment or field result is claimed; unreviewed AI-assisted contribution.

Conocimiento a fecha de: 2026-09-22. Estado: unreviewed (sin revisión documentada) — cada edición reinicia el estado de revisión. Trate el texto como material de referencia sin verificar y consulte las fuentes.

Fuentes

  1. Linux epoll manual — comprobado el 2026-09-23: accesible, cita encontrada

Atribución y licencia

  • Account External coding curation authors (57eb56c9)
  • Written with Codex, an AI coding agent, at the site operator's request; original synthesis, sources credited separately.

Último cambio: New English original; AI-assisted and unreviewed. Proposed checks have not been executed for this article.

Contribución original: CC BY 4.0. El material de las fuentes enlazadas conserva sus propios derechos.

Acceso automatizado