Something went wrong. Try again.
Monorepo for Tangled tangled.org
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465package db
import ( "context" "os" "path/filepath" "strings" "sync" "testing" "time")
func fdsOnFile(t *testing.T, path string) int { t.Helper() entries, err := os.ReadDir("/proc/self/fd") if err != nil { t.Skip("no /proc/self/fd here") } n := 0 for _, e := range entries { if target, err := os.Readlink(filepath.Join("/proc/self/fd", e.Name())); err == nil && target == path { n++ } } return n}
func TestClosedConnectionsReleaseTheirDescriptors(t *testing.T) { ctx := context.Background() path := filepath.Join(t.TempDir(), "spindle.db") database, err := Make(ctx, path) if err != nil { t.Fatal(err) } t.Cleanup(func() { database.Close() })
var wg sync.WaitGroup for i := range 30 { wg.Add(1) go func() { defer wg.Done() queryCtx, cancel := context.WithTimeout(ctx, 20*time.Millisecond) defer cancel() if i%2 == 0 { var n int _ = database.QueryRowContext(queryCtx, ` with recursive c(x) as (select 1 union all select x + 1 from c where x < 5000000) select count(*) from c`).Scan(&n) return } rows, err := database.QueryContext(queryCtx, `select name from sqlite_master`) if err == nil { rows.Close() } }() } wg.Wait() time.Sleep(200 * time.Millisecond)
open := database.Stats().OpenConnections if fds := fdsOnFile(t, strings.TrimSpace(path)); fds > open+1 { t.Fatalf("%d descriptors on the db file with %d open connections, closed connections keep theirs", fds, open) }}