]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/job.c
update configure
[bacula/bacula] / bacula / src / dird / job.c
index b3bee866cc7f94e8f9d07fa05b3c9a84dd5c3a1a..65fc720f61b2e3d0418b6b0b17667872d69ad204 100644 (file)
@@ -42,7 +42,7 @@ static void job_monitor_watchdog(watchdog_t *self);
 static void job_monitor_destructor(watchdog_t *self);
 static bool job_check_maxwaittime(JCR *jcr);
 static bool job_check_maxruntime(JCR *jcr);
-static bool job_check_maxschedruntime(JCR *jcr);
+static bool job_check_maxrunschedtime(JCR *jcr);
 
 /* Imported subroutines */
 extern void term_scheduler();
@@ -272,9 +272,9 @@ static void *job_thread(void *arg)
       Jmsg(jcr, M_FATAL, 0, _("Job canceled because max start delay time exceeded.\n"));
    }
 
-   if (job_check_maxschedruntime(jcr)) {
+   if (job_check_maxrunschedtime(jcr)) {
       jcr->setJobStatus(JS_Canceled);
-      Jmsg(jcr, M_FATAL, 0, _("Job canceled because max sched run time exceeded.\n"));
+      Jmsg(jcr, M_FATAL, 0, _("Job canceled because max run sched time exceeded.\n"));
    }
 
    /* TODO : check if it is used somewhere */
@@ -553,9 +553,9 @@ static void job_monitor_watchdog(watchdog_t *self)
          Qmsg(jcr, M_FATAL, 0, _("Max run time exceeded. Job canceled.\n"));
          cancel = true;
       /* check MaxRunSchedTime */ 
-      } else if (job_check_maxschedruntime(jcr)) {
+      } else if (job_check_maxrunschedtime(jcr)) {
          jcr->setJobStatus(JS_Canceled);
-         Qmsg(jcr, M_FATAL, 0, _("Max sched run time exceeded. Job canceled.\n"));
+         Qmsg(jcr, M_FATAL, 0, _("Max run sched time exceeded. Job canceled.\n"));
          cancel = true;
       }
 
@@ -647,14 +647,14 @@ static bool job_check_maxruntime(JCR *jcr)
  * Check if MaxRunSchedTime has expired and if the job can be
  *   canceled.
  */
-static bool job_check_maxschedruntime(JCR *jcr)
+static bool job_check_maxrunschedtime(JCR *jcr)
 {
-   if (jcr->job->MaxRunSchedTime == 0 || job_canceled(jcr)) {
+   if (jcr->MaxRunSchedTime == 0 || job_canceled(jcr)) {
       return false;
    }
-   if ((watchdog_time - jcr->sched_time) < jcr->job->MaxRunSchedTime) {
+   if ((watchdog_time - jcr->sched_time) < jcr->MaxRunSchedTime) {
       Dmsg3(200, "Job %p (%s) with MaxRunSchedTime %d not expired\n",
-            jcr, jcr->Job, jcr->job->MaxRunSchedTime);
+            jcr, jcr->Job, jcr->MaxRunSchedTime);
       return false;
    }
 
@@ -696,11 +696,19 @@ bool allow_duplicate_job(JCR *jcr)
 {
    JOB *job = jcr->job;
    JCR *djcr;                /* possible duplicate job */
+   bool cancel_dup = false;
+   bool cancel_me = false;
 
-   if (jcr->no_check_duplicates || job->AllowDuplicateJobs) {
+   /*
+    * See if AllowDuplicateJobs is set or
+    * if duplicate checking is disabled for this job.
+    */
+   if (job->AllowDuplicateJobs || job->IgnoreDuplicateJobChecking) {
       return true;
    }
+
    Dmsg0(800, "Enter allow_duplicate_job\n");
+
    /*
     * After this point, we do not want to allow any duplicate
     * job to run.
@@ -710,9 +718,16 @@ bool allow_duplicate_job(JCR *jcr)
       if (jcr == djcr || djcr->JobId == 0) {
          continue;                   /* do not cancel this job or consoles */
       }
+
+      /*
+       * See if this Job has the IgnoreDuplicateJobChecking flag set, ignore it for any
+       * checking against other jobs.
+       */
+      if (djcr->job && djcr->job->IgnoreDuplicateJobChecking) {
+         continue;
+      }
+
       if (strcmp(job->name(), djcr->job->name()) == 0) {
-         bool cancel_dup = false;
-         bool cancel_me = false; 
          if (job->DuplicateJobProximity > 0) {
             utime_t now = (utime_t)time(NULL);
             if ((now - djcr->start_time) > job->DuplicateJobProximity) {
@@ -751,9 +766,12 @@ bool allow_duplicate_job(JCR *jcr)
                  djcr->JobId);
               break;     /* get out of foreach_jcr */
             }
-         }   
-         /* Cancel one of the two jobs (me or dup) */
-         /* If CancelQueuedDuplicates is set do so only if job is queued */
+         }
+
+         /*
+          * Cancel one of the two jobs (me or dup)
+          * If CancelQueuedDuplicates is set do so only if job is queued.
+          */
          if (job->CancelQueuedDuplicates) {
              switch (djcr->JobStatus) {
              case JS_Created:
@@ -769,8 +787,11 @@ bool allow_duplicate_job(JCR *jcr)
                 break;
              }
          }
+
          if (cancel_dup || job->CancelRunningDuplicates) {
-            /* Zap the duplicated job djcr */
+            /*
+             * Zap the duplicated job djcr
+             */
             UAContext *ua = new_ua_context(jcr);
             Jmsg(jcr, M_INFO, 0, _("Cancelling duplicate JobId=%d.\n"), djcr->JobId);
             cancel_job(ua, djcr);
@@ -779,7 +800,9 @@ bool allow_duplicate_job(JCR *jcr)
             free_ua_context(ua);
             Dmsg2(800, "Cancel dup %p JobId=%d\n", djcr, djcr->JobId);
          } else {
-            /* Zap current job */
+            /*
+             * Zap current job
+             */
             Jmsg(jcr, M_FATAL, 0, _("JobId %d already running. Duplicate job not allowed.\n"),
                djcr->JobId);
             Dmsg2(800, "Cancel me %p JobId=%d\n", jcr, jcr->JobId);
@@ -1168,6 +1191,7 @@ void set_jcr_defaults(JCR *jcr, JOB *job)
    jcr->spool_size = job->spool_size;
    jcr->write_part_after_job = job->write_part_after_job;
    jcr->accurate = job->accurate;
+   jcr->MaxRunSchedTime = job->MaxRunSchedTime;
    if (jcr->RestoreBootstrap) {
       free(jcr->RestoreBootstrap);
       jcr->RestoreBootstrap = NULL;