From 588563ce18776705377b858b6780ec7642274039 Mon Sep 17 00:00:00 2001 From: Marco van Wieringen Date: Sat, 4 May 2013 21:11:39 +0200 Subject: [PATCH] Fix MaxRunSchedTime to cancel Job in time. Modified the code so MaxRunSchedTime will use the new initial_sched_time when checking to see if a job should be canceled. We have a set of jobs that we want to definitely end at a known time - Z hours after they've been initially scheduled - no matter what state the job is in. Patch by Thomas Lohman from bacula devel mailinglist. --- AUTHORS | 1 + src/dird/job.c | 2 +- src/dird/jobq.c | 1 + src/include/jcr.h | 3 ++- src/lib/jcr.c | 1 + 5 files changed, 6 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 9ccf86574d1..64ac2c31f79 100644 --- a/AUTHORS +++ b/AUTHORS @@ -104,6 +104,7 @@ Scott Bailey Sergey Svishchev Stefan Reddig Thomas Glatthor +Thomas Lohman Thorsten Enge Tim Oberfoell Tomas Cameron diff --git a/src/dird/job.c b/src/dird/job.c index 7df0858813c..16e73d2277e 100644 --- a/src/dird/job.c +++ b/src/dird/job.c @@ -703,7 +703,7 @@ static bool job_check_maxrunschedtime(JCR *jcr) if (jcr->MaxRunSchedTime == 0 || job_canceled(jcr)) { return false; } - if ((watchdog_time - jcr->sched_time) < jcr->MaxRunSchedTime) { + if ((watchdog_time - jcr->initial_sched_time) < jcr->MaxRunSchedTime) { Dmsg3(200, "Job %p (%s) with MaxRunSchedTime %d not expired\n", jcr, jcr->Job, jcr->MaxRunSchedTime); return false; diff --git a/src/dird/jobq.c b/src/dird/jobq.c index 977db26bfb0..bae580f07e1 100644 --- a/src/dird/jobq.c +++ b/src/dird/jobq.c @@ -675,6 +675,7 @@ static bool reschedule_job(JCR *jcr, jobq_t *jq, jobq_item_t *je) set_jcr_defaults(njcr, jcr->res.job); njcr->reschedule_count = jcr->reschedule_count; njcr->sched_time = jcr->sched_time; + njcr->initial_sched_time = jcr->initial_sched_time; /* * Special test here since a Virtual Full gets marked * as a Full, so we look at the resource record diff --git a/src/include/jcr.h b/src/include/jcr.h index 5bbccae2eca..e807d1d6907 100644 --- a/src/include/jcr.h +++ b/src/include/jcr.h @@ -314,6 +314,7 @@ class JCR { volatile int32_t JobStatus; /* ready, running, blocked, terminated */ int32_t JobPriority; /* Job priority */ time_t sched_time; /* Job schedule time, i.e. when it should start */ + time_t initial_sched_time; /* Original sched time before any reschedules are done */ time_t start_time; /* When job actually started */ time_t run_time; /* Used for computing speed */ time_t last_time; /* Last sample time */ @@ -398,7 +399,7 @@ class JCR { uint32_t ExpectedFiles; /* Expected restore files */ uint32_t MediaId; /* DB record IDs associated with this job */ uint32_t FileIndex; /* Last FileIndex processed */ - utime_t MaxRunSchedTime; /* Max run time in seconds from Scheduled time*/ + utime_t MaxRunSchedTime; /* Max run time in seconds from Initial Scheduled time */ POOLMEM *fname; /* Name to put into catalog */ POOLMEM *component_fname; /* Component info file name */ FILE *component_fd; /* Component info file desc */ diff --git a/src/lib/jcr.c b/src/lib/jcr.c index 8d53cda00b1..a5bca93e15d 100644 --- a/src/lib/jcr.c +++ b/src/lib/jcr.c @@ -354,6 +354,7 @@ JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr) } jcr->job_end_push.init(1, false); jcr->sched_time = time(NULL); + jcr->initial_sched_time = jcr->sched_time; jcr->daemon_free_jcr = daemon_free_jcr; /* plug daemon free routine */ jcr->init_mutex(); jcr->inc_use_count();