Skip to content

Commit 1eb21da

Browse files
committed
Fix race condition when two archs are built at the same time
1 parent a800f69 commit 1eb21da

1 file changed

Lines changed: 23 additions & 4 deletions

File tree

setup.sh

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,13 @@ fi
7272

7373
echo "Downloading P4 API SDK for $OS/$ARCH..."
7474
TMPDIR="$(mktemp -d)"
75-
trap 'rm -rf "$TMPDIR"' EXIT
75+
INCLUDE_LOCK="${P4API_DIR}/.include.lock"
76+
mkdir -p "$P4API_DIR"
77+
cleanup() {
78+
rm -rf "$TMPDIR"
79+
rmdir "$INCLUDE_LOCK" 2>/dev/null || true
80+
}
81+
trap cleanup EXIT
7682

7783
if [[ "$ARCHIVE_TYPE" == "tgz" ]]; then
7884
curl -sL "$URL" -o "$TMPDIR/p4api.tgz"
@@ -92,8 +98,21 @@ fi
9298
mkdir -p "$LIB_DIR"
9399
cp "$EXTRACTED"/lib/*.a "$LIB_DIR/"
94100

95-
# Update shared include directory to match the downloaded SDK variant
96-
rm -rf "$P4API_DIR/include"
97-
cp -r "$EXTRACTED/include" "$P4API_DIR/include"
101+
# Update shared include directory to match the downloaded SDK variant.
102+
# Multiple arch builds may run in parallel and share $P4API_DIR/include,
103+
# so serialize the rm+cp with an atomic mkdir lock and a version sentinel.
104+
SENTINEL="$P4API_DIR/include/.p4api-version"
105+
for _ in $(seq 1 120); do
106+
if mkdir "$INCLUDE_LOCK" 2>/dev/null; then
107+
break
108+
fi
109+
sleep 1
110+
done
111+
if [[ ! -f "$SENTINEL" ]] || [[ "$(cat "$SENTINEL" 2>/dev/null)" != "$P4API_VERSION" ]]; then
112+
rm -rf "$P4API_DIR/include"
113+
cp -r "$EXTRACTED/include" "$P4API_DIR/include"
114+
echo "$P4API_VERSION" > "$SENTINEL"
115+
fi
116+
rmdir "$INCLUDE_LOCK" 2>/dev/null || true
98117

99118
echo "Installed P4 API libs to $LIB_DIR ($(ls "$LIB_DIR"/*.a | wc -l | tr -d ' ') files)"

0 commit comments

Comments
 (0)