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:
@@ -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/",
|
||||
|
||||
Reference in New Issue
Block a user