func GenerateJobsCycle() { hostname, err := os.Hostname() if err != nil { log.Fatalf("Could not get hostname: %s", err.Error()) } log.Print("Initial select from RunQueue and starting launcher goroutines") if err := selectRQAndNotify(); err != nil { log.Fatalf("Could not do initial select run queue: %s", err.Error()) } log.Print("Initial select from Timetable") ttRows, err := selectTimetable() if err != nil { log.Fatalf("Could not do initial select timetable: %s", err.Error()) } log.Print("Starting jobgen goroutines") if err := notifyForFullTTSelect(ttRows, false); err != nil { log.Fatalf("Could notify about timetable: %s", err.Error()) } for { res, err := db.LockCycle(getLockName(), hostname) if err != nil || !res { if err == nil { log.Println("Could not get lock, another host holds it? Retrying in 10 seconds") } else { log.Warningf("Could not get lock, got DB error: ", err.Error()) } time.Sleep(time.Second * 10) continue } // timer := pinba.TimerStart(map[string]string{"group": "jobgenerator"}) startTs := time.Now().UnixNano() db.LogCycleStart(CYCLE_CLASS_NAME, hostname, 0) log.Debug("Cycle started") success := doCycle() log.Debug("Cycle finished") successInt := 1 if !success { successInt = 0 } db.LogCycleStop(CYCLE_CLASS_NAME, hostname, 0, successInt) passedMs := int64((time.Now().UnixNano() - startTs) / 1e6) if passedMs < cycleMs { time.Sleep(time.Duration(cycleMs-passedMs) * time.Millisecond) } } }
func logFailedLocation(settings *ScriptSettings, location, failureReason string) { failedLocationsMutex.Lock() defer failedLocationsMutex.Unlock() if failedLocations[location] { return } failedLocations[location] = true log.Println("Failed location " + location + " for script " + settings.class_name + ": " + failureReason) }