From b73bbda69cf0f76b13abe9ade84e4a4fabed9a1d Mon Sep 17 00:00:00 2001 From: Eric Bollengier Date: Sat, 29 Dec 2007 17:44:31 +0000 Subject: [PATCH] ebl Fixes #897 and #1005 where bacula doesn't display runscript output in error. Regress scripts are ok. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@6156 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/src/dird/backup.c | 58 +++++++++++++++++++++++----------------- bacula/src/dird/protos.h | 2 +- bacula/src/filed/job.c | 47 +++++++++++--------------------- bacula/src/jcr.h | 1 + bacula/technotes-2.3 | 3 +++ 5 files changed, 53 insertions(+), 58 deletions(-) diff --git a/bacula/src/dird/backup.c b/bacula/src/dird/backup.c index 8c7a3cef46..7f33e80317 100644 --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@ -245,8 +245,7 @@ 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); + wait_for_job_termination(jcr, FDConnectTimeout); Dmsg1(400, "after wait for sd. use=%d\n", jcr->use_count()); return false; } @@ -258,7 +257,7 @@ bail_out: * are done, we return the job status. * Also used by restore.c */ -int wait_for_job_termination(JCR *jcr) +int wait_for_job_termination(JCR *jcr, int timeout) { int32_t n = 0; BSOCK *fd = jcr->file_bsock; @@ -268,32 +267,42 @@ int wait_for_job_termination(JCR *jcr) uint64_t JobBytes = 0; int VSS = 0; int Encrypt = 0; + btimer_t *tid=NULL; 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, &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); - } else { - Jmsg(jcr, M_WARNING, 0, _("Unexpected Client Job message: %s\n"), - fd->msg); + + if (fd) { + if (timeout) { + tid = start_bsock_timer(fd, timeout); /* TODO: use user timeout */ } - if (job_canceled(jcr)) { - break; + /* Wait for Client to terminate */ + while ((n = bget_dirmsg(fd)) >= 0) { + 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); + } else { + Jmsg(jcr, M_WARNING, 0, _("Unexpected Client Job message: %s\n"), + fd->msg); + } + if (job_canceled(jcr)) { + break; + } + } + if (tid) { + stop_bsock_timer(tid); } - } - 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), fd->bstrerror()); + 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), fd->bstrerror()); + } + fd->signal(BNET_TERMINATE); /* tell Client we are terminating */ } - fd->signal(BNET_TERMINATE); /* tell Client we are terminating */ /* Force cancel in SD if failing */ if (job_canceled(jcr) || !fd_ok) { @@ -303,7 +312,6 @@ int wait_for_job_termination(JCR *jcr) /* Note, the SD stores in jcr->JobFiles/ReadBytes/JobBytes/Errors */ wait_for_storage_daemon_termination(jcr); - /* Return values from FD */ if (fd_ok) { jcr->JobFiles = JobFiles; @@ -320,7 +328,7 @@ int wait_for_job_termination(JCR *jcr) // jcr->JobStatus, jcr->SDJobStatus); /* Return the first error status we find Dir, FD, or SD */ - if (!fd_ok || is_bnet_error(fd)) { + if (!fd_ok || is_bnet_error(fd)) { /* if fd not set, that use !fd_ok */ jcr->FDJobStatus = JS_ErrorTerminated; } if (jcr->JobStatus != JS_Terminated) { diff --git a/bacula/src/dird/protos.h b/bacula/src/dird/protos.h index 5eeed6e93b..e7d90728b9 100644 --- a/bacula/src/dird/protos.h +++ b/bacula/src/dird/protos.h @@ -52,7 +52,7 @@ extern int recycle_volume(JCR *jcr, MEDIA_DBR *mr); extern bool find_recycled_volume(JCR *jcr, bool InChanger, MEDIA_DBR *mr); /* backup.c */ -extern int wait_for_job_termination(JCR *jcr); +extern int wait_for_job_termination(JCR *jcr, int timeout=0); extern bool do_backup_init(JCR *jcr); extern bool do_backup(JCR *jcr); extern void backup_cleanup(JCR *jcr, int TermCode); diff --git a/bacula/src/filed/job.c b/bacula/src/filed/job.c index aea73087c1..ae237a62db 100644 --- a/bacula/src/filed/job.c +++ b/bacula/src/filed/job.c @@ -269,6 +269,16 @@ void *handle_client_request(void *dirp) /* Run the after job */ run_scripts(jcr, jcr->RunScripts, "ClientAfterJob"); + if (jcr->JobId) { /* send EndJob if running a job */ + char ed1[50], ed2[50]; + /* Send termination status back to Dir */ + bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles, + edit_uint64(jcr->ReadBytes, ed1), + edit_uint64(jcr->JobBytes, ed2), jcr->Errors, jcr->VSS, + jcr->pki_encrypt); + Dmsg1(110, "End FD msg: %s\n", dir->msg); + } + generate_daemon_event(jcr, "JobEnd"); dequeue_messages(jcr); /* send any queued messages */ @@ -1335,15 +1345,13 @@ static int backup_cmd(JCR *jcr) BSOCK *sd = jcr->store_bsock; int ok = 0; int SDJobStatus; - char ed1[50], ed2[50]; - bool bDoVSS = false; #if defined(WIN32_VSS) // capture state here, if client is backed up by multiple directors // and one enables vss and the other does not then enable_vss can change // between here and where its evaluated after the job completes. - bDoVSS = g_pVSSClient && enable_vss; - if (bDoVSS) { + jcr->VSS = g_pVSSClient && enable_vss; + if (jcr->VSS) { /* Run only one at a time */ P(vss_mutex); } @@ -1399,7 +1407,7 @@ static int backup_cmd(JCR *jcr) #if defined(WIN32_VSS) /* START VSS ON WIN 32 */ - if (bDoVSS) { + if (jcr->VSS) { if (g_pVSSClient->InitializeForBackup()) { /* tell vss which drives to snapshot */ char szWinDriveLetters[27]; @@ -1492,7 +1500,7 @@ cleanup: #if defined(WIN32_VSS) /* STOP VSS ON WIN 32 */ /* tell vss to close the backup session */ - if (bDoVSS) { + if (jcr->VSS) { if (g_pVSSClient->CloseBackup()) { /* inform user about writer states */ for (int i=0; i<(int)g_pVSSClient->GetWriterCount(); i++) { @@ -1508,12 +1516,6 @@ cleanup: } #endif - bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles, - edit_uint64(jcr->ReadBytes, ed1), - edit_uint64(jcr->JobBytes, ed2), jcr->Errors, (int)bDoVSS, - jcr->pki_encrypt); - Dmsg1(110, "End FD msg: %s\n", dir->msg); - return 0; /* return and stop command loop */ } @@ -1525,7 +1527,7 @@ static int verify_cmd(JCR *jcr) { BSOCK *dir = jcr->dir_bsock; BSOCK *sd = jcr->store_bsock; - char level[100], ed1[50], ed2[50]; + char level[100]; jcr->JobType = JT_VERIFY; if (sscanf(dir->msg, verifycmd, level) != 1) { @@ -1589,15 +1591,6 @@ static int verify_cmd(JCR *jcr) bnet_sig(dir, BNET_EOD); - /* Send termination status back to Dir */ - bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles, - edit_uint64(jcr->ReadBytes, ed1), - edit_uint64(jcr->JobBytes, ed2), jcr->Errors, 0, - jcr->pki_encrypt); - Dmsg1(110, "End FD msg: %s\n", dir->msg); - - /* Inform Director that we are done */ - bnet_sig(dir, BNET_TERMINATE); return 0; /* return and terminate command loop */ } @@ -1613,7 +1606,6 @@ static int restore_cmd(JCR *jcr) bool use_regexwhere=false; int prefix_links; char replace; - char ed1[50], ed2[50]; /* * Scan WHERE (base directory for restore) from command @@ -1700,15 +1692,6 @@ bail_out: if (jcr->Errors) { set_jcr_job_status(jcr, JS_ErrorTerminated); } - /* Send termination status back to Dir */ - bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles, - edit_uint64(jcr->ReadBytes, ed1), - edit_uint64(jcr->JobBytes, ed2), jcr->Errors, 0, - jcr->pki_encrypt); - Dmsg1(110, "End FD msg: %s\n", dir->msg); - - /* Inform Director that we are done */ - bnet_sig(dir, BNET_TERMINATE); Dmsg0(130, "Done in job.c\n"); return 0; /* return and terminate command loop */ diff --git a/bacula/src/jcr.h b/bacula/src/jcr.h index 58b92d2ab2..51e7704a5f 100644 --- a/bacula/src/jcr.h +++ b/bacula/src/jcr.h @@ -301,6 +301,7 @@ public: int32_t pki_session_encoded_size; /* Size of DER-encoded pki_session */ POOLMEM *crypto_buf; /* Encryption/Decryption buffer */ DIRRES* director; /* Director resource */ + bool VSS; /* VSS used by FD */ #endif /* FILE_DAEMON */ diff --git a/bacula/technotes-2.3 b/bacula/technotes-2.3 index 06a262d556..abf7fe087d 100644 --- a/bacula/technotes-2.3 +++ b/bacula/technotes-2.3 @@ -1,6 +1,9 @@ Technical notes on version 2.3 General: +29Dec07 +ebl Fixes #897 and #1005 where bacula doesn't display runscript + output in error. 24Dec07 kes Add new free_tls() entry point so that Win32 builds. kes Fix compile warning in src/lib/util.c -- 2.39.5