Avoid duplicate proactive recompilation
This commit is contained in:
@@ -66,8 +66,21 @@ maximum=0
|
||||
if [[ -r "\$root/maximum" ]]; then read -r maximum <"\$root/maximum"; fi
|
||||
if (( active > maximum )); then printf '%s\n' "\$active" >"\$root/maximum"; fi
|
||||
nice_value=\$(timeout 2s ps -o ni= -p "\$PPID" | tr -d ' ')
|
||||
printf '%s\t%s\t%s\n' "\$(date +%s%N)" "\$nice_value" "\$source_file" >>"\$root/compile.tsv"
|
||||
owner_pid=\$PPID
|
||||
for _ in 1 2 3 4; do
|
||||
owner_command=\$(timeout 2s ps -o comm= -p "\$owner_pid" | tr -d ' ')
|
||||
[[ "\$owner_command" == uce_fastcgi.* ]] && break
|
||||
owner_pid=\$(timeout 2s ps -o ppid= -p "\$owner_pid" | tr -d ' ')
|
||||
[[ -n "\$owner_pid" && "\$owner_pid" != "1" ]] || break
|
||||
done
|
||||
printf '%s\t%s\t%s\t%s\n' "\$(date +%s%N)" "\$nice_value" "\$source_file" "\$owner_pid" >>"\$root/compile.tsv"
|
||||
flock -u 9
|
||||
if [[ -r "\$root/hold-paths" ]] && grep -Fxq "\$source_file" "\$root/hold-paths"; then
|
||||
: >"\$root/held-\$owner_pid"
|
||||
deadline=\$((SECONDS + 20))
|
||||
while [[ ! -e "\$root/release" && \$SECONDS -lt \$deadline ]]; do sleep 0.05; done
|
||||
[[ -e "\$root/release" ]] || exit 98
|
||||
fi
|
||||
sleep 0.75
|
||||
"\$real" "\$@"
|
||||
rc=\$?
|
||||
@@ -118,7 +131,26 @@ exec 7>>"$root/counter.lock"
|
||||
flock 7
|
||||
printf '0\n' >"$root/maximum"
|
||||
flock -u 7
|
||||
mapfile -t scanner_pids < <(awk -F '\t' -v site="$site/" '$3 ~ ("^" site "unit-[0-9]+[.]uce$") { count[$4]++ } END { for(pid in count) if(count[pid] >= 2) print pid }' "$shim_log" | sort -n)
|
||||
[[ "${#scanner_pids[@]}" -eq 2 ]] || { echo "controlled units were not split between both scanners" >&2; cat "$shim_log" >&2; exit 1; }
|
||||
blockers=()
|
||||
victims=()
|
||||
for scanner_pid in "${scanner_pids[@]}"; do
|
||||
mapfile -t scanner_units < <(awk -F '\t' -v pid="$scanner_pid" -v site="$site/" '$4 == pid && $3 ~ ("^" site "unit-[0-9]+[.]uce$") { print $3 }' "$shim_log")
|
||||
blockers+=("${scanner_units[0]}")
|
||||
victims+=("${scanner_units[1]}")
|
||||
done
|
||||
printf '%s\n' "${blockers[@]}" >"$root/hold-paths"
|
||||
rm -f "$root"/held-* "$root/release"
|
||||
sed -i 's/common-a/common-b/' "$site/common.uce"
|
||||
deadline=$((SECONDS + 20))
|
||||
while { [[ ! -e "$root/held-${scanner_pids[0]}" ]] || [[ ! -e "$root/held-${scanner_pids[1]}" ]]; } && (( SECONDS < deadline )); do sleep 0.05; done
|
||||
[[ -e "$root/held-${scanner_pids[0]}" && -e "$root/held-${scanner_pids[1]}" ]] || { echo "both scanners did not reach their controlled queue barriers" >&2; cat "$log" >&2; exit 1; }
|
||||
for victim in "${victims[@]}"; do
|
||||
victim_marker=$(UCE_CLI_SOCKET="$root/run/cli.sock" timeout 20s scripts/uce-cli "/$(basename "$victim")")
|
||||
[[ "$victim_marker" == *"common-b-"* ]] || { echo "request worker did not publish queued victim: $victim_marker" >&2; exit 1; }
|
||||
done
|
||||
touch "$root/release"
|
||||
deadline=$((SECONDS + 30))
|
||||
while (( SECONDS < deadline )); do
|
||||
rebuilt=1
|
||||
@@ -129,9 +161,13 @@ while (( SECONDS < deadline )); do
|
||||
sleep 0.1
|
||||
done
|
||||
(( rebuilt == 1 )) || { echo "common dependency edit did not rebuild all scanner shards" >&2; cat "$log" >&2; exit 1; }
|
||||
deadline=$((SECONDS + 5))
|
||||
while [[ "$(<"$root/active")" != "0" ]] && (( SECONDS < deadline )); do sleep 0.1; done
|
||||
sleep 1.25
|
||||
for unit in 0 1 2 3; do
|
||||
[[ "$(grep -c "$site/unit-$unit.uce" "$shim_log")" -eq 2 ]] || { echo "unit-$unit common-dependency rebuild was not exact" >&2; cat "$shim_log" >&2; exit 1; }
|
||||
done
|
||||
rm -f "$root/hold-paths" "$root"/held-* "$root/release"
|
||||
[[ "$(<"$root/maximum")" -ge 2 ]] || { echo "common dependency fanout did not overlap across scanner owners" >&2; cat "$shim_log" >&2; exit 1; }
|
||||
marker=$(UCE_CLI_SOCKET="$root/run/cli.sock" timeout 20s scripts/uce-cli /unit-0.uce)
|
||||
[[ "$marker" == *"common-b-0"* ]] || { echo "rebuilt parent did not execute the changed dependency: $marker" >&2; exit 1; }
|
||||
|
||||
Reference in New Issue
Block a user