Skip to content

Commit c2d3bf0

Browse files
committed
Reduce flakyness.
1 parent 58a5682 commit c2d3bf0

File tree

1 file changed

+44
-37
lines changed

1 file changed

+44
-37
lines changed

tests/parallel/parallel_test.go

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package tests
22

33
import (
4-
"context"
54
"errors"
5+
"fmt"
66
"io"
77
"log"
88
"net/url"
99
"os"
1010
"os/exec"
1111
"path/filepath"
1212
"testing"
13-
"time"
1413

1514
"golang.org/x/sync/errgroup"
1615

@@ -24,6 +23,7 @@ import (
2423
)
2524

2625
func TestMain(m *testing.M) {
26+
sqlite3.Initialize()
2727
sqlite3.AutoExtension(func(c *sqlite3.Conn) error {
2828
return c.ConfigLog(func(code sqlite3.ExtendedErrorCode, msg string) {
2929
// Having to do journal recovery is unexpected.
@@ -54,6 +54,7 @@ func Test_parallel(t *testing.T) {
5454
"?_pragma=busy_timeout(10000)" +
5555
"&_pragma=journal_mode(truncate)" +
5656
"&_pragma=synchronous(off)"
57+
createDB(t, name)
5758
testParallel(t, name, iter)
5859
testIntegrity(t, name)
5960
}
@@ -75,6 +76,7 @@ func Test_wal(t *testing.T) {
7576
"?_pragma=busy_timeout(10000)" +
7677
"&_pragma=journal_mode(wal)" +
7778
"&_pragma=synchronous(off)"
79+
createDB(t, name)
7880
testParallel(t, name, iter)
7981
testIntegrity(t, name)
8082
}
@@ -90,6 +92,7 @@ func Test_memdb(t *testing.T) {
9092
name := memdb.TestDB(t, url.Values{
9193
"_pragma": {"busy_timeout(10000)"},
9294
})
95+
createDB(t, name)
9396
testParallel(t, name, iter)
9497
testIntegrity(t, name)
9598
}
@@ -113,6 +116,7 @@ func Test_adiantum(t *testing.T) {
113116
"&_pragma=busy_timeout(10000)" +
114117
"&_pragma=journal_mode(truncate)" +
115118
"&_pragma=synchronous(off)"
119+
createDB(t, name)
116120
testParallel(t, name, iter)
117121
testIntegrity(t, name)
118122
}
@@ -136,6 +140,7 @@ func Test_xts(t *testing.T) {
136140
"&_pragma=busy_timeout(10000)" +
137141
"&_pragma=journal_mode(truncate)" +
138142
"&_pragma=synchronous(off)"
143+
createDB(t, name)
139144
testParallel(t, name, iter)
140145
testIntegrity(t, name)
141146
}
@@ -155,14 +160,17 @@ func Test_MultiProcess_rollback(t *testing.T) {
155160
"?_pragma=busy_timeout(10000)" +
156161
"&_pragma=journal_mode(truncate)" +
157162
"&_pragma=synchronous(off)"
163+
createDB(t, name)
158164

159165
exe, err := os.Executable()
160166
if err != nil {
161167
t.Fatal(err)
162168
}
163169

164-
cmd := exec.Command(exe, append(os.Args[1:], "-test.v", "-test.run=Test_ChildProcess_rollback")...)
170+
cmd := exec.Command(exe, append(os.Args[1:],
171+
"-test.v", "-test.count=1", "-test.run=Test_ChildProcess_rollback")...)
165172
out, err := cmd.StdoutPipe()
173+
cmd.Stderr = os.Stderr
166174
if err != nil {
167175
t.Fatal(err)
168176
}
@@ -214,14 +222,17 @@ func Test_MultiProcess_wal(t *testing.T) {
214222
"?_pragma=busy_timeout(10000)" +
215223
"&_pragma=journal_mode(wal)" +
216224
"&_pragma=synchronous(off)"
225+
createDB(t, name)
217226

218227
exe, err := os.Executable()
219228
if err != nil {
220229
t.Fatal(err)
221230
}
222231

223-
cmd := exec.Command(exe, append(os.Args[1:], "-test.v", "-test.run=Test_ChildProcess_wal")...)
232+
cmd := exec.Command(exe, append(os.Args[1:],
233+
"-test.v", "-test.count=1", "-test.run=Test_ChildProcess_wal")...)
224234
out, err := cmd.StdoutPipe()
235+
cmd.Stderr = os.Stderr
225236
if err != nil {
226237
t.Fatal(err)
227238
}
@@ -263,14 +274,14 @@ func Benchmark_parallel(b *testing.B) {
263274
b.Skip("skipping without shared memory")
264275
}
265276

266-
sqlite3.Initialize()
267-
b.ResetTimer()
268-
269277
name := "file:" +
270278
filepath.Join(b.TempDir(), "test.db") +
271279
"?_pragma=busy_timeout(10000)" +
272280
"&_pragma=journal_mode(truncate)" +
273281
"&_pragma=synchronous(off)"
282+
createDB(b, name)
283+
284+
b.ResetTimer()
274285
testParallel(b, name, b.N)
275286
}
276287

@@ -279,55 +290,51 @@ func Benchmark_wal(b *testing.B) {
279290
b.Skip("skipping without shared memory")
280291
}
281292

282-
sqlite3.Initialize()
283-
b.ResetTimer()
284-
285293
name := "file:" +
286294
filepath.Join(b.TempDir(), "test.db") +
287295
"?_pragma=busy_timeout(10000)" +
288296
"&_pragma=journal_mode(wal)" +
289297
"&_pragma=synchronous(off)"
298+
createDB(b, name)
299+
300+
b.ResetTimer()
290301
testParallel(b, name, b.N)
291302
}
292303

293304
func Benchmark_memdb(b *testing.B) {
294-
sqlite3.Initialize()
295-
b.ResetTimer()
296-
297305
name := memdb.TestDB(b, url.Values{
298306
"_pragma": {"busy_timeout(10000)"},
299307
})
308+
createDB(b, name)
309+
310+
b.ResetTimer()
300311
testParallel(b, name, b.N)
301312
}
302313

314+
func createDB(t testing.TB, name string) {
315+
db, err := sqlite3.Open(name)
316+
if err != nil {
317+
t.Fatal(err)
318+
}
319+
defer db.Close()
320+
321+
err = db.Exec(`CREATE TABLE IF NOT EXISTS users (id INT, name VARCHAR(10))`)
322+
if err != nil {
323+
t.Fatal(err)
324+
}
325+
}
326+
303327
func testParallel(t testing.TB, name string, n int) {
304328
writer := func() error {
305329
db, err := sqlite3.Open(name)
306330
if err != nil {
307-
return err
331+
return fmt.Errorf("writer: open: %w", err)
308332
}
309333
defer db.Close()
310334

311-
err = db.BusyHandler(func(ctx context.Context, count int) (retry bool) {
312-
select {
313-
case <-time.After(time.Millisecond):
314-
return true
315-
case <-ctx.Done():
316-
return false
317-
}
318-
})
319-
if err != nil {
320-
return err
321-
}
322-
323-
err = db.Exec(`CREATE TABLE IF NOT EXISTS users (id INT, name VARCHAR(10))`)
324-
if err != nil {
325-
return err
326-
}
327-
328335
err = db.Exec(`INSERT INTO users (id, name) VALUES (0, 'go'), (1, 'zig'), (2, 'whatever')`)
329336
if err != nil {
330-
return err
337+
return fmt.Errorf("writer: insert: %w", err)
331338
}
332339

333340
return db.Close()
@@ -336,13 +343,13 @@ func testParallel(t testing.TB, name string, n int) {
336343
reader := func() error {
337344
db, err := sqlite3.Open(name)
338345
if err != nil {
339-
return err
346+
return fmt.Errorf("reader: open: %w", err)
340347
}
341348
defer db.Close()
342349

343350
stmt, _, err := db.Prepare(`SELECT id, name FROM users`)
344351
if err != nil {
345-
return err
352+
return fmt.Errorf("reader: select: %w", err)
346353
}
347354
defer stmt.Close()
348355

@@ -351,15 +358,15 @@ func testParallel(t testing.TB, name string, n int) {
351358
row++
352359
}
353360
if err := stmt.Err(); err != nil {
354-
return err
361+
return fmt.Errorf("reader: step: %w", err)
355362
}
356363
if row%3 != 0 {
357-
t.Errorf("got %d rows, want multiple of 3", row)
364+
return fmt.Errorf("reader: got %d rows, want multiple of 3", row)
358365
}
359366

360367
err = stmt.Close()
361368
if err != nil {
362-
return err
369+
return fmt.Errorf("reader: close: %w", err)
363370
}
364371

365372
return db.Close()

0 commit comments

Comments
 (0)