fix(bpp): nie raportuj do Rollbara spodziewanej wiszącej referencji w __str__#677
fix(bpp): nie raportuj do Rollbara spodziewanej wiszącej referencji w __str__#677mpasternak wants to merge 2 commits into
Conversation
… __str__ Autor_Jednostka.__str__ miał już fallback na wypadek błędów "podczas usuwania" — komentarz wprost o tym mówił. Ale łapał gołe `except Exception` i raportował WSZYSTKO do Rollbara, łącznie z przypadkiem, dla którego ten fallback powstał: podczas kaskadowego kasowania Django buduje str() obiektu, który wciąż żyje w pamięci, choć jego wiersz i wiersz po drugiej stronie FK już zniknął. Efekt: itemy DoesNotExist: Autor matching query does not exist (#1098, #450) w produkcyjnym strumieniu błędów, mimo że aplikacja działała poprawnie. Rozdzielamy: ObjectDoesNotExist → log bez Rollbara (do_rollbar=False, parametr istniał już w zaloguj_polkniety_wyjatek właśnie dla benignych fallbacków); cokolwiek innego → raportuj jak dotąd. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
- Brakował test kierunku odwrotnego: cały sens tej zmiany to rozdzielenie dwóch gałęzi, a pokryta była jedna. Nowy test pilnuje, że wyjątek INNY niż ObjectDoesNotExist nadal trafia do Rollbara — zweryfikowany mutacją (cofnięcie `except ObjectDoesNotExist` do `except Exception` wywala test). - Dołożona asercja caplog: wyciszamy Rollbara, NIE diagnostykę. - Sprostowana skala w komentarzu i newsfragmencie. To nie był "strumień" — to 9 wystąpień w 2 itemach przez 10 dni. Prawdziwy powód zmiany jest inny i teraz jest opisany: hash itemu obejmuje numer linii, więc KAŻDY deploy zakładał nowy item i alert szedł od nowa. - Komentarz nie twierdzi już, że to "kaskadowe kasowanie" jako fakt — traceback z Rollbara nie zawiera ramek wywołującego. Wskazujemy easyaudit (object_repr liczony w transaction.on_commit) jako najpewniejszy znany mechanizm, ten sam, który opisuje komentarz przy Jednostka.__str__. - Odnotowane wprost: logger `bpp.*` nie ma dziś handlera w LOGGING, więc ślad ląduje na stderr przez logging.lastResort. Diagnostyka jest słaba, ale to osobny temat — nie powód, by zostawiać fałszywy alarm. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
Poprawki po self-reviewNaniesione w 1. Brakujący test kierunku odwrotnego. Cały sens zmiany to rozdzielenie 2. Asercja 3. Sprostowana skala — przesadziłem. Sprawdziłem w Rollbarze: to 9 4. „Kaskadowe kasowanie" nie jest faktem. 5. Newsfragment skrócony do dwóch linijek. Review słusznie: klient nie ma Odnotowane, poza zakresem tego PR-a
|
Problem
Autor_Jednostka.__str__miał już fallback na wypadek błędów podczasusuwania — komentarz w kodzie mówił o tym wprost:
Problem: łapał gołe
except Exceptioni raportował wszystko do Rollbara —łącznie z przypadkiem, dla którego ten fallback w ogóle powstał. Podczas
kaskadowego kasowania Django buduje
str()obiektu, który wciąż żyjew pamięci, choć jego wiersz (i wiersz po drugiej stronie FK) już zniknął:
Efekt: itemy #1098
i #450 w produkcyjnym
strumieniu błędów, mimo że aplikacja zachowywała się poprawnie.
Rozwiązanie
Rozdzielenie dwóch przypadków:
ObjectDoesNotExist→ log bez Rollbara. Parametrdo_rollbar=Falseistnieje w
zaloguj_polkniety_wyjatekdokładnie dla takich benignychfallbacków (patrz jego docstring).
Zachowanie widoczne dla użytkownika (tekst fallbacku, brak wyjątku) bez zmian.
Testy
Nowy
src/bpp/tests/test_models/test_autor_jednostka_str.py— TDD, testraportowania najpierw padał (
report.called == True).test_autor_jednostka_unikalnosc.pyitest_autor_scope.py—34 passed
🤖 Generated with Claude Code
https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH