avoid request stalls during proactive rebuilds
This commit is contained in:
@@ -48,13 +48,37 @@ assert_marker parent dependency-marker-a
|
||||
sed -i 's/dependency-marker-a/dependency-marker-b/' "$source_dir/child.uce"
|
||||
assert_marker parent dependency-marker-b
|
||||
|
||||
# A proactive rebuild owns these same per-unit locks. While it publishes fresh
|
||||
# artifacts, requests must use the last complete artifacts instead of waiting
|
||||
# across the transitive graph. Atomic publication keeps those artifacts safe.
|
||||
parent_wasm="$cache_dir/parent.uce.wasm"
|
||||
child_wasm="$cache_dir/child.uce.wasm"
|
||||
(
|
||||
exec 8>"$parent_wasm.lock"
|
||||
exec 9>"$child_wasm.lock"
|
||||
flock 8
|
||||
flock 9
|
||||
sleep 3
|
||||
) &
|
||||
rebuild_lock_pid=$!
|
||||
sleep 0.2
|
||||
sed -i 's/dependency-marker-b/dependency-marker-d/' "$source_dir/child.uce"
|
||||
started_at=$(date +%s%N)
|
||||
assert_marker parent dependency-marker-b
|
||||
elapsed_ms=$(( ($(date +%s%N) - started_at) / 1000000 ))
|
||||
if (( elapsed_ms >= 2000 )); then
|
||||
echo "request waited ${elapsed_ms}ms for an active transitive rebuild" >&2
|
||||
exit 1
|
||||
fi
|
||||
wait "$rebuild_lock_pid"
|
||||
assert_marker parent dependency-marker-d
|
||||
|
||||
# Warm every configured worker, then replace the artifact while retaining its
|
||||
# whole-second mtime. The worker cache must notice the nanosecond/ctime change.
|
||||
for _ in {1..16}; do assert_marker parent dependency-marker-b; done
|
||||
sed 's/dependency-marker-b/dependency-marker-c/' "$source_dir/child.uce" >"$source_dir/alternate-child.uce"
|
||||
for _ in {1..16}; do assert_marker parent dependency-marker-d; done
|
||||
sed 's/dependency-marker-d/dependency-marker-c/' "$source_dir/child.uce" >"$source_dir/alternate-child.uce"
|
||||
sed 's/child.uce/alternate-child.uce/' "$source_dir/parent.uce" >"$source_dir/alternate.uce"
|
||||
assert_marker alternate dependency-marker-c
|
||||
parent_wasm="$cache_dir/parent.uce.wasm"
|
||||
alternate_wasm="$cache_dir/alternate.uce.wasm"
|
||||
parent_mtime=$(stat -c %Y "$parent_wasm")
|
||||
cp "$alternate_wasm" "$parent_wasm"
|
||||
|
||||
Reference in New Issue
Block a user