]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/job.c
SetIP command + CloseOnPoll + Full,Inc,Diff Pools + more access control checks
[bacula/bacula] / bacula / src / dird / job.c
index 1d3fd12096251f74e4319a9930eca6ebddcf410b..73eff3e13a7fd8a01ce9abe1ad36d1f211349cd1 100644 (file)
@@ -7,7 +7,7 @@
  *    Version $Id$
  */
 /*
-   Copyright (C) 2000-2003 Kern Sibbald and John Walker
+   Copyright (C) 2000-2004 Kern Sibbald and John Walker
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -124,6 +124,10 @@ static void job_monitor_watchdog(watchdog_t *self)
    unlock_jcr_chain();
 }
 
+/*
+ * Check if the maxwaittime has expired and it is possible
+ *  to cancel the job.
+ */
 static bool job_check_maxwaittime(JCR *control_jcr, JCR *jcr)
 {
    bool cancel = false;
@@ -140,41 +144,42 @@ static bool job_check_maxwaittime(JCR *control_jcr, JCR *jcr)
          "checking status\n",
         jcr->JobId, jcr->Job, jcr->job->MaxWaitTime);
    switch (jcr->JobStatus) {
-      case JS_Created:
-      case JS_Blocked:
+   case JS_Created:
+   case JS_Blocked:
+   case JS_WaitFD:
+   case JS_WaitSD:
+   case JS_WaitStoreRes:
+   case JS_WaitClientRes:
+   case JS_WaitJobRes:
+   case JS_WaitPriority:
+   case JS_WaitMaxJobs:
+   case JS_WaitStartTime:
+      cancel = true;
+      Dmsg0(200, "JCR blocked in #1\n");
+      break;
+   case JS_Running:
+      Dmsg0(200, "JCR running, checking SD status\n");
+      switch (jcr->SDJobStatus) {
+      case JS_WaitMount:
+      case JS_WaitMedia:
       case JS_WaitFD:
-      case JS_WaitSD:
-      case JS_WaitStoreRes:
-      case JS_WaitClientRes:
-      case JS_WaitJobRes:
-      case JS_WaitPriority:
-      case JS_WaitMaxJobs:
-      case JS_WaitStartTime:
         cancel = true;
-         Dmsg0(200, "JCR blocked in #1\n");
-        break;
-      case JS_Running:
-         Dmsg0(200, "JCR running, checking SD status\n");
-        switch (jcr->SDJobStatus) {
-           case JS_WaitMount:
-           case JS_WaitMedia:
-           case JS_WaitFD:
-              cancel = true;
-               Dmsg0(200, "JCR blocked in #2\n");
-              break;
-           default:
-               Dmsg0(200, "JCR not blocked in #2\n");
-              break;
-        }
-        break;
-      case JS_Terminated:
-      case JS_ErrorTerminated:
-      case JS_Canceled:
-         Dmsg0(200, "JCR already dead in #3\n");
+         Dmsg0(200, "JCR blocked in #2\n");
         break;
       default:
-         Emsg1(M_ABORT, 0, _("Unhandled job status code %d\n"),
-              jcr->JobStatus);
+         Dmsg0(200, "JCR not blocked in #2\n");
+        break;
+      }
+      break;
+   case JS_Terminated:
+   case JS_ErrorTerminated:
+   case JS_Canceled:
+   case JS_FatalError:
+      Dmsg0(200, "JCR already dead in #3\n");
+      break;
+   default:
+      Jmsg1(jcr, M_ERROR, 0, _("Unhandled job status code %d\n"),
+           jcr->JobStatus);
    }
    Dmsg3(200, "MaxWaitTime result: %scancel JCR %p (%s)\n",
          cancel ? "" : "do not ", jcr, jcr->job);
@@ -182,6 +187,10 @@ static bool job_check_maxwaittime(JCR *control_jcr, JCR *jcr)
    return cancel;
 }
 
+/*
+ * Check if maxruntime has expired and if the job can be
+ *   canceled.
+ */
 static bool job_check_maxruntime(JCR *control_jcr, JCR *jcr)
 {
    bool cancel = false;
@@ -196,27 +205,29 @@ static bool job_check_maxruntime(JCR *control_jcr, JCR *jcr)
    }
 
    switch (jcr->JobStatus) {
-      case JS_Created:
-      case JS_Blocked:
-      case JS_WaitFD:
-      case JS_WaitSD:
-      case JS_WaitStoreRes:
-      case JS_WaitClientRes:
-      case JS_WaitJobRes:
-      case JS_WaitPriority:
-      case JS_WaitMaxJobs:
-      case JS_WaitStartTime:
-      case JS_Running:
-        cancel = true;
-        break;
-      case JS_Terminated:
-      case JS_ErrorTerminated:
-      case JS_Canceled:
-        cancel = false;
-        break;
-      default:
-         Emsg1(M_ABORT, 0, _("Unhandled job status code %d\n"),
-              jcr->JobStatus);
+   case JS_Created:
+   case JS_Running:
+   case JS_Blocked:
+   case JS_WaitFD:
+   case JS_WaitSD:
+   case JS_WaitStoreRes:
+   case JS_WaitClientRes:
+   case JS_WaitJobRes:
+   case JS_WaitPriority:
+   case JS_WaitMaxJobs:
+   case JS_WaitStartTime:
+   case JS_Differences:
+      cancel = true;
+      break;
+   case JS_Terminated:
+   case JS_ErrorTerminated:
+   case JS_Canceled:
+   case JS_FatalError:
+      cancel = false;
+      break;
+   default:
+      Jmsg1(jcr, M_ERROR, 0, _("Unhandled job status code %d\n"),
+           jcr->JobStatus);
    }
 
    Dmsg3(200, "MaxRunTime result: %scancel JCR %p (%s)\n",
@@ -467,16 +478,18 @@ static void *job_thread(void *arg)
                Jmsg(jcr, M_INFO, 0, _("RunAfter: %s"), line);
            }
            status = close_bpipe(bpipe);
+           /*
+            * Note, if we get an error here, do not mark the
+            *  job in error, simply report the error condition.   
+            */
            if (status != 0) {
               if (jcr->JobStatus == JS_Terminated) {
-                  Jmsg(jcr, M_FATAL, 0, _("RunAfterJob returned non-zero status=%d\n"),
+                  Jmsg(jcr, M_ERROR, 0, _("RunAfterJob returned non-zero status=%d\n"),
                       status);
               } else {
                   Jmsg(jcr, M_FATAL, 0, _("RunAfterFailedJob returned non-zero status=%d\n"),
                       status);
               }
-              set_jcr_job_status(jcr, JS_FatalError);
-              update_job_end_record(jcr);
            }
         }
       }
@@ -667,6 +680,9 @@ void set_jcr_defaults(JCR *jcr, JOB *job)
    }
    pm_strcpy(&jcr->client_name, jcr->client->hdr.name);
    jcr->pool = job->pool;
+   jcr->full_pool = job->full_pool;
+   jcr->inc_pool = job->inc_pool;
+   jcr->dif_pool = job->dif_pool;
    jcr->catalog = job->client->catalog;
    jcr->fileset = job->fileset;
    jcr->messages = job->messages;