]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/backup.c
Turn off debug
[bacula/bacula] / bacula / src / dird / backup.c
index e1a0442a805c2019a303cbcd5c6652dc682d8d6a..8e4335287f43e4f12372e127f07d5874f0f4a0b7 100644 (file)
@@ -1,22 +1,7 @@
-/*
- *
- *   Bacula Director -- backup.c -- responsible for doing backup jobs
- *
- *     Kern Sibbald, March MM
- *
- *  Basic tasks done here:
- *     Open DB and create records for this job.
- *     Open Message Channel with Storage daemon to tell him a job will be starting.
- *     Open connection with File daemon and pass him commands
- *       to do the backup.
- *     When the File daemon finishes the job, update the DB.
- *
- *   Version $Id$
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ *
+ *   Bacula Director -- backup.c -- responsible for doing backup jobs
+ *
+ *     Kern Sibbald, March MM
+ *
+ *  Basic tasks done here:
+ *     Open DB and create records for this job.
+ *     Open Message Channel with Storage daemon to tell him a job will be starting.
+ *     Open connection with File daemon and pass him commands
+ *       to do the backup.
+ *     When the File daemon finishes the job, update the DB.
+ *
+ *   Version $Id$
+ */
 
 #include "bacula.h"
 #include "dird.h"
@@ -53,8 +53,11 @@ static char storaddr[]  = "storage address=%s port=%d ssl=%d\n";
 static char OKbackup[]   = "2000 OK backup\n";
 static char OKstore[]    = "2000 OK storage\n";
 static char EndJob[]     = "2800 End Job TermCode=%d JobFiles=%u "
-                           "ReadBytes=%lld JobBytes=%lld Errors=%u\n";
-
+                           "ReadBytes=%llu JobBytes=%llu Errors=%u "  
+                           "VSS=%d Encrypt=%d\n";
+/* Pre 1.39.29 (04Dec06) EndJob */
+static char OldEndJob[]  = "2800 End Job TermCode=%d JobFiles=%u "
+                           "ReadBytes=%llu JobBytes=%llu Errors=%u\n";
 /* 
  * Called here before the job is run to do the job
  *   specific setup.
@@ -75,7 +78,7 @@ bool do_backup_init(JCR *jcr)
 
    apply_pool_overrides(jcr);
 
-   jcr->jr.PoolId = get_or_create_pool_record(jcr, jcr->pool->hdr.name);
+   jcr->jr.PoolId = get_or_create_pool_record(jcr, jcr->pool->name());
    if (jcr->jr.PoolId == 0) {
       return false;
    }
@@ -230,6 +233,7 @@ bool do_backup(JCR *jcr)
 
    /* Pickup Job termination data */
    stat = wait_for_job_termination(jcr);
+   db_write_batch_file_records(jcr);    /* used by bulk batch file insert */
    if (stat == JS_Terminated) {
       backup_cleanup(jcr, stat);
       return true;
@@ -240,6 +244,10 @@ bool do_backup(JCR *jcr)
 bail_out:
    set_jcr_job_status(jcr, JS_ErrorTerminated);
    Dmsg1(400, "wait for sd. use=%d\n", jcr->use_count());
+   /* Cancel SD */
+   if (jcr->store_bsock) {
+      jcr->store_bsock->fsend("cancel Job=%s\n", jcr->Job);
+   }
    wait_for_storage_daemon_termination(jcr);
    Dmsg1(400, "after wait for sd. use=%d\n", jcr->use_count());
    return false;
@@ -258,13 +266,19 @@ int wait_for_job_termination(JCR *jcr)
    BSOCK *fd = jcr->file_bsock;
    bool fd_ok = false;
    uint32_t JobFiles, Errors;
-   uint64_t ReadBytes, JobBytes;
+   uint64_t ReadBytes = 0;
+   uint64_t JobBytes = 0;
+   int VSS = 0;
+   int Encrypt = 0;
 
    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) == 5) {
+      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);
@@ -276,6 +290,7 @@ int wait_for_job_termination(JCR *jcr)
          break;
       }
    }
+
    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), bnet_strerror(fd));
@@ -292,6 +307,8 @@ int wait_for_job_termination(JCR *jcr)
       jcr->Errors = Errors;
       jcr->ReadBytes = ReadBytes;
       jcr->JobBytes = JobBytes;
+      jcr->VSS = VSS;
+      jcr->Encrypt = Encrypt;
    } else {
       Jmsg(jcr, M_FATAL, 0, _("No Job status returned from FD.\n"));
    }
@@ -322,29 +339,27 @@ void backup_cleanup(JCR *jcr, int TermCode)
    char ec6[30], ec7[30], ec8[30], elapsed[50];
    char term_code[100], fd_term_msg[100], sd_term_msg[100];
    const char *term_msg;
-   int msg_type;
+   int msg_type = M_INFO;
    MEDIA_DBR mr;
    CLIENT_DBR cr;
    double kbps, compression;
    utime_t RunTime;
 
    Dmsg2(100, "Enter backup_cleanup %d %c\n", TermCode, TermCode);
-   dequeue_messages(jcr);             /* display any queued messages */
    memset(&mr, 0, sizeof(mr));
    memset(&cr, 0, sizeof(cr));
-   set_jcr_job_status(jcr, TermCode);
 
-   update_job_end_record(jcr);        /* update database */
+   update_job_end(jcr, TermCode);
 
    if (!db_get_job_record(jcr, jcr->db, &jcr->jr)) {
-      Jmsg(jcr, M_WARNING, 0, _("Error getting job record for stats: %s"),
+      Jmsg(jcr, M_WARNING, 0, _("Error getting Job record for Job report: ERR=%s"),
          db_strerror(jcr->db));
       set_jcr_job_status(jcr, JS_ErrorTerminated);
    }
 
-   bstrncpy(cr.Name, jcr->client->hdr.name, sizeof(cr.Name));
+   bstrncpy(cr.Name, jcr->client->name(), sizeof(cr.Name));
    if (!db_get_client_record(jcr, jcr->db, &cr)) {
-      Jmsg(jcr, M_WARNING, 0, _("Error getting client record for stats: %s"),
+      Jmsg(jcr, M_WARNING, 0, _("Error getting Client record for Job report: ERR=%s"),
          db_strerror(jcr->db));
    }
 
@@ -357,7 +372,6 @@ void backup_cleanup(JCR *jcr, int TermCode)
 
    update_bootstrap_file(jcr);
 
-   msg_type = M_INFO;                 /* by default INFO message */
    switch (jcr->JobStatus) {
       case JS_Terminated:
          if (jcr->Errors || jcr->SDErrors) {
@@ -428,7 +442,8 @@ void backup_cleanup(JCR *jcr, int TermCode)
 
 // bmicrosleep(15, 0);                /* for debugging SIGHUP */
 
-   Jmsg(jcr, msg_type, 0, _("Bacula %s (%s): %s\n"
+   Jmsg(jcr, msg_type, 0, _("Bacula %s %s (%s): %s\n"
+"  Build OS:               %s %s %s\n"
 "  JobId:                  %d\n"
 "  Job:                    %s\n"
 "  Backup Level:           %s%s\n"
@@ -447,6 +462,8 @@ void backup_cleanup(JCR *jcr, int TermCode)
 "  SD Bytes Written:       %s (%sB)\n"
 "  Rate:                   %.1f KB/s\n"
 "  Software Compression:   %s\n"
+"  VSS:                    %s\n"
+"  Encryption:             %s\n"
 "  Volume name(s):         %s\n"
 "  Volume Session Id:      %d\n"
 "  Volume Session Time:    %d\n"
@@ -456,9 +473,8 @@ void backup_cleanup(JCR *jcr, int TermCode)
 "  FD termination status:  %s\n"
 "  SD termination status:  %s\n"
 "  Termination:            %s\n\n"),
-        VERSION,
-        LSMDATE,
-        edt,
+        my_name, VERSION, LSMDATE, edt,
+        HOST_OS, DISTNAME, DISTVER,
         jcr->jr.JobId,
         jcr->jr.Job,
         level_to_str(jcr->JobLevel), jcr->since,
@@ -479,6 +495,8 @@ void backup_cleanup(JCR *jcr, int TermCode)
         edit_uint64_with_suffix(jcr->SDJobBytes, ec6),
         (float)kbps,
         compress,
+        jcr->VSS?"yes":"no",
+        jcr->Encrypt?"yes":"no",
         jcr->VolumeName,
         jcr->VolSessionId,
         jcr->VolSessionTime,
@@ -555,7 +573,7 @@ void update_bootstrap_file(JCR *jcr)
       } else {
          berrno be;
          Jmsg(jcr, M_ERROR, 0, _("Could not open WriteBootstrap file:\n"
-              "%s: ERR=%s\n"), fname, be.strerror());
+              "%s: ERR=%s\n"), fname, be.bstrerror());
          set_jcr_job_status(jcr, JS_ErrorTerminated);
       }
       free_pool_memory(fname);