/*
Bacula® - The Network Backup Solution
- Copyright (C) 2003-2010 Free Software Foundation Europe e.V.
+ Copyright (C) 2003-2011 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
*/
static bool reschedule_job(JCR *jcr, jobq_t *jq, jobq_item_t *je)
{
+ bool resched = false;
/*
- * Reschedule the job if necessary and requested
+ * Reschedule the job if requested and possible
*/
- if (jcr->job->RescheduleOnError &&
- jcr->JobStatus != JS_Terminated &&
- jcr->JobStatus != JS_Canceled &&
- jcr->getJobType() == JT_BACKUP &&
- (jcr->job->RescheduleTimes == 0 ||
- jcr->reschedule_count < jcr->job->RescheduleTimes)) {
+ /* Basic condition is that more reschedule times remain */
+ if (jcr->job->RescheduleTimes == 0 ||
+ jcr->reschedule_count < jcr->job->RescheduleTimes) {
+ resched =
+ /* Check for incomplete jobs */
+ (jcr->job->RescheduleIncompleteJobs &&
+ jcr->is_incomplete() && jcr->is_JobType(JT_BACKUP)) ||
+ /* Check for failed jobs */
+ (jcr->job->RescheduleOnError &&
+ !jcr->is_JobStatus(JS_Terminated) &&
+ !jcr->is_JobStatus(JS_Canceled) &&
+ jcr->is_JobType(JT_BACKUP));
+ }
+ if (resched) {
char dt[50], dt2[50];
/*
* Reschedule this job by cleaning it up, but
* reuse the same JobId if possible.
*/
+ jcr->incomplete = jcr->is_incomplete(); /* save incomplete status */
time_t now = time(NULL);
jcr->reschedule_count++;
jcr->sched_time = now + jcr->job->RescheduleInterval;
jcr->JobStatus = -1;
set_jcr_job_status(jcr, JS_WaitStartTime);
jcr->SDJobStatus = 0;
+ jcr->JobErrors = 0;
if (!allow_duplicate_job(jcr)) {
return false;
}
- if (jcr->JobBytes == 0) {
+ /* Only jobs with no output or Incomplete jobs can run on same JCR */
+ if (jcr->JobBytes == 0 || jcr->incomplete) {
Dmsg2(2300, "Requeue job=%d use=%d\n", jcr->JobId, jcr->use_count());
V(jq->mutex);
jobq_add(jq, jcr); /* queue the job to run again */