Pułapki przy zmianie sesji wdrożeniowej i pętli auto-update¶
Strona dla osoby edytującej scripts/deploy-with-warning.sh,
scripts/site-down-warning.sh, scripts/autoupdate.sh i cele w
mk/deployment.mk. Instrukcje operatorskie są osobno:
Przerwa techniczna i
Aktualizacje.
Wspólna cecha wszystkich opisanych tu błędów: awaria jest cicha. Serwis zostaje zablokowany albo pętla umiera, a jedynym śladem jest brak śladu.
Przerwa techniczna¶
To repozytorium nie zawiera logiki odliczania¶
Baner, strona 503 i każda zmiana stanu należą do django-countdown (>= 0.3.0)
w obrazie BPP. My wyłącznie wołamy manage.py.
Nie przywracaj ścieżki przez manage.py shell
Wcześniejsza implementacja pisała wprost do modelu SiteCountdown. To
obchodzi walidację i logikę aplikacji, a przy zmianie schematu w obrazie
psuje się bez ostrzeżenia. Jeśli brakuje operacji — należy ona do
django-countdown, nie tutaj.
Domyślny zakres różni się między komendami¶
To nie jest niekonsekwencja do „posprzątania" — to kontrakt aplikacji nadrzędnej, a jego zignorowanie zostawia otwarte domeny w trakcie przerwy.
| Komenda | Domyślny cel | Ma --all? |
|---|---|---|
stop_countdown, show_countdown |
wszystkie witryny | — |
extend_countdown, shorten_countdown |
tylko bieżąca | tak |
start_countdown |
tylko bieżąca | nie |
Ostatni wiersz jest powodem, dla którego istnieje pętla po SITE_IDS. Przy
multi-hoście jedna instalacja obsługuje wiele
domen (DJANGO_BPP_HOSTNAMES → wiele wierszy Site, rozwiązywanych per żądanie
przez SiteResolutionMiddleware) — bez tej pętli zablokujesz jedną, a resztę
zostawisz otwartą.
Nigdy nie ucisz heartbeatu przez || true¶
Podtrzymanie terminu to extend_countdown --at-least, dla którego pusty cel
jest celowo sukcesem. Skoro tak, to niezerowy kod wyjścia niesie konkretną
informację: podłoga dead-man's switcha wygasła.
Sesja ma to głośno zalogować i pracować dalej (nieudany exec w środku
recreate'u jest spodziewany). Zamiana na || true zamienia jedyny sygnał
o wygasłej blokadzie w ciszę.
maintenance_until służy tu dwóm panom naraz — jest ETA pokazywanym
użytkownikom i dead-man's switchem. Godzi je max(ETA operatora, teraz + FLOOR),
czyli dokładnie to, co --at-least liczy po stronie bazy.
Sonda obecności nie może wchodzić w grep -q¶
Pod set -o pipefail: grep -q zamyka potok na pierwszym dopasowaniu, producent
ginie od SIGPIPE (141), a udane dopasowanie zwraca porażkę. Efekt: wdrożenie
schodzi do trybu „bez ostrzeżenia", losowo i bez komunikatu.
Poprawnie: wczytaj całe wyjście do zmiennej, dopasuj w bashu. Pilnuje tego
test_site_down_warning_contract w tests/test_makefile.sh.