mirror of
https://blitiri.com.ar/repos/chasquid
synced 2025-12-17 14:37:02 +00:00
tests: Fix "text file busy" race condition in go-build-cached
There are a couple of places in the tests when we attempt to build and run simultaneously. Here, if the build is slow, there is a race where "text file busy" can appear. To fix this, build to a temporary file with a random name, then atomically rename it to the final binary name.
This commit is contained in:
@@ -53,8 +53,21 @@ function go-build-cached() { (
|
|||||||
! cmp -s .flags-new .flags >/dev/null 2>&1 ||
|
! cmp -s .flags-new .flags >/dev/null 2>&1 ||
|
||||||
[ "$(basename "$PWD")" -ot ".reference" ] ;
|
[ "$(basename "$PWD")" -ot ".reference" ] ;
|
||||||
then
|
then
|
||||||
|
# Build to a temporary file first, then atomically rename it.
|
||||||
|
# This prevents "text file busy" errors when the binary is
|
||||||
|
# executed while being written to.
|
||||||
|
BINARY="$(basename "$PWD")"
|
||||||
|
TMPFILE=".${BINARY}.tmp.${RANDOM}"
|
||||||
|
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
go build -tags="$GOTAGS" $GOFLAGS
|
if go build -tags="$GOTAGS" $GOFLAGS -o "$TMPFILE"; then
|
||||||
|
# Atomically replace the binary.
|
||||||
|
mv "$TMPFILE" "$BINARY"
|
||||||
|
else
|
||||||
|
# Clean up the temp file if the build failed.
|
||||||
|
rm -f "$TMPFILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Write to .flags instead of renaming, to prevent races where
|
# Write to .flags instead of renaming, to prevent races where
|
||||||
# was .flags-new is already renamed by the time we get here.
|
# was .flags-new is already renamed by the time we get here.
|
||||||
|
|||||||
Reference in New Issue
Block a user