fix(row253): bound cleanup retries after initial inventory
This commit is contained in:
1 parent
cca9367168
commit
950cf47f3e
20 files changed
+5008
-39
No files matched your search
@@ -118,11 +118,9 @@ set +m
|
||||
seconds="$1" setsid_bin="$2" sleep_bin="$3"; shift 3
|
||||
child="" timer="" verified=0
|
||||
stat_fields() {
|
||||
local pid="$1" raw rest
|
||||
if ! raw="$(<"/proc/$pid/stat")" 2>/dev/null; then
|
||||
[ -e "/proc/$pid/stat" ] && return 1
|
||||
return 3
|
||||
fi
|
||||
local pid="$1" raw="" rest
|
||||
# EOF is expected: stat has no NUL. Decide on content, not read's status.
|
||||
IFS= read -r -d '' raw < "/proc/$pid/stat" 2>/dev/null || :
|
||||
[ -n "$raw" ] || { [ -e "/proc/$pid/stat" ] && return 1; return 3; }
|
||||
rest="${raw##*) }"
|
||||
[ "$rest" != "$raw" ] || return 1
|
||||
@@ -136,9 +134,7 @@ clock_cs() {
|
||||
CLOCK_CS=$((10#${BASH_REMATCH[1]} * 100 + 10#${BASH_REMATCH[2]}))
|
||||
}
|
||||
clean_session() {
|
||||
local entry pid rc live until
|
||||
clock_cs || return 1
|
||||
until=$((CLOCK_CS + 25))
|
||||
local entry pid rc live until=""
|
||||
while :; do
|
||||
live=0
|
||||
for entry in /proc/[0-9]*/stat; do
|
||||
@@ -156,6 +152,8 @@ clean_session() {
|
||||
done
|
||||
[ "$live" != 0 ] || return 0
|
||||
clock_cs || return 1
|
||||
# Inventory pass 1 is outside the bounded confirmation/retry budget.
|
||||
[ -n "$until" ] || until=$((CLOCK_CS + 25))
|
||||
[ "$CLOCK_CS" -lt "$until" ] || return 1
|
||||
"$sleep_bin" 0.01
|
||||
done
|
||||
@@ -176,7 +174,8 @@ trap finish EXIT
|
||||
trap 'exit 88' HUP INT TERM
|
||||
"$sleep_bin" "$seconds" & timer=$!
|
||||
"$setsid_bin" "$@" & child=$!
|
||||
for ((attempt=0; attempt<100; attempt++)); do
|
||||
# Allow session creation the whole inner budget, rather than a 200 ms margin.
|
||||
while :; do
|
||||
rc=0; stat_fields "$child" || rc=$?
|
||||
[ "$rc" = 0 ] || exit 85
|
||||
if [ "$ST_SESSION" = "$child" ]; then verified=1; break; fi
|
||||
|
||||
@@ -160,11 +160,9 @@ set +m
|
||||
seconds="$1" setsid_bin="$2" sleep_bin="$3"; shift 3
|
||||
child="" timer="" verified=0
|
||||
stat_fields() {
|
||||
local pid="$1" raw rest
|
||||
if ! raw="$(<"/proc/$pid/stat")" 2>/dev/null; then
|
||||
[ -e "/proc/$pid/stat" ] && return 1
|
||||
return 3
|
||||
fi
|
||||
local pid="$1" raw="" rest
|
||||
# EOF is expected: stat has no NUL. Decide on content, not read's status.
|
||||
IFS= read -r -d '' raw < "/proc/$pid/stat" 2>/dev/null || :
|
||||
[ -n "$raw" ] || { [ -e "/proc/$pid/stat" ] && return 1; return 3; }
|
||||
rest="${raw##*) }"
|
||||
[ "$rest" != "$raw" ] || return 1
|
||||
@@ -178,9 +176,7 @@ clock_cs() {
|
||||
CLOCK_CS=$((10#${BASH_REMATCH[1]} * 100 + 10#${BASH_REMATCH[2]}))
|
||||
}
|
||||
clean_session() {
|
||||
local entry pid rc live until
|
||||
clock_cs || return 1
|
||||
until=$((CLOCK_CS + 25))
|
||||
local entry pid rc live until=""
|
||||
while :; do
|
||||
live=0
|
||||
for entry in /proc/[0-9]*/stat; do
|
||||
@@ -198,6 +194,8 @@ clean_session() {
|
||||
done
|
||||
[ "$live" != 0 ] || return 0
|
||||
clock_cs || return 1
|
||||
# Inventory pass 1 is outside the bounded confirmation/retry budget.
|
||||
[ -n "$until" ] || until=$((CLOCK_CS + 25))
|
||||
[ "$CLOCK_CS" -lt "$until" ] || return 1
|
||||
"$sleep_bin" 0.01
|
||||
done
|
||||
@@ -218,7 +216,8 @@ trap finish EXIT
|
||||
trap 'exit 88' HUP INT TERM
|
||||
"$sleep_bin" "$seconds" & timer=$!
|
||||
"$setsid_bin" "$@" & child=$!
|
||||
for ((attempt=0; attempt<100; attempt++)); do
|
||||
# Allow session creation the whole inner budget, rather than a 200 ms margin.
|
||||
while :; do
|
||||
rc=0; stat_fields "$child" || rc=$?
|
||||
[ "$rc" = 0 ] || exit 85
|
||||
if [ "$ST_SESSION" = "$child" ]; then verified=1; break; fi
|
||||
|
||||
Reference in new issue
Block a user