X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fverify.c;h=54fb9073afd49d0b07acd68f4be7763628cc1ab9;hb=a64e57850ac943b84184f43e712ccf18b498ca30;hp=40faac1e41f1669c9af3e6688d8be073dc42ad7d;hpb=84a05f3bfbde64c606b014d68b45b2d060e2a478;p=bacula%2Fbacula diff --git a/bacula/src/dird/verify.c b/bacula/src/dird/verify.c index 40faac1e41..54fb9073af 100644 --- a/bacula/src/dird/verify.c +++ b/bacula/src/dird/verify.c @@ -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,6 +366,7 @@ 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); @@ -358,11 +392,17 @@ 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) { @@ -373,6 +413,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\ @@ -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, _("birddb, 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;