Unclean connection close on context cancellation during row scan
Author: matteosilvCreated Jun 10, 2026Updated Jul 11, 2026
When a context is cancelled while scanning query results with rows.Scan, lib/pq closes the connection abruptly instead of gracefully. This surfaces as Connection reset by peer errors on the server side.
Test case:
func TestXXX(t *testing.T) {
db := pqtest.MustDB(t)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
rows, err := db.QueryContext(ctx, "select * from generate_series(1, 1000000)")
if err != nil {
t.Fatal(err)
}
defer rows.Close()
count := 0
for rows.Next() {
var n int
if err := rows.Scan(&n); err != nil {
t.Fatal(err)
}
count++
if count == 1000 {
cancel()
}
}
err = rows.Err()
if err != nil {
t.Fatal(err)
}
}Results in error:
scan error: context canceledThe server server (pgdog proxy, making the TCP-level error observable) reports:
ERROR client disconnected with error: net: io: Connection reset by peer (os error 104)pq v1.12.3
pgdog v0.1.38
Source: lib/pq