{"record":{"id":"2b2332bdc11a0b78","repo":"vitessio/vitess","slug":"can-t-call-setreaddeadline-for-connwithtimeouts","errorCode":null,"errorMessage":"can't call SetReadDeadline for ConnWithTimeouts","messagePattern":"can't call SetReadDeadline for ConnWithTimeouts","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"go/netutil/conn.go","lineNumber":66,"sourceCode":"// Write sets a write deadline and delegates to conn.Write\nfunc (c ConnWithTimeouts) Write(b []byte) (int, error) {\n\tif c.writeTimeout == 0 {\n\t\treturn c.Conn.Write(b)\n\t}\n\tif err := c.Conn.SetWriteDeadline(time.Now().Add(c.writeTimeout)); err != nil {\n\t\treturn 0, err\n\t}\n\treturn c.Conn.Write(b)\n}\n\n// SetDeadline implements the Conn SetDeadline method.\nfunc (c ConnWithTimeouts) SetDeadline(t time.Time) error {\n\tpanic(\"can't call SetDeadline for ConnWithTimeouts\")\n}\n\n// SetReadDeadline implements the Conn SetReadDeadline method.\nfunc (c ConnWithTimeouts) SetReadDeadline(t time.Time) error {\n\tpanic(\"can't call SetReadDeadline for ConnWithTimeouts\")\n}\n\n// SetWriteDeadline implements the Conn SetWriteDeadline method.\nfunc (c ConnWithTimeouts) SetWriteDeadline(t time.Time) error {\n\tpanic(\"can't call SetWriteDeadline for ConnWithTimeouts\")\n}\n","sourceCodeStart":48,"sourceCodeEnd":73,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/netutil/conn.go#L48-L73","documentation":"Like SetDeadline, SetReadDeadline is intentionally unimplemented on ConnWithTimeouts: read timeouts are applied per Read call via the configured timeouts, so a panicking stub enforces the contract. Any code path calling SetReadDeadline on this wrapper crashes.","triggerScenarios":"Handing ConnWithTimeouts to code that sets read deadlines before reads — TLS handshakes, HTTP server conns (http.ConnState handlers), bufio-based protocols, or net/http.Serve wrapping.","commonSituations":"Proxying a timeout-configured conn into net/http or crypto/tls which unconditionally call SetReadDeadline; refactoring code that previously used plain conns.","solutions":["Pass the raw net.Conn to deadline-sensitive consumers.","Encode read timeout requirements in the WithTimeouts configuration instead.","Use a plain conn plus explicit SetReadDeadline if per-connection deadlines are required."],"exampleFix":"// before\nconn.SetReadDeadline(time.Now().Add(5 * time.Second)) // panics on ConnWithTimeouts\n// after\nrawConn.SetReadDeadline(time.Now().Add(5 * time.Second))","handlingStrategy":"type-guard","validationCode":"if _, isTimeouts := conn.(netutil.ConnWithTimeouts); isTimeouts {\n    return errors.New(\"use per-call timeouts, not SetReadDeadline\")\n}","typeGuard":"func isConnWithTimeouts(c net.Conn) bool {\n    _, ok := c.(netutil.ConnWithTimeouts)\n    return ok\n}","tryCatchPattern":"defer func() { if r := recover(); r != nil { err = fmt.Errorf(\"SetReadDeadline unsupported: %v\", r) } }()","preventionTips":["Pass the raw net.Conn to deadline-based libraries.","Set ReadTimeout at construction of the ConnWithTimeouts.","Audit middleware for unconditional SetReadDeadline calls."],"tags":["network","deadline","panic","netutil"],"backgroundTag":"unsupported-deadline-operation","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}