valyala/fasthttp · error
cannot enable tcp_fastopen(qlen=%d): %s
Error message
cannot enable tcp_fastopen(qlen=%d): %s
What it means
tcplisten supports TCP_FASTOPEN via Config{FastOpen: true}; enableFastOpen sets the option with a queue length (fastOpenQlen = 16*1024) on the listening socket. If the kernel rejects setsockopt, the error "cannot enable tcp_fastopen(qlen=16384)" is returned to NewListener.
Source
Thrown at tcplisten/tcplisten_linux.go:28
"golang.org/x/sys/unix"
)
const (
soReusePort = 0x0F
tcpFastOpen = 0x17
)
func enableDeferAccept(fd int) error {
if err := unix.SetsockoptInt(fd, unix.IPPROTO_TCP, unix.TCP_DEFER_ACCEPT, 1); err != nil {
return fmt.Errorf("cannot enable tcp_defer_accept: %s", err)
}
return nil
}
func enableFastOpen(fd int) error {
if err := unix.SetsockoptInt(fd, unix.SOL_TCP, tcpFastOpen, fastOpenQlen); err != nil {
return fmt.Errorf("cannot enable tcp_fastopen(qlen=%d): %s", fastOpenQlen, err)
}
return nil
}
const fastOpenQlen = 16 * 1024
func soMaxConn() (int, error) {
data, err := os.ReadFile(soMaxConnFilePath)
if err != nil {
// This error may trigger on travis build. Just use SOMAXCONN
if os.IsNotExist(err) {
return unix.SOMAXCONN, nil
}
return -1, err
}
s := strings.TrimSpace(string(data))
n, err := strconv.Atoi(s)
if err != nil || n <= 0 {View on GitHub (pinned to c96f600972)
Solutions
- Enable the server-side TFO flag: sysctl -w net.ipv4.tcp_fastopen=3
- Set Config.FastOpen to false where TFO is unavailable
- Verify kernel version >= 3.7 supports TCP_FASTOPEN
- Check seccomp/AppArmor policies allow the setsockopt
Example fix
// before
cfg := tcplisten.Config{FastOpen: true} // TFO disabled by sysctl
// after
// host: sysctl -w net.ipv4.tcp_fastopen=3
cfg := tcplisten.Config{FastOpen: true}
ln, err := tcplisten.NewListener(cfg, "tcp", ":8080") Defensive patterns
Strategy: fallback
Validate before calling
func tcpFastOpenEnabled() bool {
data, err := os.ReadFile("/proc/sys/net/ipv4/tcp_fastopen")
if err != nil { return false }
n, _ := strconv.Atoi(strings.TrimSpace(string(data)))
return n&2 != 0 // server-side bit must be set
} Try / catch
cfg := tcplisten.Config{FastOpen: wantFastOpen}
ln, err := tcplisten.NewListener(cfg, "tcp", addr)
if err != nil && strings.Contains(err.Error(), "tcp_fastopen") {
log.Warn("TCP_FASTOPEN unavailable; retrying without it")
cfg.FastOpen = false
ln, err = tcplisten.NewListener(cfg, "tcp", addr)
} Prevention
- Ensure net.ipv4.tcp_fastopen includes the server bit (value 2 or 3) via sysctl
- Check TFO support in the host kernel (>= 3.7) and runtime sandbox
- Make FastOpen opt-in per environment instead of hardcoding
When it happens
Trigger: NewListener with Config{FastOpen: true} on Linux where setsockopt(fd, SOL_TCP, TCP_FASTOPEN, 16384) fails — kernel compiled without TCP_FASTOPEN, net.ipv4.tcp_fastopen sysctl disabled (bit 2 for listening sockets), or seccomp blocking the call.
Common situations: Cloud images/containers with tcp_fastopen sysctl set to 0 or 1 (client flag only); older kernels (<3.7); sandboxed runtimes without TFO support.
Related errors
- cannot enable tcp_defer_accept: %s
- cannot determine backlog to pass to listen(2): %w
- cannot listen on %q: %w
- cannot parse somaxconn %q read from %s: %s
- fasthttp: dialing to the given tcp address timed out
AI-assisted analysis of valyala/fasthttp@c96f600972 (2026-08-31).
Data as JSON: /api/errors/f973591d0ca503e6.
Report an issue: GitHub.