Andreas Thienemann 074524
Andreas Thienemann 074524
This patch should fix the logic error in checking for the MaxWaitTime of
Andreas Thienemann 074524
a job in src/dird/job.c.  It fixes bug #802.
Andreas Thienemann 074524
Andreas Thienemann 074524
Apply it to Bacula version 2.0.3 with:
Andreas Thienemann 074524
Andreas Thienemann 074524
  cd <bacula-source>
Andreas Thienemann 074524
  patch -p0 <2.0.3-maxwaittime.patch
Andreas Thienemann 074524
  make
Andreas Thienemann 074524
  ...
Andreas Thienemann 074524
  make install
Andreas Thienemann 074524
Andreas Thienemann 074524
Andreas Thienemann 074524
Andreas Thienemann 074524
Index: src/dird/job.c
Andreas Thienemann 074524
===================================================================
Andreas Thienemann 074524
--- src/dird/job.c	(revision 4349)
Andreas Thienemann 074524
+++ src/dird/job.c	(working copy)
Andreas Thienemann 074524
@@ -481,7 +481,6 @@
Andreas Thienemann 074524
 static bool job_check_maxwaittime(JCR *control_jcr, JCR *jcr)
Andreas Thienemann 074524
 {
Andreas Thienemann 074524
    bool cancel = false;
Andreas Thienemann 074524
-   bool ok_to_cancel = false;
Andreas Thienemann 074524
    JOB *job = jcr->job;
Andreas Thienemann 074524
 
Andreas Thienemann 074524
    if (job_canceled(jcr)) {
Andreas Thienemann 074524
@@ -493,69 +492,18 @@
Andreas Thienemann 074524
    } 
Andreas Thienemann 074524
    if (jcr->JobLevel == L_FULL && job->FullMaxWaitTime != 0 &&
Andreas Thienemann 074524
          (watchdog_time - jcr->start_time) >= job->FullMaxWaitTime) {
Andreas Thienemann 074524
-      ok_to_cancel = true;
Andreas Thienemann 074524
+      cancel = true;
Andreas Thienemann 074524
    } else if (jcr->JobLevel == L_DIFFERENTIAL && job->DiffMaxWaitTime != 0 &&
Andreas Thienemann 074524
          (watchdog_time - jcr->start_time) >= job->DiffMaxWaitTime) {
Andreas Thienemann 074524
-      ok_to_cancel = true;
Andreas Thienemann 074524
+      cancel = true;
Andreas Thienemann 074524
    } else if (jcr->JobLevel == L_INCREMENTAL && job->IncMaxWaitTime != 0 &&
Andreas Thienemann 074524
          (watchdog_time - jcr->start_time) >= job->IncMaxWaitTime) {
Andreas Thienemann 074524
-      ok_to_cancel = true;
Andreas Thienemann 074524
+      cancel = true;
Andreas Thienemann 074524
    } else if (job->MaxWaitTime != 0 &&
Andreas Thienemann 074524
          (watchdog_time - jcr->start_time) >= job->MaxWaitTime) {
Andreas Thienemann 074524
-      ok_to_cancel = true;
Andreas Thienemann 074524
-   }
Andreas Thienemann 074524
-   if (!ok_to_cancel) {
Andreas Thienemann 074524
-      return false;
Andreas Thienemann 074524
-   }
Andreas Thienemann 074524
-
Andreas Thienemann 074524
-/*
Andreas Thienemann 074524
- * I don't see the need for all this -- kes 17Dec06
Andreas Thienemann 074524
- */
Andreas Thienemann 074524
-#ifdef xxx
Andreas Thienemann 074524
-   Dmsg3(800, "Job %d (%s): MaxWaitTime of %d seconds exceeded, "
Andreas Thienemann 074524
-         "checking status\n",
Andreas Thienemann 074524
-         jcr->JobId, jcr->Job, job->MaxWaitTime);
Andreas Thienemann 074524
-   switch (jcr->JobStatus) {
Andreas Thienemann 074524
-   case JS_Created:
Andreas Thienemann 074524
-   case JS_Blocked:
Andreas Thienemann 074524
-   case JS_WaitFD:
Andreas Thienemann 074524
-   case JS_WaitSD:
Andreas Thienemann 074524
-   case JS_WaitStoreRes:
Andreas Thienemann 074524
-   case JS_WaitClientRes:
Andreas Thienemann 074524
-   case JS_WaitJobRes:
Andreas Thienemann 074524
-   case JS_WaitPriority:
Andreas Thienemann 074524
-   case JS_WaitMaxJobs:
Andreas Thienemann 074524
-   case JS_WaitStartTime:
Andreas Thienemann 074524
       cancel = true;
Andreas Thienemann 074524
-      Dmsg0(200, "JCR blocked in #1\n");
Andreas Thienemann 074524
-      break;
Andreas Thienemann 074524
-   case JS_Running:
Andreas Thienemann 074524
-      Dmsg0(800, "JCR running, checking SD status\n");
Andreas Thienemann 074524
-      switch (jcr->SDJobStatus) {
Andreas Thienemann 074524
-      case JS_WaitMount:
Andreas Thienemann 074524
-      case JS_WaitMedia:
Andreas Thienemann 074524
-      case JS_WaitFD:
Andreas Thienemann 074524
-         cancel = true;
Andreas Thienemann 074524
-         Dmsg0(800, "JCR blocked in #2\n");
Andreas Thienemann 074524
-         break;
Andreas Thienemann 074524
-      default:
Andreas Thienemann 074524
-         Dmsg0(800, "JCR not blocked in #2\n");
Andreas Thienemann 074524
-         break;
Andreas Thienemann 074524
-      }
Andreas Thienemann 074524
-      break;
Andreas Thienemann 074524
-   case JS_Terminated:
Andreas Thienemann 074524
-   case JS_ErrorTerminated:
Andreas Thienemann 074524
-   case JS_Canceled:
Andreas Thienemann 074524
-   case JS_FatalError:
Andreas Thienemann 074524
-      Dmsg0(800, "JCR already dead in #3\n");
Andreas Thienemann 074524
-      break;
Andreas Thienemann 074524
-   default:
Andreas Thienemann 074524
-      Jmsg1(jcr, M_ERROR, 0, _("Unhandled job status code %d\n"),
Andreas Thienemann 074524
-            jcr->JobStatus);
Andreas Thienemann 074524
    }
Andreas Thienemann 074524
-   Dmsg3(800, "MaxWaitTime result: %scancel JCR %p (%s)\n",
Andreas Thienemann 074524
-         cancel ? "" : "do not ", jcr, jcr->Job);
Andreas Thienemann 074524
-#endif
Andreas Thienemann 074524
+
Andreas Thienemann 074524
    return cancel;
Andreas Thienemann 074524
 }
Andreas Thienemann 074524
 
Andreas Thienemann 074524
@@ -574,36 +522,6 @@
Andreas Thienemann 074524
       return false;
Andreas Thienemann 074524
    }
Andreas Thienemann 074524
 
Andreas Thienemann 074524
-#ifdef xxx
Andreas Thienemann 074524
-   switch (jcr->JobStatus) {
Andreas Thienemann 074524
-   case JS_Created:
Andreas Thienemann 074524
-   case JS_Running:
Andreas Thienemann 074524
-   case JS_Blocked:
Andreas Thienemann 074524
-   case JS_WaitFD:
Andreas Thienemann 074524
-   case JS_WaitSD:
Andreas Thienemann 074524
-   case JS_WaitStoreRes:
Andreas Thienemann 074524
-   case JS_WaitClientRes:
Andreas Thienemann 074524
-   case JS_WaitJobRes:
Andreas Thienemann 074524
-   case JS_WaitPriority:
Andreas Thienemann 074524
-   case JS_WaitMaxJobs:
Andreas Thienemann 074524
-   case JS_WaitStartTime:
Andreas Thienemann 074524
-   case JS_Differences:
Andreas Thienemann 074524
-      cancel = true;
Andreas Thienemann 074524
-      break;
Andreas Thienemann 074524
-   case JS_Terminated:
Andreas Thienemann 074524
-   case JS_ErrorTerminated:
Andreas Thienemann 074524
-   case JS_Canceled:
Andreas Thienemann 074524
-   case JS_FatalError:
Andreas Thienemann 074524
-      cancel = false;
Andreas Thienemann 074524
-      break;
Andreas Thienemann 074524
-   default:
Andreas Thienemann 074524
-      Jmsg1(jcr, M_ERROR, 0, _("Unhandled job status code %d\n"),
Andreas Thienemann 074524
-            jcr->JobStatus);
Andreas Thienemann 074524
-   }
Andreas Thienemann 074524
-
Andreas Thienemann 074524
-   Dmsg3(200, "MaxRunTime result: %scancel JCR %p (%s)\n",
Andreas Thienemann 074524
-         cancel ? "" : "do not ", jcr, jcr->Job);
Andreas Thienemann 074524
-#endif
Andreas Thienemann 074524
    return true;
Andreas Thienemann 074524
 }
Andreas Thienemann 074524