X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fbackup.c;h=96ed0787282f1c7f1463b957f9e48625a755042b;hb=ec7eb240abd60e667d1a26f89df1b064e1b3786d;hp=4cde534a677ba75c7c8df8f180b95a049eae6623;hpb=4c4c9209f3994fe9de15fe437b7ac71efea46b14;p=bacula%2Fbacula diff --git a/bacula/src/dird/backup.c b/bacula/src/dird/backup.c index 4cde534a67..96ed078728 100644 --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@ -1,29 +1,14 @@ -/* - * - * 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. This program is Free Software; you can redistribute it and/or modify it under the terms of version two of the GNU General Public - License as published by the Free Software Foundation plus additions - that are listed in the file LICENSE. + License as published by the Free Software Foundation and included + in the file LICENSE. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -40,6 +25,21 @@ (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" @@ -200,7 +200,7 @@ bool do_backup(JCR *jcr) } } - bnet_fsend(fd, storaddr, store->address, store->SDDport, tls_need); + fd->fsend(storaddr, store->address, store->SDDport, tls_need); if (!response(jcr, fd, OKstore, "Storage", DISPLAY_ERROR)) { goto bail_out; } @@ -226,13 +226,14 @@ bool do_backup(JCR *jcr) } /* Send backup command */ - bnet_fsend(fd, backupcmd); + fd->fsend(backupcmd); if (!response(jcr, fd, OKbackup, "backup", DISPLAY_ERROR)) { goto bail_out; } /* 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; @@ -243,6 +244,8 @@ 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 */ + cancel_storage_daemon_job(jcr); wait_for_storage_daemon_termination(jcr); Dmsg1(400, "after wait for sd. use=%d\n", jcr->use_count()); return false; @@ -288,9 +291,14 @@ int wait_for_job_termination(JCR *jcr) 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)); + job_type_to_str(jcr->JobType), fd->bstrerror()); + } + fd->signal(BNET_TERMINATE); /* tell Client we are terminating */ + + /* Force cancel in SD if failing */ + if (job_canceled(jcr) || !fd_ok) { + cancel_storage_daemon_job(jcr); } - bnet_sig(fd, BNET_TERMINATE); /* tell Client we are terminating */ /* Note, the SD stores in jcr->JobFiles/ReadBytes/JobBytes/Errors */ wait_for_storage_daemon_termination(jcr); @@ -341,22 +349,20 @@ void backup_cleanup(JCR *jcr, int TermCode) 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)); } @@ -382,7 +388,7 @@ void backup_cleanup(JCR *jcr, int TermCode) term_msg = _("*** Backup Error ***"); msg_type = M_ERROR; /* Generate error message */ if (jcr->store_bsock) { - bnet_sig(jcr->store_bsock, BNET_TERMINATE); + jcr->store_bsock->signal(BNET_TERMINATE); if (jcr->SD_msg_chan) { pthread_cancel(jcr->SD_msg_chan); } @@ -391,7 +397,7 @@ void backup_cleanup(JCR *jcr, int TermCode) case JS_Canceled: term_msg = _("Backup Canceled"); if (jcr->store_bsock) { - bnet_sig(jcr->store_bsock, BNET_TERMINATE); + jcr->store_bsock->signal(BNET_TERMINATE); if (jcr->SD_msg_chan) { pthread_cancel(jcr->SD_msg_chan); } @@ -439,7 +445,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" @@ -459,7 +466,7 @@ void backup_cleanup(JCR *jcr, int TermCode) " Rate: %.1f KB/s\n" " Software Compression: %s\n" " VSS: %s\n" -" Encryption: %s\n" +" Storage Encryption: %s\n" " Volume name(s): %s\n" " Volume Session Id: %d\n" " Volume Session Time: %d\n" @@ -469,9 +476,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, @@ -570,7 +576,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);