]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/job.c
Massive SD calling sequence reorganization
[bacula/bacula] / bacula / src / dird / job.c
index 0a21271352795978ccf59626f523a6bc482bf086..33935436d76bae0f8c2b6c9eed44c2299fc2f7e9 100644 (file)
@@ -42,6 +42,7 @@ static bool job_check_maxruntime(JCR *control_jcr, JCR *jcr);
 extern void term_scheduler();
 extern void term_ua_server();
 extern int do_backup(JCR *jcr);
+extern bool do_mac(JCR *jcr);
 extern int do_admin(JCR *jcr);
 extern int do_restore(JCR *jcr);
 extern int do_verify(JCR *jcr);
@@ -49,7 +50,7 @@ extern int do_verify(JCR *jcr);
 /* Imported variables */
 extern time_t watchdog_time;
 
-jobq_t job_queue;
+jobq_t job_queue;
 
 void init_job_server(int max_workers)
 {
@@ -57,7 +58,8 @@ void init_job_server(int max_workers)
    watchdog_t *wd;
    
    if ((stat = jobq_init(&job_queue, max_workers, job_thread)) != 0) {
-      Emsg1(M_ABORT, 0, _("Could not init job queue: ERR=%s\n"), strerror(stat));
+      berrno be;
+      Emsg1(M_ABORT, 0, _("Could not init job queue: ERR=%s\n"), be.strerror(stat));
    }
    if ((wd = new_watchdog()) == NULL) {
       Emsg0(M_ABORT, 0, _("Could not init job monitor watchdogs\n"));
@@ -70,14 +72,23 @@ void init_job_server(int max_workers)
    register_watchdog(wd);
 }
 
+void term_job_server()
+{
+   jobq_destroy(&job_queue);         /* ignore any errors */
+}
+
 /*
  * Run a job -- typically called by the scheduler, but may also
  *             be called by the UA (Console program).
  *
+ *  Returns: 0 on failure
+ *          JobId on success
+ *
  */
-void run_job(JCR *jcr)
+JobId_t run_job(JCR *jcr)
 {
    int stat, errstat;
+   JobId_t JobId = 0;
 
    P(jcr->mutex);
    sm_check(__FILE__, __LINE__, true);
@@ -85,7 +96,8 @@ void run_job(JCR *jcr)
 
    /* 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));
+      berrno be;
+      Jmsg1(jcr, M_FATAL, 0, _("Unable to init job cond variable: ERR=%s\n"), be.strerror(errstat));
       goto bail_out;
    }
    jcr->term_wait_inited = true;
@@ -96,7 +108,8 @@ void run_job(JCR *jcr)
    Dmsg0(50, "Open database\n");
    jcr->db=db_init_database(jcr, jcr->catalog->db_name, jcr->catalog->db_user,
                            jcr->catalog->db_password, jcr->catalog->db_address,
-                           jcr->catalog->db_port, jcr->catalog->db_socket);
+                           jcr->catalog->db_port, jcr->catalog->db_socket,
+                           jcr->catalog->mult_db_connections);
    if (!jcr->db || !db_open_database(jcr, jcr->db)) {
       Jmsg(jcr, M_FATAL, 0, _("Could not open database \"%s\".\n"),
                 jcr->catalog->db_name);
@@ -117,7 +130,7 @@ void run_job(JCR *jcr)
       Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
       goto bail_out;
    }
-   jcr->JobId = jcr->jr.JobId;
+   JobId = jcr->JobId = jcr->jr.JobId;
 
    Dmsg4(100, "Created job record JobId=%d Name=%s Type=%c Level=%c\n", 
        jcr->JobId, jcr->Job, jcr->jr.JobType, jcr->jr.JobLevel);
@@ -125,18 +138,20 @@ void run_job(JCR *jcr)
 
    /* Queue the job to be run */
    if ((stat = jobq_add(&job_queue, jcr)) != 0) {
-      Jmsg(jcr, M_FATAL, 0, _("Could not add job queue: ERR=%s\n"), strerror(stat));
+      berrno be;
+      Jmsg(jcr, M_FATAL, 0, _("Could not add job queue: ERR=%s\n"), be.strerror(stat));
+      JobId = 0;
       goto bail_out;
    }
    Dmsg0(100, "Done run_job()\n");
 
    V(jcr->mutex);
-   return;
+   return JobId;
 
 bail_out:
    set_jcr_job_status(jcr, JS_ErrorTerminated);
    V(jcr->mutex);
-   return;
+   return JobId;
 
 }
 
@@ -184,8 +199,8 @@ static void *job_thread(void *arg)
            }
            status = close_bpipe(bpipe);
            if (status != 0) {
-               Jmsg(jcr, M_FATAL, 0, _("RunBeforeJob returned non-zero status=%d\n"),
-                 status);
+              berrno be;
+               Jmsg(jcr, M_FATAL, 0, _("RunBeforeJob error: ERR=%s\n"), be.strerror(status));
               set_jcr_job_status(jcr, JS_FatalError);
               update_job_end_record(jcr);
               goto bail_out;
@@ -216,6 +231,14 @@ static void *job_thread(void *arg)
               do_autoprune(jcr);
            }
            break;
+        case JT_MIGRATION:
+        case JT_COPY:
+        case JT_ARCHIVE:
+           do_mac(jcr);              /* migration, archive, copy */
+           if (jcr->JobStatus == JS_Terminated) {
+              do_autoprune(jcr);
+           }
+           break;
         default:
             Pmsg1(0, "Unimplemented job type: %d\n", jcr->JobType);
            break;
@@ -243,12 +266,11 @@ static void *job_thread(void *arg)
             *  job in error, simply report the error condition.   
             */
            if (status != 0) {
+              berrno be;
               if (jcr->JobStatus == JS_Terminated) {
-                  Jmsg(jcr, M_WARNING, 0, _("RunAfterJob returned non-zero status=%d\n"),
-                      status);
+                  Jmsg(jcr, M_WARNING, 0, _("RunAfterJob error: ERR=%s\n"), be.strerror(status));
               } else {
-                  Jmsg(jcr, M_FATAL, 0, _("RunAfterFailedJob returned non-zero status=%d\n"),
-                      status);
+                  Jmsg(jcr, M_FATAL, 0, _("RunAfterFailedJob error: ERR=%s\n"), be.strerror(status));
               }
            }
         }
@@ -316,6 +338,9 @@ int cancel_job(UAContext *ua, JCR *jcr)
       /* Cancel Storage daemon */
       if (jcr->store_bsock) {
         ua->jcr->store = jcr->store;
+        for (int i=0; i<MAX_STORE; i++) {
+           ua->jcr->storage[i] = jcr->storage[i];
+        }
         if (!connect_to_storage_daemon(ua->jcr, 10, SDConnectTimeout, 1)) {
             bsendmsg(ua, _("Failed to connect to Storage daemon.\n"));
            return 0;
@@ -516,7 +541,7 @@ bool get_or_create_client_record(JCR *jcr)
    if (!jcr->client_name) {
       jcr->client_name = get_pool_memory(PM_NAME);
    }
-   pm_strcpy(&jcr->client_name, jcr->client->hdr.name);
+   pm_strcpy(jcr->client_name, jcr->client->hdr.name);
    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));
@@ -527,7 +552,7 @@ bool get_or_create_client_record(JCR *jcr)
       if (!jcr->client_uname) {
         jcr->client_uname = get_pool_memory(PM_NAME);
       }
-      pm_strcpy(&jcr->client_uname, cr.Uname);
+      pm_strcpy(jcr->client_uname, cr.Uname);
    }
    Dmsg2(100, "Created Client %s record %d\n", jcr->client->hdr.name, 
       jcr->jr.ClientId);
@@ -551,11 +576,14 @@ bool get_or_create_fileset_record(JCR *jcr, FILESET_DBR *fsr)
    } 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;
-   }   
+   if (!jcr->fileset->ignore_fs_changes ||
+       !db_get_fileset_record(jcr, jcr->db, fsr)) {
+      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"), 
@@ -712,16 +740,18 @@ void set_jcr_defaults(JCR *jcr, JOB *job)
       jcr->JobLevel = L_NONE;
       break;
    default:
-      jcr->JobLevel = job->level;
+      jcr->JobLevel = job->JobLevel;
       break;
    }
    jcr->JobPriority = job->Priority;
-   jcr->store = job->storage;
+   for (int i=0; i<MAX_STORE; i++) {
+      jcr->storage[i] = job->storage[i];
+   }
    jcr->client = job->client;
    if (!jcr->client_name) {
       jcr->client_name = get_pool_memory(PM_NAME);
    }
-   pm_strcpy(&jcr->client_name, jcr->client->hdr.name);
+   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;