From 6297b1c78469b49b69820c4f5fcf601aa5da8e39 Mon Sep 17 00:00:00 2001 From: John Sirois Date: Thu, 22 Apr 2021 11:16:11 -0700 Subject: [PATCH] Make bootstrap_code.sh parallel safe. (#11962) Previously you could hit errors like: ``` mv: cannot create regular file '/home/jsirois/dev/pantsbuild/jsirois-pants/src/python/pants/engine/internals/native_engine.so.metadata': File exists ``` --- build-support/bin/rust/bootstrap_code.sh | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/build-support/bin/rust/bootstrap_code.sh b/build-support/bin/rust/bootstrap_code.sh index 583a8d93948..4d020f63a62 100644 --- a/build-support/bin/rust/bootstrap_code.sh +++ b/build-support/bin/rust/bootstrap_code.sh @@ -79,6 +79,24 @@ function bootstrap_native_code() { local -r metadata_file=$(mktemp -t pants.native_engine.metadata.XXXXXX) echo "engine_version: ${engine_version_calculated}" > "${metadata_file}" echo "repo_version: $(git describe --dirty)" >> "${metadata_file}" - mv "${metadata_file}" "${NATIVE_ENGINE_RESOURCE_METADATA}" + + # Here we set up a file lock via bash tricks to avoid concurrent `mv` failing. + if { + set -C # Set noclobber temporarily to ensure file creation via `>` is atomic and exclusive. + echo 2> /dev/null "$$" > "${NATIVE_ENGINE_RESOURCE_METADATA}.lock" + }; then + # N.B.: We want the NATIVE_ENGINE_RESOURCE_METADATA env var to be expanded now. + # See: https://github.com/koalaman/shellcheck/wiki/SC2064 + # + # shellcheck disable=SC2064 + trap "rm -f ${NATIVE_ENGINE_RESOURCE_METADATA}.lock" RETURN + mv "${metadata_file}" "${NATIVE_ENGINE_RESOURCE_METADATA}" + else + local -r locked_by="$( + cat "${NATIVE_ENGINE_RESOURCE_METADATA}.lock" 2 > /dev/null || echo "" + )" + echo >&2 "Process $$ yielding to concurrent bootstrap by pid ${locked_by}." + fi + set +C fi }