X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fvbackup.c;h=59c33efb6fd12a01d7e1c1657f9842a6818ab25e;hb=87187e5526cf427d78cbc3763a8d15df70c2ea3b;hp=45a1f7e06522e6bbe41fc02365ca9c16840ea3b2;hpb=a43d2e768028f060bcdb2eb2672b598c36ab47fc;p=bacula%2Fbacula diff --git a/bacula/src/dird/vbackup.c b/bacula/src/dird/vbackup.c index 45a1f7e065..59c33efb6f 100644 --- a/bacula/src/dird/vbackup.c +++ b/bacula/src/dird/vbackup.c @@ -1,12 +1,12 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2008-2009 Free Software Foundation Europe e.V. + Copyright (C) 2008-2011 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. This program is Free Software; you can redistribute it and/or - modify it under the terms of version two of the GNU General Public + modify it under the terms of version three of the GNU Affero General Public License as published by the Free Software Foundation and included in the file LICENSE. @@ -15,7 +15,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -41,7 +41,6 @@ * to do the backup. * When the File daemon finishes the job, update the DB. * - * Version $Id: $ */ #include "bacula.h" @@ -50,7 +49,7 @@ static const int dbglevel = 10; -static bool create_bootstrap_file(JCR *jcr, POOLMEM *jobids); +static bool create_bootstrap_file(JCR *jcr, char *jobids); void vbackup_cleanup(JCR *jcr, int TermCode); /* @@ -135,19 +134,14 @@ bool do_vbackup(JCR *jcr) char ed1[100]; BSOCK *sd; char *p; + db_list_ctx jobids; Dmsg2(100, "rstorage=%p wstorage=%p\n", jcr->rstorage, jcr->wstorage); Dmsg2(100, "Read store=%s, write store=%s\n", ((STORE *)jcr->rstorage->first())->name(), ((STORE *)jcr->wstorage->first())->name()); - /* ***FIXME*** we really should simply verify that the pools are different */ -#ifdef xxx - if (((STORE *)jcr->rstorage->first())->name() == ((STORE *)jcr->wstorage->first())->name()) { - Jmsg(jcr, M_FATAL, 0, _("Read storage \"%s\" same as write storage.\n"), - ((STORE *)jcr->rstorage->first())->name()); - return false; - } -#endif + + jcr->wasVirtualFull = true; /* remember where we came from */ /* Print Job Start message */ Jmsg(jcr, M_INFO, 0, _("Start Virtual Backup JobId %s, Job=%s\n"), @@ -157,28 +151,27 @@ bool do_vbackup(JCR *jcr) _("This Job is not an Accurate backup so is not equivalent to a Full backup.\n")); } - POOLMEM *jobids = get_pool_memory(PM_FNAME); jcr->jr.JobLevel = L_VIRTUAL_FULL; - db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, jobids); - jcr->jr.JobLevel = L_FULL; - Dmsg1(10, "Accurate jobids=%s\n", jobids); - if (*jobids == 0) { - free_pool_memory(jobids); + db_accurate_get_jobids(jcr, jcr->db, &jcr->jr, &jobids); + Dmsg1(10, "Accurate jobids=%s\n", jobids.list); + if (jobids.count == 0) { Jmsg(jcr, M_FATAL, 0, _("No previous Jobs found.\n")); return false; } + jcr->jr.JobLevel = L_FULL; + /* * Now we find the last job that ran and store it's info in * the previous_jr record. We will set our times to the * values from that job so that anything changed after that * time will be picked up on the next backup. */ - p = strrchr(jobids, ','); /* find last jobid */ + p = strrchr(jobids.list, ','); /* find last jobid */ if (p != NULL) { p++; } else { - p = jobids; + p = jobids.list; } memset(&jcr->previous_jr, 0, sizeof(jcr->previous_jr)); jcr->previous_jr.JobId = str_to_int64(p); @@ -189,12 +182,10 @@ _("This Job is not an Accurate backup so is not equivalent to a Full backup.\n") return false; } - if (!create_bootstrap_file(jcr, jobids)) { + if (!create_bootstrap_file(jcr, jobids.list)) { Jmsg(jcr, M_FATAL, 0, _("Could not get or create the FileSet record.\n")); - free_pool_memory(jobids); return false; } - free_pool_memory(jobids); /* * Open a message channel connection with the Storage @@ -203,7 +194,7 @@ _("This Job is not an Accurate backup so is not equivalent to a Full backup.\n") * */ Dmsg0(110, "Open connection with storage daemon\n"); - set_jcr_job_status(jcr, JS_WaitSD); + jcr->setJobStatus(JS_WaitSD); /* * Start conversation with Storage daemon */ @@ -233,7 +224,7 @@ _("This Job is not an Accurate backup so is not equivalent to a Full backup.\n") jcr->start_time = time(NULL); jcr->jr.StartTime = jcr->start_time; jcr->jr.JobTDate = jcr->start_time; - set_jcr_job_status(jcr, JS_Running); + jcr->setJobStatus(JS_Running); /* Update job start record */ if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { @@ -257,12 +248,12 @@ _("This Job is not an Accurate backup so is not equivalent to a Full backup.\n") return false; } - set_jcr_job_status(jcr, JS_Running); + jcr->setJobStatus(JS_Running); /* Pickup Job termination data */ /* Note, the SD stores in jcr->JobFiles/ReadBytes/JobBytes/JobErrors */ wait_for_storage_daemon_termination(jcr); - set_jcr_job_status(jcr, jcr->SDJobStatus); + jcr->setJobStatus(jcr->SDJobStatus); db_write_batch_file_records(jcr); /* used by bulk batch file insert */ if (jcr->JobStatus != JS_Terminated) { return false; @@ -294,7 +285,7 @@ void vbackup_cleanup(JCR *jcr, int TermCode) memset(&mr, 0, sizeof(mr)); memset(&cr, 0, sizeof(cr)); - jcr->set_JobLevel(L_FULL); /* we want this to appear as a Full backup */ + jcr->setJobLevel(L_FULL); /* we want this to appear as a Full backup */ jcr->jr.JobLevel = L_FULL; /* we want this to appear as a Full backup */ jcr->JobFiles = jcr->SDJobFiles; jcr->JobBytes = jcr->SDJobBytes; @@ -312,7 +303,7 @@ void vbackup_cleanup(JCR *jcr, int TermCode) if (!db_get_job_record(jcr, jcr->db, &jcr->jr)) { 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); + jcr->setJobStatus(JS_ErrorTerminated); } bstrncpy(cr.Name, jcr->client->name(), sizeof(cr.Name)); @@ -325,7 +316,7 @@ void vbackup_cleanup(JCR *jcr, int TermCode) if (!db_get_media_record(jcr, jcr->db, &mr)) { Jmsg(jcr, M_WARNING, 0, _("Error getting Media record for Volume \"%s\": ERR=%s"), mr.VolumeName, db_strerror(jcr->db)); - set_jcr_job_status(jcr, JS_ErrorTerminated); + jcr->setJobStatus(JS_ErrorTerminated); } update_bootstrap_file(jcr); @@ -397,7 +388,7 @@ void vbackup_cleanup(JCR *jcr, int TermCode) } jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg)); - Jmsg(jcr, msg_type, 0, _("%s %s %s (%s): %s\n" + Jmsg(jcr, msg_type, 0, _("%s %s %s (%s):\n" " Build OS: %s %s %s\n" " JobId: %d\n" " Job: %s\n" @@ -422,7 +413,7 @@ void vbackup_cleanup(JCR *jcr, int TermCode) " SD Errors: %d\n" " SD termination status: %s\n" " Termination: %s\n\n"), - BACULA, my_name, VERSION, LSMDATE, edt, + BACULA, my_name, VERSION, LSMDATE, HOST_OS, DISTNAME, DISTVER, jcr->jr.JobId, jcr->jr.Job, @@ -476,7 +467,7 @@ int insert_bootstrap_handler(void *ctx, int num_fields, char **row) } -static bool create_bootstrap_file(JCR *jcr, POOLMEM *jobids) +static bool create_bootstrap_file(JCR *jcr, char *jobids) { RESTORE_CTX rx; UAContext *ua; @@ -488,8 +479,16 @@ static bool create_bootstrap_file(JCR *jcr, POOLMEM *jobids) #define new_get_file_list #ifdef new_get_file_list - if (!db_get_file_list(jcr, ua->db, jobids, insert_bootstrap_handler, (void *)rx.bsr)) { - Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(ua->db)); + if (!db_open_batch_connexion(jcr, jcr->db)) { + Jmsg0(jcr, M_FATAL, 0, "Can't get batch sql connexion"); + return false; + } + + if (!db_get_file_list(jcr, jcr->db_batch, jobids, false /* don't use md5 */, + true /* use delta */, + insert_bootstrap_handler, (void *)rx.bsr)) + { + Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db_batch)); } #else char *p;