// GetPendingTaskCount returns the total number of pending tasks of all types. On error, the first // return value will be -1 and the second return value will be non-nil. func GetPendingTaskCount() (int64, error) { var result int64 = 0 params := task_common.QueryParams{ PendingOnly: true, CountQuery: true, } for _, prototype := range task_types.Prototypes() { query, args := task_common.DBTaskQuery(prototype, params) var countVal int64 = 0 if err := db.DB.Get(&countVal, query, args...); err != nil { return -1, err } result += countVal } return result, nil }
// repeatedTasksScheduler looks for all tasks that contain repeat_after_days // set to > 0 and schedules them when the specified time comes. // The function does the following: // 1. Look for tasks that need to be scheduled in the next 5 minutes. // 2. Loop over these tasks. // 2.1 Schedule the task again and set repeat_after_days to what it // originally was. // 2.2 Update the original task and set repeat_after_days to 0 since the // newly created task will now replace it. func repeatedTasksScheduler() { for _ = range time.Tick(*tasksSchedulerWaitTime) { // Loop over all tasks to find tasks which need to be scheduled. for _, prototype := range task_types.Prototypes() { query, args := task_common.DBTaskQuery(prototype, task_common.QueryParams{ FutureRunsOnly: true, Offset: 0, Size: task_common.MAX_PAGE_SIZE, }) glog.Infof("Running %s", query) data, err := prototype.Select(query, args...) if err != nil { glog.Errorf("Failed to query %s tasks: %v", prototype.GetTaskName(), err) continue } tasks := task_common.AsTaskSlice(data) for _, task := range tasks { addedTime := ctutil.GetTimeFromTs(strconv.FormatInt(task.GetCommonCols().TsAdded.Int64, 10)) scheduledTime := addedTime.Add(time.Duration(task.GetCommonCols().RepeatAfterDays) * time.Hour * 24) cutOffTime := time.Now().UTC().Add(*tasksSchedulerWaitTime) if scheduledTime.Before(cutOffTime) { addTaskVars := task.GetPopulatedAddTaskVars() if _, err := task_common.AddTask(addTaskVars); err != nil { glog.Errorf("Failed to add task %v: %v", task, err) continue } taskVars := task.GetUpdateTaskVars() taskVars.GetUpdateTaskCommonVars().Id = task.GetCommonCols().Id taskVars.GetUpdateTaskCommonVars().ClearRepeatAfterDays() if err := task_common.UpdateTask(taskVars, task.TableName()); err != nil { glog.Errorf("Failed to update task %v: %v", task, err) continue } } } } } }