]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/job.c
kes Fix logic error in handling error return from mtx-changer
[bacula/bacula] / bacula / src / stored / job.c
index 4809fc72861c1bdacacb9a9d77d9cb1771afb8a7..28629c3b51e32b776d1149b206e4c1c112d81244 100644 (file)
@@ -24,6 +24,8 @@
 #include "bacula.h"
 #include "stored.h"
 
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
 /* Imported variables */
 extern uint32_t VolSessionTime;
 
@@ -39,7 +41,7 @@ static char jobcmd[] = "JobId=%d job=%127s job_name=%127s client_name=%127s "
 
 /* Responses sent to Director daemon */
 static char OKjob[]     = "3000 OK Job SDid=%u SDtime=%u Authorization=%s\n";
-static char BAD_job[]   = "3915 Bad Job command: %s\n";
+static char BAD_job[]   = "3915 Bad Job command. stat=%d CMD: %s\n";
 //static char OK_query[]  = "3001 OK query\n";
 //static char NO_query[]  = "3918 Query failed\n";
 //static char BAD_query[] = "3917 Bad query command: %s\n";
@@ -62,22 +64,22 @@ bool job_cmd(JCR *jcr)
    POOL_MEM job_name, client_name, job, fileset_name, fileset_md5;
    int JobType, level, spool_attributes, no_attributes, spool_data;
    int write_part_after_job, PreferMountedVols;
-
+   int stat;
    JCR *ojcr;
 
    /*
     * Get JobId and permissions from Director
     */
    Dmsg1(100, "<dird: %s", dir->msg);
-   if (sscanf(dir->msg, jobcmd, &JobId, job.c_str(), job_name.c_str(),
+   stat = sscanf(dir->msg, jobcmd, &JobId, job.c_str(), job_name.c_str(),
               client_name.c_str(),
               &JobType, &level, fileset_name.c_str(), &no_attributes,
               &spool_attributes, fileset_md5.c_str(), &spool_data, 
-              &write_part_after_job, &PreferMountedVols) != 13) {
+              &write_part_after_job, &PreferMountedVols);
+   if (stat != 13) {
       pm_strcpy(jcr->errmsg, dir->msg);
-      bnet_fsend(dir, BAD_job, jcr->errmsg);
+      bnet_fsend(dir, BAD_job, stat, jcr->errmsg);
       Dmsg1(100, ">dird: %s", dir->msg);
-      Emsg1(M_FATAL, 0, _("Bad Job Command from Director: %s\n"), jcr->errmsg);
       set_jcr_job_status(jcr, JS_ErrorTerminated);
       return false;
    }
@@ -159,14 +161,14 @@ bool run_cmd(JCR *jcr)
     *  when he does, we will be released, unless the 30 minutes
     *  expires.
     */
-   P(jcr->mutex);
+   P(mutex);
    for ( ;!job_canceled(jcr); ) {
-      errstat = pthread_cond_timedwait(&jcr->job_start_wait, &jcr->mutex, &timeout);
+      errstat = pthread_cond_timedwait(&jcr->job_start_wait, &mutex, &timeout);
       if (errstat == 0 || errstat == ETIMEDOUT) {
          break;
       }
    }
-   V(jcr->mutex);
+   V(mutex);
 
    memset(jcr->sd_auth_key, 0, strlen(jcr->sd_auth_key));
 
@@ -215,12 +217,10 @@ void handle_filed_connection(BSOCK *fd, char *job_name)
       Dmsg1(110, "OK Authentication Job %s\n", jcr->Job);
    }
 
-   P(jcr->mutex);
    if (!jcr->authenticated) {
       set_jcr_job_status(jcr, JS_ErrorTerminated);
    }
    pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */
-   V(jcr->mutex);
    free_jcr(jcr);
    return;
 }
@@ -305,6 +305,7 @@ bool query_cmd(JCR *jcr)
  */
 void stored_free_jcr(JCR *jcr)
 {
+   Dmsg1(900, "stored_free_jcr JobId=%u\n", jcr->JobId);
    if (jcr->file_bsock) {
       bnet_close(jcr->file_bsock);
       jcr->file_bsock = NULL;
@@ -347,14 +348,25 @@ void stored_free_jcr(JCR *jcr)
       free_dcr(jcr->read_dcr);
       jcr->read_dcr = NULL;
    }
-   if (jcr->dirstore) {
+
+   if (jcr->read_store) {
       DIRSTORE *store;
-      foreach_alist(store, jcr->dirstore) {
+      foreach_alist(store, jcr->read_store) {
          delete store->device;
          delete store;
       }
-      delete jcr->dirstore;
-      jcr->dirstore = NULL;
+      delete jcr->read_store;
+      jcr->read_store = NULL;
    }
+   if (jcr->write_store) {
+      DIRSTORE *store;
+      foreach_alist(store, jcr->write_store) {
+         delete store->device;
+         delete store;
+      }
+      delete jcr->write_store;
+      jcr->write_store = NULL;
+   }
+
    return;
 }