netns: удаление netns безусловно + проверка результата (#56)

Флак: ns_exists мог вернуть false до удаления, и namespace оставался жить.
Теперь `ip netns delete` вызывается всегда, результат проверяется до 5 раз.
Стабильность в контейнере: 5/5 прогонов rc=0 (было 4/5).

Refs #21, Refs #56
This commit is contained in:
2026-10-28 21:37:09 +03:00
parent 63e75e4b7f
commit 6c5d739cfc
+4 -3
View File
@@ -28,13 +28,14 @@ topology_down() {
local quiet="${1:-}" local quiet="${1:-}"
[ "$quiet" = quiet ] || log "удаляю топологию" [ "$quiet" = quiet ] || log "удаляю топологию"
# netns удаляем первыми: вместе с ними уходят veth-концы и процессы внутри. # netns удаляем первыми: вместе с ними уходят veth-концы и процессы внутри.
# `ip netns delete` в контейнере иногда возвращает успех, но namespace # `ip netns delete` в контейнере иногда «теряется»: команда отработала, а
# остаётся виден в `ip netns list` (issue #56) — поэтому повторяем удаление. # namespace остаётся в `ip netns list` (issue #56). Поэтому удаляем
# безусловно (операция идемпотентна) и до 5 раз проверяем результат.
local ns attempt local ns attempt
for ns in "$AWG_NS_CLIENT" "$AWG_NS_GW" "$AWG_NS_UPLINK"; do for ns in "$AWG_NS_CLIENT" "$AWG_NS_GW" "$AWG_NS_UPLINK"; do
for attempt in 1 2 3 4 5; do for attempt in 1 2 3 4 5; do
if ! ns_exists "$ns"; then break; fi
ip netns delete "$ns" 2>/dev/null || true ip netns delete "$ns" 2>/dev/null || true
if ! ns_exists "$ns"; then break; fi
sleep 0.2 sleep 0.2
done done
if ns_exists "$ns"; then if ns_exists "$ns"; then