]> 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 61987e12e9277c2f1ac0873ef4efb59fc655fe27..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)
 {
@@ -58,8 +59,7 @@ void init_job_server(int max_workers)
    
    if ((stat = jobq_init(&job_queue, max_workers, job_thread)) != 0) {
       berrno be;
-      be.set_errno(stat);
-      Emsg1(M_ABORT, 0, _("Could not init job queue: ERR=%s\n"), be.strerror());
+      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"));
@@ -74,12 +74,7 @@ void init_job_server(int max_workers)
 
 void term_job_server()
 {
-   int stat;
-   if ((stat=jobq_destroy(&job_queue)) != 0) {
-      berrno be;
-      be.set_errno(stat);
-      Emsg1(M_INFO, 0, _("Could not term job queue: ERR=%s\n"), be.strerror());
-   }
+   jobq_destroy(&job_queue);         /* ignore any errors */
 }
 
 /*
@@ -102,8 +97,7 @@ JobId_t run_job(JCR *jcr)
    /* Initialize termination condition variable */
    if ((errstat = pthread_cond_init(&jcr->term_wait, NULL)) != 0) {
       berrno be;
-      be.set_errno(errstat);
-      Jmsg1(jcr, M_FATAL, 0, _("Unable to init job cond variable: ERR=%s\n"), be.strerror());
+      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;
@@ -114,7 +108,8 @@ JobId_t 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);
@@ -144,8 +139,7 @@ JobId_t run_job(JCR *jcr)
    /* Queue the job to be run */
    if ((stat = jobq_add(&job_queue, jcr)) != 0) {
       berrno be;
-      be.set_errno(stat);
-      Jmsg(jcr, M_FATAL, 0, _("Could not add job queue: ERR=%s\n"), be.strerror());
+      Jmsg(jcr, M_FATAL, 0, _("Could not add job queue: ERR=%s\n"), be.strerror(stat));
       JobId = 0;
       goto bail_out;
    }
@@ -206,8 +200,7 @@ static void *job_thread(void *arg)
            status = close_bpipe(bpipe);
            if (status != 0) {
               berrno be;
-              be.set_errno(status);
-               Jmsg(jcr, M_FATAL, 0, _("RunBeforeJob error: ERR=%s\n"), be.strerror());
+               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;
@@ -238,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;
@@ -266,11 +267,10 @@ static void *job_thread(void *arg)
             */
            if (status != 0) {
               berrno be;
-              be.set_errno(status);
               if (jcr->JobStatus == JS_Terminated) {
-                  Jmsg(jcr, M_WARNING, 0, _("RunAfterJob error: ERR=%s\n"), be.strerror());
+                  Jmsg(jcr, M_WARNING, 0, _("RunAfterJob error: ERR=%s\n"), be.strerror(status));
               } else {
-                  Jmsg(jcr, M_FATAL, 0, _("RunAfterFailedJob error: ERR=%s\n"), be.strerror());
+                  Jmsg(jcr, M_FATAL, 0, _("RunAfterFailedJob error: ERR=%s\n"), be.strerror(status));
               }
            }
         }
@@ -338,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;
@@ -737,11 +740,13 @@ 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);