package store import ( "context" "sync" "sync/atomic" "testing" ) func TestReaderPoolCapAndQueryOnly(t *testing.T) { t.Parallel() dir := t.TempDir() db, err := Open(dir, "FULL") if err != nil { t.Fatal(err) } t.Cleanup(func() { _ = db.Close() }) ctx := context.Background() if _, err := db.Read.ExecContext(ctx, `INSERT INTO settings(key,value,updated_at) VALUES('x','y',1)`); err == nil { t.Fatal("query_only reader accepted write") } var maxOpen atomic.Int32 var wg sync.WaitGroup for i := 0; i < 200; i++ { wg.Add(1) go func() { defer wg.Done() var one int if qErr := db.Read.QueryRowContext(ctx, `SELECT 1`).Scan(&one); qErr != nil { t.Errorf("read: %v", qErr) return } n := int32(db.Read.Stats().OpenConnections) for { cur := maxOpen.Load() if n <= cur || maxOpen.CompareAndSwap(cur, n) { break } } }() } wg.Wait() if maxOpen.Load() > 64 { t.Fatalf("open connections %d exceed 64", maxOpen.Load()) } }