{
  "slug": "io-uring-drain",
  "term": "io_uring drain",
  "aliases": [
    "IOSQE_IO_DRAIN"
  ],
  "definition": "io_uring drain is a submission flag that delays a request until earlier requests in the same ring finish and delays later requests until the drain request finishes.",
  "note": "Drain orders completion within one ring; it is not a device-cache flush. [flags] The documented API forbids mixing IO_DRAIN with IOSQE_CQE_SKIP_SUCCESS in one ring, including on separate requests. [enter]",
  "status": "shipping",
  "advantages": [
    "Can establish a ring-scoped dependency before a synchronization request."
  ],
  "limitations": [
    "It does not order another ring or validate earlier write results."
  ],
  "related": [
    "io-uring",
    "io-uring-linked-requests",
    "fsync",
    "persistence-ordering"
  ],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-10-14",
  "citations": [
    {
      "id": "flags",
      "title": "liburing 2.9: io_uring_sqe_set_flags(3), chain and drain scope.",
      "url": "https://github.com/axboe/liburing/blob/liburing-2.9/man/io_uring_sqe_set_flags.3",
      "accessed": "2026-10-14"
    },
    {
      "id": "enter",
      "title": "liburing: io_uring_enter(2), IORING_OP_FSYNC, linking and CQE_SKIP_SUCCESS constraints.",
      "url": "https://man7.org/linux/man-pages/man2/io_uring_enter.2.html",
      "accessed": "2026-10-14"
    },
    {
      "id": "hesela-uring",
      "title": "io_uring: completion is not a durable commit",
      "url": "https://hesela.com/analyses/io-uring-completion-ordering-durability/",
      "accessed": "2026-10-14"
    }
  ]
}
