generator: Can perform synchronous generation
This commit is contained in:
parent
ec98e521dc
commit
1769938205
13 changed files with 214 additions and 81 deletions
|
@ -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
|
||||
}
|
||||
|
|
Reference in a new issue