func (s *Scheduler) LoadActionTimings(storage engine.AccountingStorage) { actionTimings, err := storage.GetAllActionTimings() if err != nil { engine.Logger.Warning(fmt.Sprintf("Cannot get action timings: %v", err)) } // recreate the queue s.Lock() s.queue = engine.ActionTimingPriotityList{} for key, ats := range actionTimings { toBeSaved := false isAsap := false newAts := make([]*engine.ActionTiming, 0) // will remove the one time runs from the database for _, at := range ats { isAsap = at.IsASAP() toBeSaved = toBeSaved || isAsap if isAsap { if len(at.AccountIds) > 0 { engine.Logger.Info(fmt.Sprintf("Time for one time action on %v", key)) } at.Execute() at.AccountIds = make([]string, 0) // do not append it to the newAts list to be saved } else { now := time.Now() if at.GetNextStartTime(now).Before(now) { // the task is obsolete, do not add it to the queue continue } s.queue = append(s.queue, at) } // save even asap action timings with empty account id list newAts = append(newAts, at) } if toBeSaved { engine.AccLock.Guard(engine.ACTION_TIMING_PREFIX, func() (float64, error) { storage.SetActionTimings(key, newAts) return 0, nil }) } } sort.Sort(s.queue) s.Unlock() }