mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
Publishing inside a db transaction can lead to database connection starvation/contention since it requires its own connection. This ruleguard rule (one-shotted by Claude Sonnet 3.7 and finalized by @Emyrk) will detect two of the following 3 instances: ```go type Nested struct { ps pubsub.Pubsub } func TestFail(t *testing.T) { t.Parallel() db, ps := dbtestutil.NewDB(t) nested := &Nested{ ps: ps, } // will catch this _ = db.InTx(func(_ database.Store) error { _, _ = fmt.Printf("") _ = ps.Publish("", []byte{}) return nil }, nil) // will catch this _ = db.InTx(func(_ database.Store) error { _ = nested.ps.Publish("", []byte{}) return nil }, nil) // will NOT catch this _ = db.InTx(func(_ database.Store) error { blah(ps) return nil }, nil) } func blah(ps pubsub.Pubsub) { ps.Publish("", []byte{}) } ``` The ruleguard doesn't recursively introspect function calls so only the first two cases will be guarded against, but it's better than nothing. <img width="1444" alt="image" src="https://github.com/user-attachments/assets/8ffa0d88-16a0-41a9-9521-21211910dec9" /> --------- Signed-off-by: Danny Kopping <dannykopping@gmail.com> Co-authored-by: Steven Masley <stevenmasley@gmail.com>