diff --git a/backend/main.go b/backend/main.go index 63306e23..f03f2000 100644 --- a/backend/main.go +++ b/backend/main.go @@ -6,9 +6,11 @@ import ( "log" "math/rand" "os" + "os/signal" "path" "strconv" "strings" + "syscall" "time" "srs.epita.fr/fic-server/libfic" @@ -43,6 +45,24 @@ func watchsubdir(watcher *fsnotify.Watcher, pathname string) error { } } +func walkAndTreat(pathname string) error { + if ds, err := ioutil.ReadDir(pathname); err != nil { + return err + } else { + for _, d := range ds { + p := path.Join(pathname, d.Name()) + if d.IsDir() && d.Name() != ".tmp" && d.Mode()&os.ModeSymlink == 0 { + if err := walkAndTreat(p); err != nil { + return err + } + } else if d.Mode().IsRegular() { + treat(p) + } + } + return nil + } +} + var ChStarted = false var lastRegeneration time.Time var skipInitialGeneration = false @@ -127,10 +147,24 @@ func main() { log.Fatal(err) } + // Register SIGUSR1, SIGUSR2 + interrupt1 := make(chan os.Signal, 1) + signal.Notify(interrupt1, syscall.SIGUSR1) + interrupt2 := make(chan os.Signal, 1) + signal.Notify(interrupt2, syscall.SIGUSR2) + watchedNotify := fsnotify.Create for { select { + case <-interrupt1: + log.Println("SIGUSR1 received, retreating all files in queue...") + walkAndTreat(SubmissionDir) + log.Println("SIGUSR1 treated.") + case <-interrupt2: + inQueueMutex.Lock() + log.Printf("SIGUSR2 received, dumping statistics:\n parallelJobs: %d\n genTeamQueue size: %d\n genQueue: %d\n Teams in queue: %v\n Challenge started: %v\n Last regeneration: %v\n", parallelJobs, len(genTeamQueue), len(genQueue), inGenQueue, ChStarted, lastRegeneration) + inQueueMutex.Unlock() case ev := <-watcher.Events: if d, err := os.Lstat(ev.Name); err == nil && ev.Op&fsnotify.Create == fsnotify.Create && d.Mode().IsDir() && d.Mode()&os.ModeSymlink == 0 && d.Name() != ".tmp" { // Register new subdirectory