]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/verify.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / dird / verify.c
index 40faac1e41f1669c9af3e6688d8be073dc42ad7d..5fc210e2b0cb690f4b16e4964d5a69f8161ebb5d 100644 (file)
@@ -64,26 +64,41 @@ static int missing_handler(void *ctx, int num_fields, char **row);
  */
 int do_verify(JCR *jcr) 
 {
-   char *level;
+   char *level, *Name;
    BSOCK   *fd;
-   JOB_DBR jr;
-   JobId_t JobId = 0;
+   JOB_DBR jr, verify_jr;
+   JobId_t verify_jobid = 0;
    int stat;
 
+   memset(&verify_jr, 0, sizeof(verify_jr));
+   if (!jcr->verify_jr) {
+      jcr->verify_jr = &verify_jr;
+   }
    if (!get_or_create_client_record(jcr)) {
       goto bail_out;
    }
 
    Dmsg1(9, "bdird: created client %s record\n", jcr->client->hdr.name);
 
-   /* If we are doing a verify from the catalog,
-    * we must look up the time and date of the
-    * last full verify.
+   /*
+    * Find JobId of last job that ran. E.g. 
+    *  for VERIFY_CATALOG we want the JobId of the last INIT.
+    *  for VERIFY_VOLUME_TO_CATALOG, we want the JobId of the 
+    *      last backup Job.
     */
    if (jcr->JobLevel == L_VERIFY_CATALOG || 
-       jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
+       jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG ||
+       jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG) {
       memcpy(&jr, &jcr->jr, sizeof(jr));
-      if (!db_find_last_jobid(jcr, jcr->db, &jr)) {
+      if (jcr->job->verify_job &&
+         (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG ||
+          jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG)) {
+        Name = jcr->job->verify_job->hdr.name;
+      } else {
+        Name = NULL;
+      }
+      Dmsg1(100, "find last jobid for: %s\n", NPRT(Name));
+      if (!db_find_last_jobid(jcr, jcr->db, Name, &jr)) {
         if (jcr->JobLevel == L_VERIFY_CATALOG) {
            Jmsg(jcr, M_FATAL, 0, _(
                  "Unable to find JobId of previous InitCatalog Job.\n"
@@ -95,8 +110,8 @@ int do_verify(JCR *jcr)
         }   
         goto bail_out;
       }
-      JobId = jr.JobId;
-      Dmsg1(20, "Last full id=%d\n", JobId);
+      verify_jobid = jr.JobId;
+      Dmsg1(100, "Last full jobid=%d\n", verify_jobid);
    } 
 
    jcr->jr.JobId = jcr->JobId;
@@ -111,28 +126,30 @@ int do_verify(JCR *jcr)
       jcr->fname = get_pool_memory(PM_FNAME);
    }
 
-   jcr->jr.JobId = JobId;      /* save target JobId */
-
    /* Print Job Start message */
    Jmsg(jcr, M_INFO, 0, _("Start Verify JobId %d Job=%s\n"),
       jcr->JobId, jcr->Job);
 
+   /*
+    * Now get the job record for the previous backup that interests
+    *  us. We use the verify_jobid that we found above.
+    */
    if (jcr->JobLevel == L_VERIFY_CATALOG || 
-       jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
-      memset(&jr, 0, sizeof(jr));
-      jr.JobId = JobId;
-      if (!db_get_job_record(jcr, jcr->db, &jr)) {
+       jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG ||
+       jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG) {
+      verify_jr.JobId = verify_jobid;
+      if (!db_get_job_record(jcr, jcr->db, &verify_jr)) {
          Jmsg(jcr, M_FATAL, 0, _("Could not get job record for previous Job. ERR=%s"), 
              db_strerror(jcr->db));
         goto bail_out;
       }
-      if (jr.JobStatus != 'T') {
+      if (verify_jr.JobStatus != 'T') {
          Jmsg(jcr, M_FATAL, 0, _("Last Job %d did not terminate normally. JobStatus=%c\n"),
-           JobId, jr.JobStatus);
+           verify_jobid, verify_jr.JobStatus);
         goto bail_out;
       }
       Jmsg(jcr, M_INFO, 0, _("Verifying against JobId=%d Job=%s\n"),
-        JobId, jr.Job); 
+        verify_jr.JobId, verify_jr.Job); 
    }
 
    /* 
@@ -144,12 +161,12 @@ int do_verify(JCR *jcr)
    if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
       RBSR *bsr = new_bsr();
       UAContext *ua;
-      bsr->JobId = jr.JobId;
+      bsr->JobId = verify_jr.JobId;
       ua = new_ua_context(jcr);
       complete_bsr(ua, bsr);
       bsr->fi = new_findex();
       bsr->fi->findex = 1;
-      bsr->fi->findex2 = jr.JobFiles;
+      bsr->fi->findex2 = verify_jr.JobFiles;
       if (!write_bsr_file(ua, bsr)) {
         free_ua_context(ua);
         free_bsr(bsr);
@@ -188,6 +205,12 @@ int do_verify(JCR *jcr)
    } else {
       jcr->sd_auth_key = bstrdup("dummy");    /* dummy Storage daemon key */
    }
+
+   if (jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG && jcr->job->verify_job) {
+      jcr->fileset = jcr->job->verify_job->fileset;
+   }
+   Dmsg2(100, "ClientId=%u JobLevel=%c\n", verify_jr.ClientId, jcr->JobLevel);
+
    /*
     * OK, now connect to the File daemon
     *  and ask him for the files.
@@ -200,6 +223,7 @@ int do_verify(JCR *jcr)
    set_jcr_job_status(jcr, JS_Running);
    fd = jcr->file_bsock;
 
+
    Dmsg0(30, ">filed: Send include list\n");
    if (!send_include_list(jcr)) {
       goto bail_out;
@@ -262,6 +286,9 @@ int do_verify(JCR *jcr)
    case L_VERIFY_DATA:
       level = "data";
       break;
+   case L_VERIFY_DISK_TO_CATALOG:
+      level="disk_to_catalog";
+      break;
    default:
       Jmsg1(jcr, M_FATAL, 0, _("Unimplemented save level %d\n"), jcr->JobLevel);
       goto bail_out;
@@ -290,12 +317,19 @@ int do_verify(JCR *jcr)
       Dmsg0(10, "Verify level=catalog\n");
       jcr->sd_msg_thread_done = true;  /* no SD msg thread, so it is done */
       jcr->SDJobStatus = JS_Terminated;
-      get_attributes_and_compare_to_catalog(jcr, JobId);
+      get_attributes_and_compare_to_catalog(jcr, verify_jobid);
       break;
 
    case L_VERIFY_VOLUME_TO_CATALOG:
       Dmsg0(10, "Verify level=volume\n");
-      get_attributes_and_compare_to_catalog(jcr, JobId);
+      get_attributes_and_compare_to_catalog(jcr, verify_jobid);
+      break;
+
+   case L_VERIFY_DISK_TO_CATALOG:
+      Dmsg0(10, "Verify level=disk_to_catalog\n");
+      jcr->sd_msg_thread_done = true;  /* no SD msg thread, so it is done */
+      jcr->SDJobStatus = JS_Terminated;
+      get_attributes_and_compare_to_catalog(jcr, verify_jobid);
       break;
 
    case L_VERIFY_INIT:
@@ -312,7 +346,6 @@ int do_verify(JCR *jcr)
    }
 
    stat = wait_for_job_termination(jcr);
-
    verify_cleanup(jcr, stat);
    return 1;
 
@@ -333,8 +366,9 @@ static void verify_cleanup(JCR *jcr, int TermCode)
    char *term_msg;
    int msg_type;
    JobId_t JobId;
+   char *Name;
 
-// Dmsg1(000, "Enter verify_cleanup() TermCod=%d\n", TermCode);
+// Dmsg1(100, "Enter verify_cleanup() TermCod=%d\n", TermCode);
 
    JobId = jcr->jr.JobId;
    set_jcr_job_status(jcr, TermCode);
@@ -358,21 +392,29 @@ static void verify_cleanup(JCR *jcr, int TermCode)
       break;
    default:
       term_msg = term_code;
-      sprintf(term_code, _("Inappropriate term code: %c\n"), TermCode);
+      bsnprintf(term_code, sizeof(term_code), 
+                _("Inappropriate term code: %d %c\n"), TermCode, TermCode);
       break;
    }
    bstrftime(sdt, sizeof(sdt), jcr->jr.StartTime);
    bstrftime(edt, sizeof(edt), jcr->jr.EndTime);
+   if (jcr->job->verify_job) {
+      Name = jcr->job->verify_job->hdr.name;
+   } else {
+      Name = "";
+   }
 
    jobstatus_to_ascii(jcr->FDJobStatus, fd_term_msg, sizeof(fd_term_msg));
    if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
-       jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg));
+      jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg));
       Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n\
 JobId:                  %d\n\
 Job:                    %s\n\
 FileSet:                %s\n\
 Verify Level:           %s\n\
 Client:                 %s\n\
+Verify JobId:           %d\n\
+Verify Job:             %s\n\
 Start time:             %s\n\
 End time:               %s\n\
 Files Examined:         %s\n\
@@ -386,6 +428,8 @@ Termination:            %s\n\n"),
         jcr->fileset->hdr.name,
         level_to_str(jcr->JobLevel),
         jcr->client->hdr.name,
+        jcr->verify_jr->JobId,
+        Name,
         sdt,
         edt,
         edit_uint64_with_commas(jcr->JobFiles, ec1),
@@ -400,6 +444,8 @@ Job:                    %s\n\
 FileSet:                %s\n\
 Verify Level:           %s\n\
 Client:                 %s\n\
+Verify JobId:           %d\n\
+Verify Job:             %s\n\
 Start time:             %s\n\
 End time:               %s\n\
 Files Examined:         %s\n\
@@ -412,6 +458,8 @@ Termination:            %s\n\n"),
         jcr->fileset->hdr.name,
         level_to_str(jcr->JobLevel),
         jcr->client->hdr.name,
+        jcr->verify_jr->JobId,
+        Name,
         sdt,
         edt,
         edit_uint64_with_commas(jcr->JobFiles, ec1),
@@ -465,7 +513,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
 
       fname = check_pool_memory_size(fname, fd->msglen);
       jcr->fname = check_pool_memory_size(jcr->fname, fd->msglen);
-      Dmsg1(400, "Atts+SIG=%s\n", fd->msg);
+      Dmsg1(200, "Atts+SIG=%s\n", fd->msg);
       if ((len = sscanf(fd->msg, "%ld %d %100s", &file_index, &stream, 
            fname)) != 3) {
          Jmsg3(jcr, M_FATAL, 0, _("bird<filed: bad attributes, expected 3 fields got %d\n\
@@ -510,7 +558,8 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
          * Find equivalent record in the database 
          */
         fdbr.FileId = 0;
-        if (!db_get_file_attributes_record(jcr, jcr->db, jcr->fname, &fdbr)) {
+        if (!db_get_file_attributes_record(jcr, jcr->db, jcr->fname, 
+             jcr->verify_jr, &fdbr)) {
             Jmsg(jcr, M_INFO, 0, _("New file: %s\n"), jcr->fname);
             Dmsg1(020, _("File not in catalog: %s\n"), jcr->fname);
            stat = JS_Differences;