]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/job.c
Pool + label cleanups from bug reports
[bacula/bacula] / bacula / src / dird / job.c
index 55788a11a67a4f1cce356d369e129dfd4ed621ed..0a21271352795978ccf59626f523a6bc482bf086 100644 (file)
@@ -66,10 +66,8 @@ void init_job_server(int max_workers)
    wd->destructor = job_monitor_destructor;
    wd->one_shot = false;
    wd->interval = 60;
-   wd->data = create_control_jcr("*JobMonitor*", JT_SYSTEM);
+   wd->data = new_control_jcr("*JobMonitor*", JT_SYSTEM);
    register_watchdog(wd);
-   
-   return;
 }
 
 /*
@@ -82,24 +80,15 @@ void run_job(JCR *jcr)
    int stat, errstat;
 
    P(jcr->mutex);
-   sm_check(__FILE__, __LINE__, True);
+   sm_check(__FILE__, __LINE__, true);
    init_msg(jcr, jcr->messages);
-   create_unique_job_name(jcr, jcr->job->hdr.name);
-   set_jcr_job_status(jcr, JS_Created);
-   jcr->jr.SchedTime = jcr->sched_time;
-   jcr->jr.StartTime = jcr->start_time;
-   jcr->jr.EndTime = 0;              /* perhaps rescheduled, clear it */
-   jcr->jr.Type = jcr->JobType;
-   jcr->jr.Level = jcr->JobLevel;
-   jcr->jr.JobStatus = jcr->JobStatus;
-   bstrncpy(jcr->jr.Name, jcr->job->hdr.name, sizeof(jcr->jr.Name));
-   bstrncpy(jcr->jr.Job, jcr->Job, sizeof(jcr->jr.Job));
 
    /* Initialize termination condition variable */
    if ((errstat = pthread_cond_init(&jcr->term_wait, NULL)) != 0) {
       Jmsg1(jcr, M_FATAL, 0, _("Unable to init job cond variable: ERR=%s\n"), strerror(errstat));
       goto bail_out;
    }
+   jcr->term_wait_inited = true;
 
    /*
     * Open database
@@ -121,15 +110,17 @@ void run_job(JCR *jcr)
    /*
     * Create Job record  
     */
-   jcr->jr.JobStatus = jcr->JobStatus;
+   create_unique_job_name(jcr, jcr->job->hdr.name);
+   set_jcr_job_status(jcr, JS_Created);
+   init_jcr_job_record(jcr);
    if (!db_create_job_record(jcr, jcr->db, &jcr->jr)) {
       Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
       goto bail_out;
    }
    jcr->JobId = jcr->jr.JobId;
 
-   Dmsg4(50, "Created job record JobId=%d Name=%s Type=%c Level=%c\n", 
-       jcr->JobId, jcr->Job, jcr->jr.Type, jcr->jr.Level);
+   Dmsg4(100, "Created job record JobId=%d Name=%s Type=%c Level=%c\n", 
+       jcr->JobId, jcr->Job, jcr->jr.JobType, jcr->jr.JobLevel);
    Dmsg0(200, "Add jrc to work queue\n");
 
    /* Queue the job to be run */
@@ -160,11 +151,11 @@ static void *job_thread(void *arg)
 {
    JCR *jcr = (JCR *)arg;
 
-   pthread_detach(pthread_self());
-   sm_check(__FILE__, __LINE__, True);
+   jcr->my_thread_id = pthread_self();
+   pthread_detach(jcr->my_thread_id);
+   sm_check(__FILE__, __LINE__, true);
 
    for ( ;; ) {
-
       Dmsg0(200, "=====Start Job=========\n");
       jcr->start_time = time(NULL);     /* set the real start time */
       set_jcr_job_status(jcr, JS_Running);
@@ -253,7 +244,7 @@ static void *job_thread(void *arg)
             */
            if (status != 0) {
               if (jcr->JobStatus == JS_Terminated) {
-                  Jmsg(jcr, M_ERROR, 0, _("RunAfterJob returned non-zero status=%d\n"),
+                  Jmsg(jcr, M_WARNING, 0, _("RunAfterJob returned non-zero status=%d\n"),
                       status);
               } else {
                   Jmsg(jcr, M_FATAL, 0, _("RunAfterFailedJob returned non-zero status=%d\n"),
@@ -271,7 +262,7 @@ bail_out:
    }
 
    Dmsg0(50, "======== End Job ==========\n");
-   sm_check(__FILE__, __LINE__, True);
+   sm_check(__FILE__, __LINE__, true);
    return NULL;
 }
 
@@ -513,7 +504,7 @@ static bool job_check_maxruntime(JCR *control_jcr, JCR *jcr)
 /*
  * Get or create a Client record for this Job
  */
-int get_or_create_client_record(JCR *jcr)
+bool get_or_create_client_record(JCR *jcr)
 {
    CLIENT_DBR cr;
 
@@ -529,7 +520,7 @@ int get_or_create_client_record(JCR *jcr)
    if (!db_create_client_record(jcr, jcr->db, &cr)) {
       Jmsg(jcr, M_FATAL, 0, _("Could not create Client record. ERR=%s\n"), 
         db_strerror(jcr->db));
-      return 0;
+      return false;
    }
    jcr->jr.ClientId = cr.ClientId;
    if (cr.Uname[0]) {
@@ -540,18 +531,60 @@ int get_or_create_client_record(JCR *jcr)
    }
    Dmsg2(100, "Created Client %s record %d\n", jcr->client->hdr.name, 
       jcr->jr.ClientId);
-   return 1;
+   return true;
 }
 
+bool get_or_create_fileset_record(JCR *jcr, FILESET_DBR *fsr)
+{
+   /*
+    * Get or Create FileSet record
+    */
+   memset(fsr, 0, sizeof(FILESET_DBR));
+   bstrncpy(fsr->FileSet, jcr->fileset->hdr.name, sizeof(fsr->FileSet));
+   if (jcr->fileset->have_MD5) {
+      struct MD5Context md5c;
+      unsigned char signature[16];
+      memcpy(&md5c, &jcr->fileset->md5c, sizeof(md5c));
+      MD5Final(signature, &md5c);
+      bin_to_base64(fsr->MD5, (char *)signature, 16); /* encode 16 bytes */
+      bstrncpy(jcr->fileset->MD5, fsr->MD5, sizeof(jcr->fileset->MD5));
+   } else {
+      Jmsg(jcr, M_WARNING, 0, _("FileSet MD5 signature not found.\n"));
+   }
+   if (!db_create_fileset_record(jcr, jcr->db, fsr)) {
+      Jmsg(jcr, M_ERROR, 0, _("Could not create FileSet \"%s\" record. ERR=%s\n"), 
+        fsr->FileSet, db_strerror(jcr->db));
+      return false;
+   }   
+   jcr->jr.FileSetId = fsr->FileSetId;
+   if (fsr->created) {
+      Jmsg(jcr, M_INFO, 0, _("Created new FileSet record \"%s\" %s\n"), 
+        fsr->FileSet, fsr->cCreateTime);
+   }
+   Dmsg2(119, "Created FileSet %s record %u\n", jcr->fileset->hdr.name, 
+      jcr->jr.FileSetId);
+   return true;
+}
+
+void init_jcr_job_record(JCR *jcr)
+{
+   jcr->jr.SchedTime = jcr->sched_time;
+   jcr->jr.StartTime = jcr->start_time;
+   jcr->jr.EndTime = 0;              /* perhaps rescheduled, clear it */
+   jcr->jr.JobType = jcr->JobType;
+   jcr->jr.JobLevel = jcr->JobLevel;
+   jcr->jr.JobStatus = jcr->JobStatus;
+   jcr->jr.JobId = jcr->JobId;
+   bstrncpy(jcr->jr.Name, jcr->job->hdr.name, sizeof(jcr->jr.Name));
+   bstrncpy(jcr->jr.Job, jcr->Job, sizeof(jcr->jr.Job));
+}
 
 /*
  * Write status and such in DB
  */
 void update_job_end_record(JCR *jcr)
 {
-   if (jcr->jr.EndTime == 0) {
-      jcr->jr.EndTime = time(NULL);
-   }
+   jcr->jr.EndTime = time(NULL);
    jcr->end_time = jcr->jr.EndTime;
    jcr->jr.JobId = jcr->JobId;
    jcr->jr.JobStatus = jcr->JobStatus;
@@ -572,7 +605,7 @@ void update_job_end_record(JCR *jcr)
  *  Returns: unique job name in jcr->Job
  *    date/time in jcr->start_time
  */
-void create_unique_job_name(JCR *jcr, char *base_name)
+void create_unique_job_name(JCR *jcr, const char *base_name)
 {
    /* Job start mutex */
    static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -655,7 +688,10 @@ void dird_free_jcr(JCR *jcr)
       free_pool_memory(jcr->client_uname);
       jcr->client_uname = NULL;
    }
-   pthread_cond_destroy(&jcr->term_wait);
+   if (jcr->term_wait_inited) {
+      pthread_cond_destroy(&jcr->term_wait);
+   }
+   jcr->job_end_push.destroy();
    Dmsg0(200, "End dird free_jcr\n");
 }
 
@@ -693,6 +729,7 @@ void set_jcr_defaults(JCR *jcr, JOB *job)
    jcr->catalog = job->client->catalog;
    jcr->fileset = job->fileset;
    jcr->messages = job->messages; 
+   jcr->spool_data = job->spool_data;
    if (jcr->RestoreBootstrap) {
       free(jcr->RestoreBootstrap);
       jcr->RestoreBootstrap = NULL;