]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Fixes #897 and #1005 where bacula doesn't display runscript
authorEric Bollengier <eric@eb.homelinux.org>
Sat, 29 Dec 2007 17:44:31 +0000 (17:44 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Sat, 29 Dec 2007 17:44:31 +0000 (17:44 +0000)
     output in error. Regress scripts are ok.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@6156 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/dird/backup.c
bacula/src/dird/protos.h
bacula/src/filed/job.c
bacula/src/jcr.h
bacula/technotes-2.3

index 8c7a3cef46981e498abe855c8042422366fcf203..7f33e8031760a8f81dbe9ad5d36e3c53c25dcfa4 100644 (file)
@@ -245,8 +245,7 @@ bail_out:
    set_jcr_job_status(jcr, JS_ErrorTerminated);
    Dmsg1(400, "wait for sd. use=%d\n", jcr->use_count());
    /* Cancel SD */
-   cancel_storage_daemon_job(jcr);
-   wait_for_storage_daemon_termination(jcr);
+   wait_for_job_termination(jcr, FDConnectTimeout);
    Dmsg1(400, "after wait for sd. use=%d\n", jcr->use_count());
    return false;
 }
@@ -258,7 +257,7 @@ bail_out:
  *   are done, we return the job status.
  * Also used by restore.c
  */
-int wait_for_job_termination(JCR *jcr)
+int wait_for_job_termination(JCR *jcr, int timeout)
 {
    int32_t n = 0;
    BSOCK *fd = jcr->file_bsock;
@@ -268,32 +267,42 @@ int wait_for_job_termination(JCR *jcr)
    uint64_t JobBytes = 0;
    int VSS = 0;
    int Encrypt = 0;
+   btimer_t *tid=NULL;
 
    set_jcr_job_status(jcr, JS_Running);
-   /* Wait for Client to terminate */
-   while ((n = bget_dirmsg(fd)) >= 0) {
-      if (!fd_ok && 
-          (sscanf(fd->msg, EndJob, &jcr->FDJobStatus, &JobFiles,
-              &ReadBytes, &JobBytes, &Errors, &VSS, &Encrypt) == 7 ||
-           sscanf(fd->msg, OldEndJob, &jcr->FDJobStatus, &JobFiles,
-                 &ReadBytes, &JobBytes, &Errors) == 5)) {
-         fd_ok = true;
-         set_jcr_job_status(jcr, jcr->FDJobStatus);
-         Dmsg1(100, "FDStatus=%c\n", (char)jcr->JobStatus);
-      } else {
-         Jmsg(jcr, M_WARNING, 0, _("Unexpected Client Job message: %s\n"),
-            fd->msg);
+
+   if (fd) {
+      if (timeout) {
+         tid = start_bsock_timer(fd, timeout); /* TODO: use user timeout */
       }
-      if (job_canceled(jcr)) {
-         break;
+      /* Wait for Client to terminate */
+      while ((n = bget_dirmsg(fd)) >= 0) {
+         if (!fd_ok && 
+             (sscanf(fd->msg, EndJob, &jcr->FDJobStatus, &JobFiles,
+                     &ReadBytes, &JobBytes, &Errors, &VSS, &Encrypt) == 7 ||
+              sscanf(fd->msg, OldEndJob, &jcr->FDJobStatus, &JobFiles,
+                     &ReadBytes, &JobBytes, &Errors) == 5)) {
+            fd_ok = true;
+            set_jcr_job_status(jcr, jcr->FDJobStatus);
+            Dmsg1(100, "FDStatus=%c\n", (char)jcr->JobStatus);
+         } else {
+            Jmsg(jcr, M_WARNING, 0, _("Unexpected Client Job message: %s\n"),
+                 fd->msg);
+         }
+         if (job_canceled(jcr)) {
+            break;
+         }
+      }
+      if (tid) {
+         stop_bsock_timer(tid);
       }
-   }
 
-   if (is_bnet_error(fd)) {
-      Jmsg(jcr, M_FATAL, 0, _("Network error with FD during %s: ERR=%s\n"),
-          job_type_to_str(jcr->JobType), fd->bstrerror());
+      if (is_bnet_error(fd)) {
+         Jmsg(jcr, M_FATAL, 0, _("Network error with FD during %s: ERR=%s\n"),
+              job_type_to_str(jcr->JobType), fd->bstrerror());
+      }
+      fd->signal(BNET_TERMINATE);   /* tell Client we are terminating */
    }
-   fd->signal(BNET_TERMINATE);   /* tell Client we are terminating */
 
    /* Force cancel in SD if failing */
    if (job_canceled(jcr) || !fd_ok) {
@@ -303,7 +312,6 @@ int wait_for_job_termination(JCR *jcr)
    /* Note, the SD stores in jcr->JobFiles/ReadBytes/JobBytes/Errors */
    wait_for_storage_daemon_termination(jcr);
 
-
    /* Return values from FD */
    if (fd_ok) {
       jcr->JobFiles = JobFiles;
@@ -320,7 +328,7 @@ int wait_for_job_termination(JCR *jcr)
 //   jcr->JobStatus, jcr->SDJobStatus);
 
    /* Return the first error status we find Dir, FD, or SD */
-   if (!fd_ok || is_bnet_error(fd)) {
+   if (!fd_ok || is_bnet_error(fd)) { /* if fd not set, that use !fd_ok */
       jcr->FDJobStatus = JS_ErrorTerminated;
    }
    if (jcr->JobStatus != JS_Terminated) {
index 5eeed6e93b25e057cc569389ada89b2ab67c9f81..e7d90728b90981a96c8a2dcae01a6e86f736090b 100644 (file)
@@ -52,7 +52,7 @@ extern int recycle_volume(JCR *jcr, MEDIA_DBR *mr);
 extern bool find_recycled_volume(JCR *jcr, bool InChanger, MEDIA_DBR *mr);
 
 /* backup.c */
-extern int wait_for_job_termination(JCR *jcr);
+extern int wait_for_job_termination(JCR *jcr, int timeout=0);
 extern bool do_backup_init(JCR *jcr);
 extern bool do_backup(JCR *jcr);
 extern void backup_cleanup(JCR *jcr, int TermCode);
index aea73087c182bb97655fc0e444a37ec247b4580b..ae237a62db81ab2d37e6edfcc6a4852e75d89b93 100644 (file)
@@ -269,6 +269,16 @@ void *handle_client_request(void *dirp)
    /* Run the after job */
    run_scripts(jcr, jcr->RunScripts, "ClientAfterJob");
 
+   if (jcr->JobId) {           /* send EndJob if running a job */
+      char ed1[50], ed2[50];
+      /* Send termination status back to Dir */
+      bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles,
+                edit_uint64(jcr->ReadBytes, ed1),
+                edit_uint64(jcr->JobBytes, ed2), jcr->Errors, jcr->VSS,
+                jcr->pki_encrypt);
+      Dmsg1(110, "End FD msg: %s\n", dir->msg);
+   }
+
    generate_daemon_event(jcr, "JobEnd");
 
    dequeue_messages(jcr);             /* send any queued messages */
@@ -1335,15 +1345,13 @@ static int backup_cmd(JCR *jcr)
    BSOCK *sd = jcr->store_bsock;
    int ok = 0;
    int SDJobStatus;
-   char ed1[50], ed2[50];
-   bool bDoVSS = false;
 
 #if defined(WIN32_VSS)
    // capture state here, if client is backed up by multiple directors
    // and one enables vss and the other does not then enable_vss can change
    // between here and where its evaluated after the job completes.
-   bDoVSS = g_pVSSClient && enable_vss;
-   if (bDoVSS) {
+   jcr->VSS = g_pVSSClient && enable_vss;
+   if (jcr->VSS) {
       /* Run only one at a time */
       P(vss_mutex);
    }
@@ -1399,7 +1407,7 @@ static int backup_cmd(JCR *jcr)
 
 #if defined(WIN32_VSS)
    /* START VSS ON WIN 32 */
-   if (bDoVSS) {      
+   if (jcr->VSS) {      
       if (g_pVSSClient->InitializeForBackup()) {   
         /* tell vss which drives to snapshot */   
         char szWinDriveLetters[27];   
@@ -1492,7 +1500,7 @@ cleanup:
 #if defined(WIN32_VSS)
    /* STOP VSS ON WIN 32 */
    /* tell vss to close the backup session */
-   if (bDoVSS) {
+   if (jcr->VSS) {
       if (g_pVSSClient->CloseBackup()) {             
          /* inform user about writer states */
          for (int i=0; i<(int)g_pVSSClient->GetWriterCount(); i++) {
@@ -1508,12 +1516,6 @@ cleanup:
    }
 #endif
 
-   bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles,
-      edit_uint64(jcr->ReadBytes, ed1),
-      edit_uint64(jcr->JobBytes, ed2), jcr->Errors, (int)bDoVSS, 
-      jcr->pki_encrypt);
-   Dmsg1(110, "End FD msg: %s\n", dir->msg);
-   
    return 0;                          /* return and stop command loop */
 }
 
@@ -1525,7 +1527,7 @@ static int verify_cmd(JCR *jcr)
 {
    BSOCK *dir = jcr->dir_bsock;
    BSOCK *sd  = jcr->store_bsock;
-   char level[100], ed1[50], ed2[50];
+   char level[100];
 
    jcr->JobType = JT_VERIFY;
    if (sscanf(dir->msg, verifycmd, level) != 1) {
@@ -1589,15 +1591,6 @@ static int verify_cmd(JCR *jcr)
 
    bnet_sig(dir, BNET_EOD);
 
-   /* Send termination status back to Dir */
-   bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles,
-      edit_uint64(jcr->ReadBytes, ed1),
-      edit_uint64(jcr->JobBytes, ed2), jcr->Errors, 0,
-      jcr->pki_encrypt);
-   Dmsg1(110, "End FD msg: %s\n", dir->msg);
-
-   /* Inform Director that we are done */
-   bnet_sig(dir, BNET_TERMINATE);
    return 0;                          /* return and terminate command loop */
 }
 
@@ -1613,7 +1606,6 @@ static int restore_cmd(JCR *jcr)
    bool use_regexwhere=false;
    int prefix_links;
    char replace;
-   char ed1[50], ed2[50];
 
    /*
     * Scan WHERE (base directory for restore) from command
@@ -1700,15 +1692,6 @@ bail_out:
    if (jcr->Errors) {
       set_jcr_job_status(jcr, JS_ErrorTerminated);
    }
-   /* Send termination status back to Dir */
-   bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles,
-      edit_uint64(jcr->ReadBytes, ed1),
-      edit_uint64(jcr->JobBytes, ed2), jcr->Errors, 0,
-      jcr->pki_encrypt);
-   Dmsg1(110, "End FD msg: %s\n", dir->msg);
-
-   /* Inform Director that we are done */
-   bnet_sig(dir, BNET_TERMINATE);
 
    Dmsg0(130, "Done in job.c\n");
    return 0;                          /* return and terminate command loop */
index 58b92d2ab2e2ecc9665164bd9cd1dfe4a8caff8c..51e7704a5fb3d31eefe2b40ca338ca237a0076e5 100644 (file)
@@ -301,6 +301,7 @@ public:
    int32_t pki_session_encoded_size;  /* Size of DER-encoded pki_session */
    POOLMEM *crypto_buf;               /* Encryption/Decryption buffer */
    DIRRES* director;                  /* Director resource */
+   bool VSS;                          /* VSS used by FD */
 #endif /* FILE_DAEMON */
 
 
index 06a262d5564144b26b8229d96732825c79ab513e..abf7fe087d86a26340288889fa8160983ae776df 100644 (file)
@@ -1,6 +1,9 @@
               Technical notes on version 2.3
 
 General:
+29Dec07
+ebl  Fixes #897 and #1005 where bacula doesn't display runscript
+     output in error.
 24Dec07
 kes  Add new free_tls() entry point so that Win32 builds.
 kes  Fix compile warning in src/lib/util.c