fix(backup): bezbedna zamena baze pri obnovi (sync.RWMutex + drain)

Obnova backupa (VratiBackup) je menjala Handler.DB i repozitorijume bez
zaključavanja dok drugi zahtevi rade — data race i moguć upit nad zatvorenom
konekcijom. Uveden Handler.mu (sync.RWMutex): zahtevi drže deljeno zaključavanje
preko middleware-a ZakljucajCitanje, a sama zamena (close+copy+reopen+reinit)
uzima ekskluzivno zaključavanje u zasebnoj gorutini, pa sačeka da svi tekući
zahtevi završe (drain) pre zamene. Zasebna gorutina je nužna jer zahtev još
drži deljeno zaključavanje (inače deadlock).

Poznato ograničenje: pozadinske gorutine i dalje koriste stari db handle iz
main.go — zaseban slučaj za kasnije.
This commit is contained in:
2026-06-12 19:43:40 +02:00
parent 4e40dd7296
commit 2dc2cf5245
3 changed files with 53 additions and 25 deletions
+3
View File
@@ -155,6 +155,9 @@ func main() {
r.Use(ntechmw.BezbednostHeaders())
r.Use(ntechmw.CsrfMiddleware)
r.Use(middleware.Compress(5))
// deljeno zaključavanje baze za vreme zahteva — obnova backupa (VratiBackup)
// čeka da svi zahtevi završe pre zamene konekcije (vidi handler.ZakljucajCitanje)
r.Use(h.ZakljucajCitanje)
// uploads su uvek na disku — korisnički fajlovi, ne ugrađuju se
r.Handle("/static/uploads/*", http.StripPrefix("/static/uploads/",