{"record":{"id":"ec2ca908e09eea50","repo":"valyala/fasthttp","slug":"cannot-parse-somaxconn-q-read-from-s-s","errorCode":null,"errorMessage":"cannot parse somaxconn %q read from %s: %s","messagePattern":"cannot parse somaxconn %q read from (.+?): (.+?)","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"tcplisten/tcplisten_linux.go","lineNumber":47,"sourceCode":"\t}\n\treturn nil\n}\n\nconst fastOpenQlen = 16 * 1024\n\nfunc soMaxConn() (int, error) {\n\tdata, err := os.ReadFile(soMaxConnFilePath)\n\tif err != nil {\n\t\t// This error may trigger on travis build. Just use SOMAXCONN\n\t\tif os.IsNotExist(err) {\n\t\t\treturn unix.SOMAXCONN, nil\n\t\t}\n\t\treturn -1, err\n\t}\n\ts := strings.TrimSpace(string(data))\n\tn, err := strconv.Atoi(s)\n\tif err != nil || n <= 0 {\n\t\treturn -1, fmt.Errorf(\"cannot parse somaxconn %q read from %s: %s\", s, soMaxConnFilePath, err)\n\t}\n\n\t// Linux stores the backlog in a uint16.\n\t// Truncate number to avoid wrapping.\n\t// See https://github.com/golang/go/issues/5030 .\n\tif n > 1<<16-1 {\n\t\tn = maxAckBacklog(n)\n\t}\n\treturn n, nil\n}\n\nfunc kernelVersion() (int, int) {\n\tvar uname unix.Utsname\n\tif err := unix.Uname(&uname); err != nil {\n\t\treturn 0, 0\n\t}\n\n\trl := uname.Release","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/valyala/fasthttp/blob/c96f600972c6f4a7a30d664257b340ebe9d60124/tcplisten/tcplisten_linux.go#L29-L65","documentation":"When cfg.Backlog is unset, soMaxConn reads /proc/sys/net/core/somaxconn and parses it as a positive integer to use as the listen backlog. If the file's trimmed contents are not a valid integer or are <= 0, this error reports the raw value and path. The underlying strconv error is included (%s) — it is nil when the value was merely <= 0.","triggerScenarios":"NewListener with Backlog <= 0 on Linux where /proc/sys/net/core/somaxconn contains non-numeric content or \"0\"/a negative number.","commonSituations":"Misconfigured hosts where somaxconn was set to 0; virtualized/modified procfs exposing placeholder content; corrupted or overridden sysctl values; test environments mounting fake procfs files.","solutions":["Fix the host value: sysctl -w net.core.somaxconn=<positive int> and persist it in /etc/sysctl.conf","Set an explicit Backlog (>0) in tcplisten.Config to bypass the file read entirely","Inspect the file: cat /proc/sys/net/core/somaxconn to see the unparseable value","Restore the real procfs file if a container image replaced/masked it"],"exampleFix":"// before\ncfg := tcplisten.Config{} // Backlog 0 -> reads broken somaxconn\nln, err := tcplisten.NewListener(cfg, \"tcp\", \":8080\")\n// after\ncfg := tcplisten.Config{Backlog: 1024} // avoids /proc read\nln, err := tcplisten.NewListener(cfg, \"tcp\", \":8080\")","handlingStrategy":"validation","validationCode":"func somaxconnOK() bool {\n    data, err := os.ReadFile(\"/proc/sys/net/core/somaxconn\")\n    if err != nil { return true } // missing file is tolerated by the library\n    n, err := strconv.Atoi(strings.TrimSpace(string(data)))\n    return err == nil && n > 0\n}","typeGuard":null,"tryCatchPattern":"ln, err := tcplisten.NewListener(cfg, \"tcp\", addr)\nif err != nil && strings.Contains(err.Error(), \"somaxconn\") {\n    cfg.Backlog = 1024 // fall back to explicit backlog\n    ln, err = tcplisten.NewListener(cfg, \"tcp\", addr)\n}","preventionTips":["Audit somaxconn in base images and node provisioning (must be a positive integer)","Set it persistently via /etc/sysctl.conf or a DaemonSet","Prefer explicit Backlog in the library config for deterministic behavior"],"tags":["linux","sysctl","somaxconn","parsing","backlog"],"backgroundTag":"somaxconn-parse-failed","analyzedSha":"c96f600972c6f4a7a30d664257b340ebe9d60124","analyzedAt":"2026-08-31T22:48:28.265Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}