diff --git a/Dockerfile b/Dockerfile index 8afc3dd..2155075 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,10 +32,14 @@ RUN script/bootstrap --cgo COPY . . # Without -v first; on a failure, again with -v for the details, and -# the step fails even if the second run passes. -RUN go test -count=1 -timeout 90s -race -cover ./... || \ +# the step fails even if the second run passes. -parallel 4: by default +# a package runs as many of its tests at once as the host has CPUs. On +# a busy host they then wait to be scheduled, and their SQLite calls +# queue on one lock that every database in the test process shares, so +# a test that times a request can see it return a second late. +RUN go test -count=1 -timeout 90s -race -parallel 4 -cover ./... || \ { echo "--- Rerunning with -v for details ---"; \ - go test -count=1 -timeout 90s -race -v ./...; exit 1; } + go test -count=1 -timeout 90s -race -parallel 4 -v ./...; exit 1; } # Build stage. Nothing is wanted from the two phases above: these copies # make BuildKit build them first, so this stage runs only when lint and diff --git a/TODO.md b/TODO.md index 7bee655..353d24a 100644 --- a/TODO.md +++ b/TODO.md @@ -30,6 +30,14 @@ P2: security: per-IP rate limiting on the image routes # Completed Steps +- 2026-10-08 the test phase of the `Dockerfile` runs at most 4 tests of a + package at once (`go test -parallel 4`, closes #224), where it ran as many as + the host has CPUs. On a busy host, `TestService_Get_ReturnsByItsDeadline` + failed because its request returned over a second after its deadline: the + request was waiting to be scheduled, or for SQLite calls queued on a lock + inside the SQLite library that every database in the test process shares. + `-p`, how many packages are tested at once, is unchanged, as capping it also + slows compiling. - 2026-10-08 every output format is saved with settings pixa sets on purpose (closes #232): each format has its own govips export, as JPEG XL does, in place of govips' generic `Export`, which sent libvips a zero for some settings