generator: Can perform synchronous generation

This commit is contained in:
nemunaire 2023-07-10 12:10:03 +02:00
parent ec98e521dc
commit 1769938205
13 changed files with 214 additions and 81 deletions

View file

@ -10,17 +10,18 @@ import (
"path"
"runtime"
"sync"
"time"
"srs.epita.fr/fic-server/libfic"
)
var parallelJobs = runtime.NumCPU()
var genQueue chan fic.GenStruct
var genQueue chan *fic.GenStruct
var inQueueMutex sync.RWMutex
var inGenQueue map[fic.GenerateType]bool
func init() {
genQueue = make(chan fic.GenStruct)
genQueue = make(chan *fic.GenStruct)
inGenQueue = map[fic.GenerateType]bool{}
}
@ -47,12 +48,54 @@ func enqueueHandler(w http.ResponseWriter, r *http.Request) {
http.Error(w, "OK", http.StatusOK)
}
func appendGenQueue(gs fic.GenStruct) {
if gs.Type == fic.GenTeam || gs.Type == fic.GenTeamIssues {
genQueue <- gs
func performHandler(w http.ResponseWriter, r *http.Request) {
var gs fic.GenStruct
dec := json.NewDecoder(r.Body)
err := dec.Decode(&gs)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
log.Printf("POST /perform | %v", gs)
err = <-appendGenQueue(gs).GenEnded()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
} else {
http.Error(w, "OK", http.StatusOK)
}
}
func performFullResyncHandler(w http.ResponseWriter, r *http.Request) {
log.Printf("POST /full-resync started")
waitList := genAll()
var errs string
for _, e := range waitList {
err := <-e
if err != nil {
errs += err.Error() + "\n"
}
}
if errs != "" {
lastRegeneration = time.Now()
http.Error(w, errs, http.StatusInternalServerError)
} else {
http.Error(w, "done", http.StatusOK)
}
log.Printf("POST /full-resync done")
}
func appendGenQueue(gs fic.GenStruct) *fic.GenStruct {
if gs.Type == fic.GenTeam || gs.Type == fic.GenTeamIssues {
genQueue <- &gs
return &gs
}
// Append only if not already in queue
inQueueMutex.RLock()
if v, ok := inGenQueue[gs.Type]; !ok || !v {
@ -62,10 +105,12 @@ func appendGenQueue(gs fic.GenStruct) {
inGenQueue[gs.Type] = true
inQueueMutex.Unlock()
genQueue <- gs
genQueue <- &gs
} else {
inQueueMutex.RUnlock()
}
return &gs
}
func consumer() {
@ -98,6 +143,7 @@ func consumer() {
if err != nil {
log.Println(id, "[ERR] Unable to generate:", err)
}
gs.End(err)
}
}
@ -263,18 +309,26 @@ func genThemesFile() error {
return nil
}
func genAll() {
appendGenQueue(fic.GenStruct{Type: fic.GenThemes})
appendGenQueue(fic.GenStruct{Type: fic.GenTeams})
appendGenQueue(fic.GenStruct{Type: fic.GenEvents})
appendGenQueue(fic.GenStruct{Type: fic.GenPublic})
func genAll() (waitList []chan error) {
waitList = append(
waitList,
appendGenQueue(fic.GenStruct{Type: fic.GenThemes}).GenEnded(),
appendGenQueue(fic.GenStruct{Type: fic.GenTeams}).GenEnded(),
appendGenQueue(fic.GenStruct{Type: fic.GenEvents}).GenEnded(),
appendGenQueue(fic.GenStruct{Type: fic.GenPublic}).GenEnded(),
)
if teams, err := fic.GetActiveTeams(); err != nil {
log.Println("Team retrieval error: ", err)
} else {
for _, team := range teams {
appendGenQueue(fic.GenStruct{Type: fic.GenTeam, TeamId: team.Id})
appendGenQueue(fic.GenStruct{Type: fic.GenTeamIssues, TeamId: team.Id})
waitList = append(
waitList,
appendGenQueue(fic.GenStruct{Type: fic.GenTeam, TeamId: team.Id}).GenEnded(),
appendGenQueue(fic.GenStruct{Type: fic.GenTeamIssues, TeamId: team.Id}).GenEnded(),
)
}
}
return
}