slackhq/nebula · error
error CreateRequestQueue: %w
Error message
error CreateRequestQueue: %w
What it means
This error wraps winrio.CreateRequestQueue failing while setting up the RIO request queue that pairs the rx and tx completion queues with the socket. The request queue is the core RIO object; without it the socket cannot perform registered I/O, so bind() aborts. The underlying winsock error is attached via %w.
Source
Thrown at udp/udp_rio_windows.go:132
if err != nil {
// This is a best-effort to prevent errors from being returned by the udp recv operation.
// Quietly log a failure and continue.
l.Debug("failed to set UDP_NETRESET ioctl", "error", err)
}
err = u.rx.Open()
if err != nil {
return fmt.Errorf("error rx.Open(): %w", err)
}
err = u.tx.Open()
if err != nil {
return fmt.Errorf("error tx.Open(): %w", err)
}
u.rq, err = winrio.CreateRequestQueue(u.sock, packetsPerRing, 1, packetsPerRing, 1, u.rx.cq, u.tx.cq, 0)
if err != nil {
return fmt.Errorf("error CreateRequestQueue: %w", err)
}
err = windows.Bind(u.sock, sa)
if err != nil {
return fmt.Errorf("error windows.Bind(): %w", err)
}
return nil
}
func (u *RIOConn) ListenOut(r EncReader, flush func()) error {
buffer := make([]byte, MTU)
var lastRecvErr time.Time
for {
// Just read one packet at a time
n, rua, err := u.receive(buffer)View on GitHub (pinned to dd8f660c0a)
Solutions
- Check the wrapped winsock error; WSAEINVAL usually means invalid queue/overflow size parameters.
- Reduce packetsPerRing and ensure overflow counts (1) are valid for the chosen sizes.
- Free system RIO resources (other sockets) and retry.
- Confirm the platform supports RIO request queues of the requested size (Windows 8/Server 2012+).
Defensive patterns
Strategy: try-catch
Validate before calling
// sanity-check RIO queue parameters before binding
if packetsPerRing == 0 || packetsPerRing > maxRIOQueueSize {
return fmt.Errorf("invalid packetsPerRing: %d", packetsPerRing)
} Type guard
func isCreateRequestQueueErr(err error) bool { return err != nil && strings.Contains(err.Error(), "CreateRequestQueue") } Try / catch
conn, err := udp.NewListener(logger, settings)
if err != nil && strings.Contains(err.Error(), "CreateRequestQueue") {
// WSAEINVAL: halve packetsPerRing and retry; WSAENOBUFS: free resources and retry
} Prevention
- Use ring sizes within documented RIO limits and keep overflow counts small.
- Cap concurrent RIO sockets per process.
- Retry with progressively smaller queue sizes on WSAENOBUFS/EINVAL.
- Test on the exact Windows target version/container image before deploy.
When it happens
Trigger: NewRIOListener -> bind() after rx/tx opened successfully: winrio.CreateRequestQueue(sock, packetsPerRing, 1, packetsPerRing, 1, rx.cq, tx.cq, 0) returns an error, usually WSAEINVAL (bad queue sizes / overflow counts) or WSAENOBUFS.
Common situations: Ring sizes too large or not within RIO limits, system-wide RIO resource exhaustion, running inside containers or restricted environments where RIO queue creation is blocked.
Related errors
AI-assisted analysis of slackhq/nebula@dd8f660c0a (2026-09-03).
Data as JSON: /api/errors/7156f6b56bbb7cfd.
Report an issue: GitHub.