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

  1. Check the wrapped winsock error; WSAEINVAL usually means invalid queue/overflow size parameters.
  2. Reduce packetsPerRing and ensure overflow counts (1) are valid for the chosen sizes.
  3. Free system RIO resources (other sockets) and retry.
  4. 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

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.