{"id":"c1161","filename":"c1161_load_test_rezultat.dok.json","weise3_id":"042301a9362bc541a4673df8f9c5b4f29bfb7d3602ce9298fd094996ff86bb67","tip":"load-test+bugfix","naziv":"Load test rezultat + race condition fix (4/4 PASSED)","kreator":"genesis","datum":"2026-05-29","snippet":"","status":"verificirano","prev_weise3":"","bunker_l":"#295150","full":{"tip":"load-test+bugfix","naziv":"Load test rezultat + race condition fix (4/4 PASSED)","sto_je_testirano":["20 konkurentnih next_invoice_number za istu tvrtku: 0.607s, 1..20 sekvencijalni, nema duplikata","5 tvrtki x 4 paralelna poziva: nema mijesanja countera, svaka 1..4","20 QR PNG generiranih paralelno: 0.244s, svi razliciti, svi valjan PNG","1000 next_formatted: 0.67ms (cisti Python, bez I/O)"],"bug_koji_je_pronadjen":{"naziv":"Race condition na prvom racunu tvrtke","opis":"SELECT FOR UPDATE ne stiti INSERT novog reda (non-existent row lock)","scenarij":"Dva konkurentna zahtjeva oba vide seq=None, oba pokusaju INSERT, drugi dobiva UniqueViolation","fix":"INSERT INTO invoicing_sequence ... ON CONFLICT ON CONSTRAINT uq_invoicing_sequence DO NOTHING, zatim SELECT FOR UPDATE","fajl":"invoicing/service.py: next_invoice_number()","severity":"P1 - pogada prvu fakturu svake nove tvrtke"},"rezultat":"4/4 PASSED, MAR+EU sync, gunicorn restart","weise3_id":"042301a9362bc541a4673df8f9c5b4f29bfb7d3602ce9298fd094996ff86bb67","prev_revision":"c1160","datum":"2026-05-29","status":"verificirano"}}