From: Kern Sibbald Date: Tue, 11 Sep 2007 22:14:42 +0000 (+0000) Subject: kes Implement patch supplied by Landon to fix bug #944 where using X-Git-Tag: Release-3.0.0~2544 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=f9a3272bf2263137ff8d018d4cf969f28196b8f7;p=bacula%2Fbacula kes Implement patch supplied by Landon to fix bug #944 where using TLS with bconsole uses 99+% of the CPU. kes Note, you need GTK >= 2.10 to be able to link the Tray Monitor program. kes Move patches into patches directory. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@5528 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/ReleaseNotes b/bacula/ReleaseNotes index f8247782b2..7be316919f 100644 --- a/bacula/ReleaseNotes +++ b/bacula/ReleaseNotes @@ -10,6 +10,22 @@ use some of the new features that affect the FD. In other words, you should not have to upgrade all your File daemons when you upgrade. There is no database upgrade needed from version 2.0.x to 2.2.0. +Version 2.2.3 is a critical bug fix release to version 2.2.2 +- Fix bug #935, and possibly also bug #903 where files were not + restored. MediaId was not properly set in JobMedia record after + a Volume change. This bug is known to affect all versions from + 2.0.0 on, and probably versions prior to that. A detailed analysis + of the bug can be found at: + + http://www.bacula.org/downloads/bug-395.txt + +- Add ./configure search in qwt-qt4 for qwt package +- Apply Martin Simmons patch that should turn off the new API usage + when batch insert is turned off allowing building on older + PostgreSQLs. +- Note, you need GTK >= 2.10 to be able to link the Tray Monitor + program. + Version 2.2.2 is a bug fix release to 2.2.1 - Detect if new PosgreSQL batch insert API is present. - Correct incorrect mempool call causing Director crash. diff --git a/bacula/kernstodo b/bacula/kernstodo index a26fc7f848..8eed47c6b8 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -180,6 +180,7 @@ Projects: For next release: +- Try to fix bscan not working with multiple DVD volumes bug #912. - Look at mondo/mindi - Don't restore Solaris Door files: #define S_IFDOOR in st_mode. diff --git a/bacula/patches/2.0.1-restart.patch b/bacula/patches/2.0.1-restart.patch deleted file mode 100644 index 80353b3539..0000000000 --- a/bacula/patches/2.0.1-restart.patch +++ /dev/null @@ -1,43 +0,0 @@ - - This patch should fix the Job restart on error bug that promotes - an Incremental backup to a Full backup. - - Apply it to version 2.0.1 (perhaps to 2.0.0) with: - - cd - patch -p0 <2.0.1-restart.patch - make - ... - make install - -Index: src/dird/job.c -=================================================================== -RCS file: /cvsroot/bacula/bacula/src/dird/job.c,v -retrieving revision 1.148.2.2 -diff -u -r1.148.2.2 job.c ---- src/dird/job.c 12 Jan 2007 09:58:04 -0000 1.148.2.2 -+++ src/dird/job.c 17 Jan 2007 15:29:25 -0000 -@@ -852,11 +852,6 @@ - free_pool_memory(jcr->fname); - jcr->fname = NULL; - } -- if (jcr->stime) { -- Dmsg0(200, "Free JCR stime\n"); -- free_pool_memory(jcr->stime); -- jcr->stime = NULL; -- } - if (jcr->RestoreBootstrap) { - free(jcr->RestoreBootstrap); - jcr->RestoreBootstrap = NULL; -@@ -889,6 +884,11 @@ - pthread_cond_destroy(&jcr->term_wait); - jcr->term_wait_inited = false; - } -+ if (jcr->stime) { -+ Dmsg0(200, "Free JCR stime\n"); -+ free_pool_memory(jcr->stime); -+ jcr->stime = NULL; -+ } - if (jcr->fname) { - Dmsg0(200, "Free JCR fname\n"); - free_pool_memory(jcr->fname); diff --git a/bacula/patches/2.0.3-ampm.patch b/bacula/patches/2.0.3-ampm.patch deleted file mode 100644 index d811507d43..0000000000 --- a/bacula/patches/2.0.3-ampm.patch +++ /dev/null @@ -1,86 +0,0 @@ -This patch should resolve some problems with handling of am/pm -in schedules as reported by bug #808. - -According to the NIST (US National Institute of Standards and Technology), -12am and 12pm are ambiguous and can be defined to anything. However, -12:01am is the same as 00:01 and 12:01pm is the same as 12:01, so Bacula -defines 12am as 00:00 (midnight) and 12pm as 12:00 (noon). You can avoid -this abiguity (confusion) by using 24 hour time specifications (i.e. no -am/pm). This is the definition in Bacula version 2.0.3 and later. - -Apply it to version 2.0.3 with: - - cd - patch -p0 <2.0.3-ampm.patch - make - ... - make install - -Index: src/dird/run_conf.c -=================================================================== ---- src/dird/run_conf.c (revision 4349) -+++ src/dird/run_conf.c (working copy) -@@ -339,6 +339,7 @@ - for ( ; token != T_EOL; (token = lex_get_token(lc, T_ALL))) { - int len; - bool pm = false; -+ bool am = false; - switch (token) { - case T_NUMBER: - state = s_mday; -@@ -434,6 +435,7 @@ - if (!have_hour) { - clear_bits(0, 23, lrun.hour); - } -+// Dmsg1(000, "s_time=%s\n", lc->str); - p = strchr(lc->str, ':'); - if (!p) { - scan_err0(lc, _("Time logic error.\n")); -@@ -441,20 +443,19 @@ - } - *p++ = 0; /* separate two halves */ - code = atoi(lc->str); /* pick up hour */ -+ code2 = atoi(p); /* pick up minutes */ - len = strlen(p); -- if (len > 2 && p[len-1] == 'm') { -- if (p[len-2] == 'a') { -- pm = false; -- } else if (p[len-2] == 'p') { -- pm = true; -- } else { -- scan_err0(lc, _("Bad time specification.")); -- /* NOT REACHED */ -- } -- } else { -- pm = false; -+ if (len >= 2) { -+ p += 2; - } -- code2 = atoi(p); /* pick up minutes */ -+ if (strcasecmp(p, "pm") == 0) { -+ pm = true; -+ } else if (strcasecmp(p, "am") == 0) { -+ am = true; -+ } else if (len != 2) { -+ scan_err0(lc, _("Bad time specification.")); -+ /* NOT REACHED */ -+ } - /* - * Note, according to NIST, 12am and 12pm are ambiguous and - * can be defined to anything. However, 12:01am is the same -@@ -467,13 +468,14 @@ - code += 12; - } - /* am */ -- } else if (code == 12) { -+ } else if (am && code == 12) { - code -= 12; - } - if (code < 0 || code > 23 || code2 < 0 || code2 > 59) { - scan_err0(lc, _("Bad time specification.")); - /* NOT REACHED */ - } -+// Dmsg2(000, "hour=%d min=%d\n", code, code2); - set_bit(code, lrun.hour); - lrun.minute = code2; - have_hour = true; diff --git a/bacula/patches/2.0.3-maxbyteslist.patch b/bacula/patches/2.0.3-maxbyteslist.patch deleted file mode 100644 index ecb97b22df..0000000000 --- a/bacula/patches/2.0.3-maxbyteslist.patch +++ /dev/null @@ -1,32 +0,0 @@ - - This patch adds the MaxVolBytes to the output of a "show pools" command. - It fixes bug #814. Apply it to Bacula version 2.0.3 with: - - cd - patch -p0 <2.0.3-maxbyteslist.patch - make - ... - make install - - -Index: src/dird/dird_conf.c -=================================================================== ---- src/dird/dird_conf.c (revision 4349) -+++ src/dird/dird_conf.c (working copy) -@@ -844,10 +844,13 @@ - NPRT(res->res_pool.label_format)); - sendit(sock, _(" CleaningPrefix=%s LabelType=%d\n"), - NPRT(res->res_pool.cleaning_prefix), res->res_pool.LabelType); -- sendit(sock, _(" RecyleOldest=%d PurgeOldest=%d MaxVolJobs=%d MaxVolFiles=%d\n"), -+ sendit(sock, _(" RecyleOldest=%d PurgeOldest=%d\n"), - res->res_pool.recycle_oldest_volume, -- res->res_pool.purge_oldest_volume, -- res->res_pool.MaxVolJobs, res->res_pool.MaxVolFiles); -+ res->res_pool.purge_oldest_volume); -+ sendit(sock, _(" MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n"), -+ res->res_pool.MaxVolJobs, -+ res->res_pool.MaxVolFiles, -+ edit_uint64(res->res_pool.MaxVolFiles, ed1)); - sendit(sock, _(" MigTime=%s MigHiBytes=%s MigLoBytes=%s\n"), - edit_utime(res->res_pool.MigrationTime, ed1, sizeof(ed1)), - edit_uint64(res->res_pool.MigrationHighBytes, ed2), diff --git a/bacula/patches/2.0.3-maxwaittime.patch b/bacula/patches/2.0.3-maxwaittime.patch deleted file mode 100644 index 5ed6b29ca7..0000000000 --- a/bacula/patches/2.0.3-maxwaittime.patch +++ /dev/null @@ -1,137 +0,0 @@ - -This patch should fix the logic error in checking for the MaxWaitTime of -a job in src/dird/job.c. It fixes bug #802. - -Apply it to Bacula version 2.0.3 with: - - cd - patch -p0 <2.0.3-maxwaittime.patch - make - ... - make install - - - -Index: src/dird/job.c -=================================================================== ---- src/dird/job.c (revision 4349) -+++ src/dird/job.c (working copy) -@@ -481,7 +481,6 @@ - static bool job_check_maxwaittime(JCR *control_jcr, JCR *jcr) - { - bool cancel = false; -- bool ok_to_cancel = false; - JOB *job = jcr->job; - - if (job_canceled(jcr)) { -@@ -493,69 +492,18 @@ - } - if (jcr->JobLevel == L_FULL && job->FullMaxWaitTime != 0 && - (watchdog_time - jcr->start_time) >= job->FullMaxWaitTime) { -- ok_to_cancel = true; -+ cancel = true; - } else if (jcr->JobLevel == L_DIFFERENTIAL && job->DiffMaxWaitTime != 0 && - (watchdog_time - jcr->start_time) >= job->DiffMaxWaitTime) { -- ok_to_cancel = true; -+ cancel = true; - } else if (jcr->JobLevel == L_INCREMENTAL && job->IncMaxWaitTime != 0 && - (watchdog_time - jcr->start_time) >= job->IncMaxWaitTime) { -- ok_to_cancel = true; -+ cancel = true; - } else if (job->MaxWaitTime != 0 && - (watchdog_time - jcr->start_time) >= job->MaxWaitTime) { -- ok_to_cancel = true; -- } -- if (!ok_to_cancel) { -- return false; -- } -- --/* -- * I don't see the need for all this -- kes 17Dec06 -- */ --#ifdef xxx -- Dmsg3(800, "Job %d (%s): MaxWaitTime of %d seconds exceeded, " -- "checking status\n", -- jcr->JobId, jcr->Job, job->MaxWaitTime); -- switch (jcr->JobStatus) { -- case JS_Created: -- case JS_Blocked: -- case JS_WaitFD: -- case JS_WaitSD: -- case JS_WaitStoreRes: -- case JS_WaitClientRes: -- case JS_WaitJobRes: -- case JS_WaitPriority: -- case JS_WaitMaxJobs: -- case JS_WaitStartTime: - cancel = true; -- Dmsg0(200, "JCR blocked in #1\n"); -- break; -- case JS_Running: -- Dmsg0(800, "JCR running, checking SD status\n"); -- switch (jcr->SDJobStatus) { -- case JS_WaitMount: -- case JS_WaitMedia: -- case JS_WaitFD: -- cancel = true; -- Dmsg0(800, "JCR blocked in #2\n"); -- break; -- default: -- Dmsg0(800, "JCR not blocked in #2\n"); -- break; -- } -- break; -- case JS_Terminated: -- case JS_ErrorTerminated: -- case JS_Canceled: -- case JS_FatalError: -- Dmsg0(800, "JCR already dead in #3\n"); -- break; -- default: -- Jmsg1(jcr, M_ERROR, 0, _("Unhandled job status code %d\n"), -- jcr->JobStatus); - } -- Dmsg3(800, "MaxWaitTime result: %scancel JCR %p (%s)\n", -- cancel ? "" : "do not ", jcr, jcr->Job); --#endif -+ - return cancel; - } - -@@ -574,36 +522,6 @@ - return false; - } - --#ifdef xxx -- switch (jcr->JobStatus) { -- case JS_Created: -- case JS_Running: -- case JS_Blocked: -- case JS_WaitFD: -- case JS_WaitSD: -- case JS_WaitStoreRes: -- case JS_WaitClientRes: -- case JS_WaitJobRes: -- case JS_WaitPriority: -- case JS_WaitMaxJobs: -- case JS_WaitStartTime: -- case JS_Differences: -- cancel = true; -- break; -- case JS_Terminated: -- case JS_ErrorTerminated: -- case JS_Canceled: -- case JS_FatalError: -- cancel = false; -- break; -- default: -- Jmsg1(jcr, M_ERROR, 0, _("Unhandled job status code %d\n"), -- jcr->JobStatus); -- } -- -- Dmsg3(200, "MaxRunTime result: %scancel JCR %p (%s)\n", -- cancel ? "" : "do not ", jcr, jcr->Job); --#endif - return true; - } - diff --git a/bacula/patches/2.0.3-scheduler-next-hour.patch b/bacula/patches/2.0.3-scheduler-next-hour.patch deleted file mode 100644 index 115e86b469..0000000000 --- a/bacula/patches/2.0.3-scheduler-next-hour.patch +++ /dev/null @@ -1,88 +0,0 @@ - - This patch should fix bug #812 where the DST time shift was - incorrectly handled. This patch was submitted by Martin Simmons. - Apply it to Bacula version 2.0.3 with: - - cd - patch -p0 <2.0.3-scheduler-next-hour.patch - make - ... - make install - -Index: src/dird/scheduler.c -=================================================================== ---- src/dird/scheduler.c (revision 4445) -+++ src/dird/scheduler.c (working copy) -@@ -175,11 +175,11 @@ - } - /* Recheck at least once per minute */ - bmicrosleep((next_check_secs < twait)?next_check_secs:twait, 0); -- /* Attempt to handle clock shift from/to daylight savings time -+ /* Attempt to handle clock shift (but not daylight savings time changes) - * we allow a skew of 10 seconds before invalidating everything. - */ - now = time(NULL); -- if (now < prev+10 || now > (prev+next_check_secs+10)) { -+ if (now < prev-10 || now > (prev+next_check_secs+10)) { - schedules_invalidated = true; - } - } -@@ -284,6 +284,9 @@ - wom = mday / 7; - woy = tm_woy(now); /* get week of year */ - -+ Dmsg7(dbglvl, "now = %x: h=%d m=%d md=%d wd=%d wom=%d woy=%d\n", -+ now, hour, month, mday, wday, wom, woy); -+ - /* - * Compute values for next hour from now. - * We do this to be sure we don't miss a job while -@@ -299,6 +302,9 @@ - nh_wom = nh_mday / 7; - nh_woy = tm_woy(now); /* get week of year */ - -+ Dmsg7(dbglvl, "nh = %x: h=%d m=%d md=%d wd=%d wom=%d woy=%d\n", -+ next_hour, nh_hour, nh_month, nh_mday, nh_wday, nh_wom, nh_woy); -+ - /* Loop through all jobs */ - LockRes(); - foreach_res(job, R_JOB) { -@@ -351,24 +357,20 @@ - - Dmsg3(dbglvl, "run@%p: run_now=%d run_nh=%d\n", run, run_now, run_nh); - -- /* find time (time_t) job is to be run */ -- (void)localtime_r(&now, &tm); /* reset tm structure */ -- tm.tm_min = run->minute; /* set run minute */ -- tm.tm_sec = 0; /* zero secs */ -- if (run_now) { -- runtime = mktime(&tm); -- add_job(job, run, now, runtime); -- } -- /* If job is to be run in the next hour schedule it */ -- if (run_nh) { -- /* Set correct values */ -- tm.tm_hour = nh_hour; -- tm.tm_mday = nh_mday + 1; /* fixup because we biased for tests above */ -- tm.tm_mon = nh_month; -- tm.tm_year = nh_year; -- runtime = mktime(&tm); -- add_job(job, run, now, runtime); -- } -+ if (run_now || run_nh) { -+ /* find time (time_t) job is to be run */ -+ (void)localtime_r(&now, &tm); /* reset tm structure */ -+ tm.tm_min = run->minute; /* set run minute */ -+ tm.tm_sec = 0; /* zero secs */ -+ runtime = mktime(&tm); -+ if (run_now) { -+ add_job(job, run, now, runtime); -+ } -+ /* If job is to be run in the next hour schedule it */ -+ if (run_nh) { -+ add_job(job, run, now, runtime + 3600); -+ } -+ } - } - } - UnlockRes(); diff --git a/bacula/patches/2.0.3-tls-disconnect.patch b/bacula/patches/2.0.3-tls-disconnect.patch deleted file mode 100644 index e634cb0d09..0000000000 --- a/bacula/patches/2.0.3-tls-disconnect.patch +++ /dev/null @@ -1,50 +0,0 @@ - -This patch should fix the spurious connection drops that fail jobs -as reported in bug #888. -Apply it to version 2.0.3 (possibly earlier versions of 2.0) with: - - cd - patch -p0 <2.0.3-tls-disconnect.patch - make - ... - make install - -Index: src/lib/tls.c -=================================================================== ---- src/lib/tls.c (revision 4668) -+++ src/lib/tls.c (working copy) -@@ -540,14 +540,6 @@ - * The first time to initiate the shutdown handshake, and the second to - * receive the peer's reply. - * -- * However, it is valid to close the SSL connection after the initial -- * shutdown notification is sent to the peer, without waiting for the -- * peer's reply, as long as you do not plan to re-use that particular -- * SSL connection object. -- * -- * Because we do not re-use SSL connection objects, I do not bother -- * calling SSL_shutdown a second time. -- * - * In addition, if the underlying socket is blocking, SSL_shutdown() - * will not return until the current stage of the shutdown process has - * completed or an error has occured. By setting the socket blocking -@@ -560,6 +552,10 @@ - flags = bnet_set_blocking(bsock); - - err = SSL_shutdown(bsock->tls->openssl); -+ if (err == 0) { -+ /* Finish up the closing */ -+ err = SSL_shutdown(bsock->tls->openssl); -+ } - - switch (SSL_get_error(bsock->tls->openssl, err)) { - case SSL_ERROR_NONE: -@@ -574,8 +570,6 @@ - break; - } - -- /* Restore saved flags */ -- bnet_restore_blocking(bsock, flags); - } - - /* Does all the manual labor for tls_bsock_readn() and tls_bsock_writen() */ diff --git a/bacula/patches/2.0.3-verify.patch b/bacula/patches/2.0.3-verify.patch deleted file mode 100644 index e239584028..0000000000 --- a/bacula/patches/2.0.3-verify.patch +++ /dev/null @@ -1,141 +0,0 @@ -This patch should fix the problem reported in bug #803 where a Verify -job select the JobId to verified at schedule time rather than at runtime. -This makes it difficult or impossible to schedule a verify just after -a backup. - -Apply this patch to Bacula version 2.0.3 (probably 2.0.2 as well) with: - - cd - patch -p0 <2.0.3-verify.patch - make - ... - make install - -Index: src/dird/verify.c -=================================================================== ---- src/dird/verify.c (revision 4353) -+++ src/dird/verify.c (working copy) -@@ -1,22 +1,7 @@ - /* -- * -- * Bacula Director -- verify.c -- responsible for running file verification -- * -- * Kern Sibbald, October MM -- * -- * Basic tasks done here: -- * Open DB -- * Open connection with File daemon and pass him commands -- * to do the verify. -- * When the File daemon sends the attributes, compare them to -- * what is in 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. -@@ -40,6 +25,21 @@ - (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, - Switzerland, email:ftf@fsfeurope.org. - */ -+/* -+ * -+ * Bacula Director -- verify.c -- responsible for running file verification -+ * -+ * Kern Sibbald, October MM -+ * -+ * Basic tasks done here: -+ * Open DB -+ * Open connection with File daemon and pass him commands -+ * to do the verify. -+ * When the File daemon sends the attributes, compare them to -+ * what is in the DB. -+ * -+ * Version $Id$ -+ */ - - - #include "bacula.h" -@@ -66,6 +66,22 @@ - */ - bool do_verify_init(JCR *jcr) - { -+ return true; -+} -+ -+ -+/* -+ * Do a verification of the specified files against the Catlaog -+ * -+ * Returns: false on failure -+ * true on success -+ */ -+bool do_verify(JCR *jcr) -+{ -+ const char *level; -+ BSOCK *fd; -+ int stat; -+ char ed1[100]; - JOB_DBR jr; - JobId_t verify_jobid = 0; - const char *Name; -@@ -74,12 +90,16 @@ - - memset(&jcr->previous_jr, 0, sizeof(jcr->previous_jr)); - -- Dmsg1(9, "bdird: created client %s record\n", jcr->client->hdr.name); -- - /* -- * 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 -+ * Find JobId of last job that ran. Note, we do this when -+ * the job actually starts running, not at schedule time, -+ * so that we find the last job that terminated before -+ * this job runs rather than before it is scheduled. This -+ * permits scheduling a Backup and Verify at the same time, -+ * but with the Verify at a lower priority. -+ * -+ * 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 || -@@ -89,7 +109,7 @@ - if (jcr->verify_job && - (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG || - jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG)) { -- Name = jcr->verify_job->hdr.name; -+ Name = jcr->verify_job->name(); - } else { - Name = NULL; - } -@@ -149,23 +169,7 @@ - jcr->fileset = jcr->verify_job->fileset; - } - Dmsg2(100, "ClientId=%u JobLevel=%c\n", jcr->previous_jr.ClientId, jcr->JobLevel); -- return true; --} - -- --/* -- * Do a verification of the specified files against the Catlaog -- * -- * Returns: false on failure -- * true on success -- */ --bool do_verify(JCR *jcr) --{ -- const char *level; -- BSOCK *fd; -- int stat; -- char ed1[100]; -- - if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { - Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); - return false; diff --git a/bacula/patches/2.0.x/2.0.1-restart.patch b/bacula/patches/2.0.x/2.0.1-restart.patch new file mode 100644 index 0000000000..80353b3539 --- /dev/null +++ b/bacula/patches/2.0.x/2.0.1-restart.patch @@ -0,0 +1,43 @@ + + This patch should fix the Job restart on error bug that promotes + an Incremental backup to a Full backup. + + Apply it to version 2.0.1 (perhaps to 2.0.0) with: + + cd + patch -p0 <2.0.1-restart.patch + make + ... + make install + +Index: src/dird/job.c +=================================================================== +RCS file: /cvsroot/bacula/bacula/src/dird/job.c,v +retrieving revision 1.148.2.2 +diff -u -r1.148.2.2 job.c +--- src/dird/job.c 12 Jan 2007 09:58:04 -0000 1.148.2.2 ++++ src/dird/job.c 17 Jan 2007 15:29:25 -0000 +@@ -852,11 +852,6 @@ + free_pool_memory(jcr->fname); + jcr->fname = NULL; + } +- if (jcr->stime) { +- Dmsg0(200, "Free JCR stime\n"); +- free_pool_memory(jcr->stime); +- jcr->stime = NULL; +- } + if (jcr->RestoreBootstrap) { + free(jcr->RestoreBootstrap); + jcr->RestoreBootstrap = NULL; +@@ -889,6 +884,11 @@ + pthread_cond_destroy(&jcr->term_wait); + jcr->term_wait_inited = false; + } ++ if (jcr->stime) { ++ Dmsg0(200, "Free JCR stime\n"); ++ free_pool_memory(jcr->stime); ++ jcr->stime = NULL; ++ } + if (jcr->fname) { + Dmsg0(200, "Free JCR fname\n"); + free_pool_memory(jcr->fname); diff --git a/bacula/patches/2.0.x/2.0.3-ampm.patch b/bacula/patches/2.0.x/2.0.3-ampm.patch new file mode 100644 index 0000000000..d811507d43 --- /dev/null +++ b/bacula/patches/2.0.x/2.0.3-ampm.patch @@ -0,0 +1,86 @@ +This patch should resolve some problems with handling of am/pm +in schedules as reported by bug #808. + +According to the NIST (US National Institute of Standards and Technology), +12am and 12pm are ambiguous and can be defined to anything. However, +12:01am is the same as 00:01 and 12:01pm is the same as 12:01, so Bacula +defines 12am as 00:00 (midnight) and 12pm as 12:00 (noon). You can avoid +this abiguity (confusion) by using 24 hour time specifications (i.e. no +am/pm). This is the definition in Bacula version 2.0.3 and later. + +Apply it to version 2.0.3 with: + + cd + patch -p0 <2.0.3-ampm.patch + make + ... + make install + +Index: src/dird/run_conf.c +=================================================================== +--- src/dird/run_conf.c (revision 4349) ++++ src/dird/run_conf.c (working copy) +@@ -339,6 +339,7 @@ + for ( ; token != T_EOL; (token = lex_get_token(lc, T_ALL))) { + int len; + bool pm = false; ++ bool am = false; + switch (token) { + case T_NUMBER: + state = s_mday; +@@ -434,6 +435,7 @@ + if (!have_hour) { + clear_bits(0, 23, lrun.hour); + } ++// Dmsg1(000, "s_time=%s\n", lc->str); + p = strchr(lc->str, ':'); + if (!p) { + scan_err0(lc, _("Time logic error.\n")); +@@ -441,20 +443,19 @@ + } + *p++ = 0; /* separate two halves */ + code = atoi(lc->str); /* pick up hour */ ++ code2 = atoi(p); /* pick up minutes */ + len = strlen(p); +- if (len > 2 && p[len-1] == 'm') { +- if (p[len-2] == 'a') { +- pm = false; +- } else if (p[len-2] == 'p') { +- pm = true; +- } else { +- scan_err0(lc, _("Bad time specification.")); +- /* NOT REACHED */ +- } +- } else { +- pm = false; ++ if (len >= 2) { ++ p += 2; + } +- code2 = atoi(p); /* pick up minutes */ ++ if (strcasecmp(p, "pm") == 0) { ++ pm = true; ++ } else if (strcasecmp(p, "am") == 0) { ++ am = true; ++ } else if (len != 2) { ++ scan_err0(lc, _("Bad time specification.")); ++ /* NOT REACHED */ ++ } + /* + * Note, according to NIST, 12am and 12pm are ambiguous and + * can be defined to anything. However, 12:01am is the same +@@ -467,13 +468,14 @@ + code += 12; + } + /* am */ +- } else if (code == 12) { ++ } else if (am && code == 12) { + code -= 12; + } + if (code < 0 || code > 23 || code2 < 0 || code2 > 59) { + scan_err0(lc, _("Bad time specification.")); + /* NOT REACHED */ + } ++// Dmsg2(000, "hour=%d min=%d\n", code, code2); + set_bit(code, lrun.hour); + lrun.minute = code2; + have_hour = true; diff --git a/bacula/patches/2.0.x/2.0.3-maxbyteslist.patch b/bacula/patches/2.0.x/2.0.3-maxbyteslist.patch new file mode 100644 index 0000000000..ecb97b22df --- /dev/null +++ b/bacula/patches/2.0.x/2.0.3-maxbyteslist.patch @@ -0,0 +1,32 @@ + + This patch adds the MaxVolBytes to the output of a "show pools" command. + It fixes bug #814. Apply it to Bacula version 2.0.3 with: + + cd + patch -p0 <2.0.3-maxbyteslist.patch + make + ... + make install + + +Index: src/dird/dird_conf.c +=================================================================== +--- src/dird/dird_conf.c (revision 4349) ++++ src/dird/dird_conf.c (working copy) +@@ -844,10 +844,13 @@ + NPRT(res->res_pool.label_format)); + sendit(sock, _(" CleaningPrefix=%s LabelType=%d\n"), + NPRT(res->res_pool.cleaning_prefix), res->res_pool.LabelType); +- sendit(sock, _(" RecyleOldest=%d PurgeOldest=%d MaxVolJobs=%d MaxVolFiles=%d\n"), ++ sendit(sock, _(" RecyleOldest=%d PurgeOldest=%d\n"), + res->res_pool.recycle_oldest_volume, +- res->res_pool.purge_oldest_volume, +- res->res_pool.MaxVolJobs, res->res_pool.MaxVolFiles); ++ res->res_pool.purge_oldest_volume); ++ sendit(sock, _(" MaxVolJobs=%d MaxVolFiles=%d MaxVolBytes=%s\n"), ++ res->res_pool.MaxVolJobs, ++ res->res_pool.MaxVolFiles, ++ edit_uint64(res->res_pool.MaxVolFiles, ed1)); + sendit(sock, _(" MigTime=%s MigHiBytes=%s MigLoBytes=%s\n"), + edit_utime(res->res_pool.MigrationTime, ed1, sizeof(ed1)), + edit_uint64(res->res_pool.MigrationHighBytes, ed2), diff --git a/bacula/patches/2.0.x/2.0.3-maxwaittime.patch b/bacula/patches/2.0.x/2.0.3-maxwaittime.patch new file mode 100644 index 0000000000..5ed6b29ca7 --- /dev/null +++ b/bacula/patches/2.0.x/2.0.3-maxwaittime.patch @@ -0,0 +1,137 @@ + +This patch should fix the logic error in checking for the MaxWaitTime of +a job in src/dird/job.c. It fixes bug #802. + +Apply it to Bacula version 2.0.3 with: + + cd + patch -p0 <2.0.3-maxwaittime.patch + make + ... + make install + + + +Index: src/dird/job.c +=================================================================== +--- src/dird/job.c (revision 4349) ++++ src/dird/job.c (working copy) +@@ -481,7 +481,6 @@ + static bool job_check_maxwaittime(JCR *control_jcr, JCR *jcr) + { + bool cancel = false; +- bool ok_to_cancel = false; + JOB *job = jcr->job; + + if (job_canceled(jcr)) { +@@ -493,69 +492,18 @@ + } + if (jcr->JobLevel == L_FULL && job->FullMaxWaitTime != 0 && + (watchdog_time - jcr->start_time) >= job->FullMaxWaitTime) { +- ok_to_cancel = true; ++ cancel = true; + } else if (jcr->JobLevel == L_DIFFERENTIAL && job->DiffMaxWaitTime != 0 && + (watchdog_time - jcr->start_time) >= job->DiffMaxWaitTime) { +- ok_to_cancel = true; ++ cancel = true; + } else if (jcr->JobLevel == L_INCREMENTAL && job->IncMaxWaitTime != 0 && + (watchdog_time - jcr->start_time) >= job->IncMaxWaitTime) { +- ok_to_cancel = true; ++ cancel = true; + } else if (job->MaxWaitTime != 0 && + (watchdog_time - jcr->start_time) >= job->MaxWaitTime) { +- ok_to_cancel = true; +- } +- if (!ok_to_cancel) { +- return false; +- } +- +-/* +- * I don't see the need for all this -- kes 17Dec06 +- */ +-#ifdef xxx +- Dmsg3(800, "Job %d (%s): MaxWaitTime of %d seconds exceeded, " +- "checking status\n", +- jcr->JobId, jcr->Job, job->MaxWaitTime); +- switch (jcr->JobStatus) { +- case JS_Created: +- case JS_Blocked: +- case JS_WaitFD: +- case JS_WaitSD: +- case JS_WaitStoreRes: +- case JS_WaitClientRes: +- case JS_WaitJobRes: +- case JS_WaitPriority: +- case JS_WaitMaxJobs: +- case JS_WaitStartTime: + cancel = true; +- Dmsg0(200, "JCR blocked in #1\n"); +- break; +- case JS_Running: +- Dmsg0(800, "JCR running, checking SD status\n"); +- switch (jcr->SDJobStatus) { +- case JS_WaitMount: +- case JS_WaitMedia: +- case JS_WaitFD: +- cancel = true; +- Dmsg0(800, "JCR blocked in #2\n"); +- break; +- default: +- Dmsg0(800, "JCR not blocked in #2\n"); +- break; +- } +- break; +- case JS_Terminated: +- case JS_ErrorTerminated: +- case JS_Canceled: +- case JS_FatalError: +- Dmsg0(800, "JCR already dead in #3\n"); +- break; +- default: +- Jmsg1(jcr, M_ERROR, 0, _("Unhandled job status code %d\n"), +- jcr->JobStatus); + } +- Dmsg3(800, "MaxWaitTime result: %scancel JCR %p (%s)\n", +- cancel ? "" : "do not ", jcr, jcr->Job); +-#endif ++ + return cancel; + } + +@@ -574,36 +522,6 @@ + return false; + } + +-#ifdef xxx +- switch (jcr->JobStatus) { +- case JS_Created: +- case JS_Running: +- case JS_Blocked: +- case JS_WaitFD: +- case JS_WaitSD: +- case JS_WaitStoreRes: +- case JS_WaitClientRes: +- case JS_WaitJobRes: +- case JS_WaitPriority: +- case JS_WaitMaxJobs: +- case JS_WaitStartTime: +- case JS_Differences: +- cancel = true; +- break; +- case JS_Terminated: +- case JS_ErrorTerminated: +- case JS_Canceled: +- case JS_FatalError: +- cancel = false; +- break; +- default: +- Jmsg1(jcr, M_ERROR, 0, _("Unhandled job status code %d\n"), +- jcr->JobStatus); +- } +- +- Dmsg3(200, "MaxRunTime result: %scancel JCR %p (%s)\n", +- cancel ? "" : "do not ", jcr, jcr->Job); +-#endif + return true; + } + diff --git a/bacula/patches/2.0.x/2.0.3-scheduler-next-hour.patch b/bacula/patches/2.0.x/2.0.3-scheduler-next-hour.patch new file mode 100644 index 0000000000..115e86b469 --- /dev/null +++ b/bacula/patches/2.0.x/2.0.3-scheduler-next-hour.patch @@ -0,0 +1,88 @@ + + This patch should fix bug #812 where the DST time shift was + incorrectly handled. This patch was submitted by Martin Simmons. + Apply it to Bacula version 2.0.3 with: + + cd + patch -p0 <2.0.3-scheduler-next-hour.patch + make + ... + make install + +Index: src/dird/scheduler.c +=================================================================== +--- src/dird/scheduler.c (revision 4445) ++++ src/dird/scheduler.c (working copy) +@@ -175,11 +175,11 @@ + } + /* Recheck at least once per minute */ + bmicrosleep((next_check_secs < twait)?next_check_secs:twait, 0); +- /* Attempt to handle clock shift from/to daylight savings time ++ /* Attempt to handle clock shift (but not daylight savings time changes) + * we allow a skew of 10 seconds before invalidating everything. + */ + now = time(NULL); +- if (now < prev+10 || now > (prev+next_check_secs+10)) { ++ if (now < prev-10 || now > (prev+next_check_secs+10)) { + schedules_invalidated = true; + } + } +@@ -284,6 +284,9 @@ + wom = mday / 7; + woy = tm_woy(now); /* get week of year */ + ++ Dmsg7(dbglvl, "now = %x: h=%d m=%d md=%d wd=%d wom=%d woy=%d\n", ++ now, hour, month, mday, wday, wom, woy); ++ + /* + * Compute values for next hour from now. + * We do this to be sure we don't miss a job while +@@ -299,6 +302,9 @@ + nh_wom = nh_mday / 7; + nh_woy = tm_woy(now); /* get week of year */ + ++ Dmsg7(dbglvl, "nh = %x: h=%d m=%d md=%d wd=%d wom=%d woy=%d\n", ++ next_hour, nh_hour, nh_month, nh_mday, nh_wday, nh_wom, nh_woy); ++ + /* Loop through all jobs */ + LockRes(); + foreach_res(job, R_JOB) { +@@ -351,24 +357,20 @@ + + Dmsg3(dbglvl, "run@%p: run_now=%d run_nh=%d\n", run, run_now, run_nh); + +- /* find time (time_t) job is to be run */ +- (void)localtime_r(&now, &tm); /* reset tm structure */ +- tm.tm_min = run->minute; /* set run minute */ +- tm.tm_sec = 0; /* zero secs */ +- if (run_now) { +- runtime = mktime(&tm); +- add_job(job, run, now, runtime); +- } +- /* If job is to be run in the next hour schedule it */ +- if (run_nh) { +- /* Set correct values */ +- tm.tm_hour = nh_hour; +- tm.tm_mday = nh_mday + 1; /* fixup because we biased for tests above */ +- tm.tm_mon = nh_month; +- tm.tm_year = nh_year; +- runtime = mktime(&tm); +- add_job(job, run, now, runtime); +- } ++ if (run_now || run_nh) { ++ /* find time (time_t) job is to be run */ ++ (void)localtime_r(&now, &tm); /* reset tm structure */ ++ tm.tm_min = run->minute; /* set run minute */ ++ tm.tm_sec = 0; /* zero secs */ ++ runtime = mktime(&tm); ++ if (run_now) { ++ add_job(job, run, now, runtime); ++ } ++ /* If job is to be run in the next hour schedule it */ ++ if (run_nh) { ++ add_job(job, run, now, runtime + 3600); ++ } ++ } + } + } + UnlockRes(); diff --git a/bacula/patches/2.0.x/2.0.3-tls-disconnect.patch b/bacula/patches/2.0.x/2.0.3-tls-disconnect.patch new file mode 100644 index 0000000000..e634cb0d09 --- /dev/null +++ b/bacula/patches/2.0.x/2.0.3-tls-disconnect.patch @@ -0,0 +1,50 @@ + +This patch should fix the spurious connection drops that fail jobs +as reported in bug #888. +Apply it to version 2.0.3 (possibly earlier versions of 2.0) with: + + cd + patch -p0 <2.0.3-tls-disconnect.patch + make + ... + make install + +Index: src/lib/tls.c +=================================================================== +--- src/lib/tls.c (revision 4668) ++++ src/lib/tls.c (working copy) +@@ -540,14 +540,6 @@ + * The first time to initiate the shutdown handshake, and the second to + * receive the peer's reply. + * +- * However, it is valid to close the SSL connection after the initial +- * shutdown notification is sent to the peer, without waiting for the +- * peer's reply, as long as you do not plan to re-use that particular +- * SSL connection object. +- * +- * Because we do not re-use SSL connection objects, I do not bother +- * calling SSL_shutdown a second time. +- * + * In addition, if the underlying socket is blocking, SSL_shutdown() + * will not return until the current stage of the shutdown process has + * completed or an error has occured. By setting the socket blocking +@@ -560,6 +552,10 @@ + flags = bnet_set_blocking(bsock); + + err = SSL_shutdown(bsock->tls->openssl); ++ if (err == 0) { ++ /* Finish up the closing */ ++ err = SSL_shutdown(bsock->tls->openssl); ++ } + + switch (SSL_get_error(bsock->tls->openssl, err)) { + case SSL_ERROR_NONE: +@@ -574,8 +570,6 @@ + break; + } + +- /* Restore saved flags */ +- bnet_restore_blocking(bsock, flags); + } + + /* Does all the manual labor for tls_bsock_readn() and tls_bsock_writen() */ diff --git a/bacula/patches/2.0.x/2.0.3-verify.patch b/bacula/patches/2.0.x/2.0.3-verify.patch new file mode 100644 index 0000000000..e239584028 --- /dev/null +++ b/bacula/patches/2.0.x/2.0.3-verify.patch @@ -0,0 +1,141 @@ +This patch should fix the problem reported in bug #803 where a Verify +job select the JobId to verified at schedule time rather than at runtime. +This makes it difficult or impossible to schedule a verify just after +a backup. + +Apply this patch to Bacula version 2.0.3 (probably 2.0.2 as well) with: + + cd + patch -p0 <2.0.3-verify.patch + make + ... + make install + +Index: src/dird/verify.c +=================================================================== +--- src/dird/verify.c (revision 4353) ++++ src/dird/verify.c (working copy) +@@ -1,22 +1,7 @@ + /* +- * +- * Bacula Director -- verify.c -- responsible for running file verification +- * +- * Kern Sibbald, October MM +- * +- * Basic tasks done here: +- * Open DB +- * Open connection with File daemon and pass him commands +- * to do the verify. +- * When the File daemon sends the attributes, compare them to +- * what is in 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. +@@ -40,6 +25,21 @@ + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. + */ ++/* ++ * ++ * Bacula Director -- verify.c -- responsible for running file verification ++ * ++ * Kern Sibbald, October MM ++ * ++ * Basic tasks done here: ++ * Open DB ++ * Open connection with File daemon and pass him commands ++ * to do the verify. ++ * When the File daemon sends the attributes, compare them to ++ * what is in the DB. ++ * ++ * Version $Id$ ++ */ + + + #include "bacula.h" +@@ -66,6 +66,22 @@ + */ + bool do_verify_init(JCR *jcr) + { ++ return true; ++} ++ ++ ++/* ++ * Do a verification of the specified files against the Catlaog ++ * ++ * Returns: false on failure ++ * true on success ++ */ ++bool do_verify(JCR *jcr) ++{ ++ const char *level; ++ BSOCK *fd; ++ int stat; ++ char ed1[100]; + JOB_DBR jr; + JobId_t verify_jobid = 0; + const char *Name; +@@ -74,12 +90,16 @@ + + memset(&jcr->previous_jr, 0, sizeof(jcr->previous_jr)); + +- Dmsg1(9, "bdird: created client %s record\n", jcr->client->hdr.name); +- + /* +- * 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 ++ * Find JobId of last job that ran. Note, we do this when ++ * the job actually starts running, not at schedule time, ++ * so that we find the last job that terminated before ++ * this job runs rather than before it is scheduled. This ++ * permits scheduling a Backup and Verify at the same time, ++ * but with the Verify at a lower priority. ++ * ++ * 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 || +@@ -89,7 +109,7 @@ + if (jcr->verify_job && + (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG || + jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG)) { +- Name = jcr->verify_job->hdr.name; ++ Name = jcr->verify_job->name(); + } else { + Name = NULL; + } +@@ -149,23 +169,7 @@ + jcr->fileset = jcr->verify_job->fileset; + } + Dmsg2(100, "ClientId=%u JobLevel=%c\n", jcr->previous_jr.ClientId, jcr->JobLevel); +- return true; +-} + +- +-/* +- * Do a verification of the specified files against the Catlaog +- * +- * Returns: false on failure +- * true on success +- */ +-bool do_verify(JCR *jcr) +-{ +- const char *level; +- BSOCK *fd; +- int stat; +- char ed1[100]; +- + if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { + Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); + return false; diff --git a/bacula/patches/2.2.0-restore.patch b/bacula/patches/2.2.0-restore.patch new file mode 100644 index 0000000000..4cccf12c8c --- /dev/null +++ b/bacula/patches/2.2.0-restore.patch @@ -0,0 +1,322 @@ +Index: fd_cmds.c +=================================================================== +--- fd_cmds.c (.../tags/Release-2.2.0/bacula/src/stored) (revision 5508) ++++ fd_cmds.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -1,18 +1,4 @@ + /* +- * This file handles commands from the File daemon. +- * +- * Kern Sibbald, MM +- * +- * We get here because the Director has initiated a Job with +- * the Storage daemon, then done the same with the File daemon, +- * then when the Storage daemon receives a proper connection from +- * the File daemon, control is passed here to handle the +- * subsequent File daemon commands. +- * +- * Version $Id$ +- * +- */ +-/* + Bacula® - The Network Backup Solution + + Copyright (C) 2000-2007 Free Software Foundation Europe e.V. +@@ -39,6 +25,20 @@ + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. + */ ++/* ++ * This file handles commands from the File daemon. ++ * ++ * Kern Sibbald, MM ++ * ++ * We get here because the Director has initiated a Job with ++ * the Storage daemon, then done the same with the File daemon, ++ * then when the Storage daemon receives a proper connection from ++ * the File daemon, control is passed here to handle the ++ * subsequent File daemon commands. ++ * ++ * Version $Id$ ++ * ++ */ + + #include "bacula.h" + #include "stored.h" +@@ -120,7 +120,7 @@ + + dir->set_jcr(jcr); + Dmsg1(120, "Start run Job=%s\n", jcr->Job); +- bnet_fsend(dir, Job_start, jcr->Job); ++ dir->fsend(Job_start, jcr->Job); + jcr->start_time = time(NULL); + jcr->run_time = jcr->start_time; + set_jcr_job_status(jcr, JS_Running); +@@ -130,9 +130,9 @@ + dequeue_messages(jcr); /* send any queued messages */ + set_jcr_job_status(jcr, JS_Terminated); + generate_daemon_event(jcr, "JobEnd"); +- bnet_fsend(dir, Job_end, jcr->Job, jcr->JobStatus, jcr->JobFiles, ++ dir->fsend(Job_end, jcr->Job, jcr->JobStatus, jcr->JobFiles, + edit_uint64(jcr->JobBytes, ec1)); +- bnet_sig(dir, BNET_EOD); /* send EOD to Director daemon */ ++ dir->signal(BNET_EOD); /* send EOD to Director daemon */ + return; + } + +@@ -150,7 +150,7 @@ + int stat; + + /* Read command coming from the File daemon */ +- stat = bnet_recv(fd); ++ stat = fd->recv(); + if (is_bnet_stop(fd)) { /* hardeof or error */ + break; /* connection terminated */ + } +@@ -171,11 +171,11 @@ + } + if (!found) { /* command not found */ + Dmsg1(110, "msg); +- bnet_fsend(fd, ferrmsg); ++ fd->fsend(ferrmsg); + break; + } + } +- bnet_sig(fd, BNET_TERMINATE); /* signal to FD job is done */ ++ fd->signal(BNET_TERMINATE); /* signal to FD job is done */ + } + + /* +@@ -195,10 +195,10 @@ + return true; + } else { + bnet_suppress_error_messages(fd, 1); /* ignore errors at this point */ +- bnet_fsend(fd, ERROR_append); ++ fd->fsend(ERROR_append); + } + } else { +- bnet_fsend(fd, NOT_opened); ++ fd->fsend(NOT_opened); + } + return false; + } +@@ -209,11 +209,11 @@ + + Dmsg1(120, "storemsg); + if (!jcr->session_opened) { +- bnet_fsend(fd, NOT_opened); ++ fd->fsend(NOT_opened); + return false; + } + set_jcr_job_status(jcr, JS_Terminated); +- return bnet_fsend(fd, OK_end); ++ return fd->fsend(OK_end); + } + + +@@ -227,14 +227,14 @@ + + Dmsg1(120, "Append open session: %s", fd->msg); + if (jcr->session_opened) { +- bnet_fsend(fd, NO_open); ++ fd->fsend(NO_open); + return false; + } + + jcr->session_opened = true; + + /* Send "Ticket" to File Daemon */ +- bnet_fsend(fd, OK_open, jcr->VolSessionId); ++ fd->fsend(OK_open, jcr->VolSessionId); + Dmsg1(110, ">filed: %s", fd->msg); + + return true; +@@ -251,14 +251,14 @@ + + Dmsg1(120, "msg); + if (!jcr->session_opened) { +- bnet_fsend(fd, NOT_opened); ++ fd->fsend(NOT_opened); + return false; + } + /* Send final statistics to File daemon */ +- bnet_fsend(fd, OK_close, jcr->JobStatus); ++ fd->fsend(OK_close, jcr->JobStatus); + Dmsg1(120, ">filed: %s", fd->msg); + +- bnet_sig(fd, BNET_EOD); /* send EOD to File daemon */ ++ fd->signal(BNET_EOD); /* send EOD to File daemon */ + + jcr->session_opened = false; + return true; +@@ -279,7 +279,7 @@ + Dmsg1(120, "msg); + return do_read_data(jcr); + } else { +- bnet_fsend(fd, NOT_opened); ++ fd->fsend(NOT_opened); + return false; + } + } +@@ -296,7 +296,7 @@ + + Dmsg1(120, "%s\n", fd->msg); + if (jcr->session_opened) { +- bnet_fsend(fd, NO_open); ++ fd->fsend(NO_open); + return false; + } + +@@ -304,7 +304,7 @@ + &jcr->read_VolSessionTime, &jcr->read_StartFile, &jcr->read_EndFile, + &jcr->read_StartBlock, &jcr->read_EndBlock) == 7) { + if (jcr->session_opened) { +- bnet_fsend(fd, NOT_opened); ++ fd->fsend(NOT_opened); + return false; + } + Dmsg4(100, "read_open_session got: JobId=%d Vol=%s VolSessId=%ld VolSessT=%ld\n", +@@ -319,7 +319,7 @@ + jcr->JobType = JT_RESTORE; + + /* Send "Ticket" to File Daemon */ +- bnet_fsend(fd, OK_open, jcr->VolSessionId); ++ fd->fsend(OK_open, jcr->VolSessionId); + Dmsg1(110, ">filed: %s", fd->msg); + + return true; +@@ -357,7 +357,7 @@ + goto bail_out; + } + Dmsg0(10, "=== Bootstrap file ===\n"); +- while (bnet_recv(sock) >= 0) { ++ while (sock->recv() >= 0) { + Dmsg1(10, "%s", sock->msg); + fputs(sock->msg, bs); + } +@@ -378,10 +378,10 @@ + free_pool_memory(jcr->RestoreBootstrap); + jcr->RestoreBootstrap = NULL; + if (!ok) { +- bnet_fsend(sock, ERROR_bootstrap); ++ sock->fsend(ERROR_bootstrap); + return false; + } +- return bnet_fsend(sock, OK_bootstrap); ++ return sock->fsend(OK_bootstrap); + } + + +@@ -395,14 +395,14 @@ + + Dmsg1(120, "Read close session: %s\n", fd->msg); + if (!jcr->session_opened) { +- bnet_fsend(fd, NOT_opened); ++ fd->fsend(NOT_opened); + return false; + } +- /* Send final statistics to File daemon */ +- bnet_fsend(fd, OK_close); ++ /* Send final close msg to File daemon */ ++ fd->fsend(OK_close, jcr->JobStatus); + Dmsg1(160, ">filed: %s\n", fd->msg); + +- bnet_sig(fd, BNET_EOD); /* send EOD to File daemon */ ++ fd->signal(BNET_EOD); /* send EOD to File daemon */ + + jcr->session_opened = false; + return true; +Index: stored_conf.c +=================================================================== +--- stored_conf.c (.../tags/Release-2.2.0/bacula/src/stored) (revision 5508) ++++ stored_conf.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -75,7 +75,7 @@ + {"piddirectory", store_dir, ITEM(res_store.pid_directory), 0, ITEM_REQUIRED, 0}, + {"subsysdirectory", store_dir, ITEM(res_store.subsys_directory), 0, 0, 0}, + {"scriptsdirectory", store_dir, ITEM(res_store.scripts_directory), 0, 0, 0}, +- {"maximumconcurrentjobs", store_pint, ITEM(res_store.max_concurrent_jobs), 0, ITEM_DEFAULT, 10}, ++ {"maximumconcurrentjobs", store_pint, ITEM(res_store.max_concurrent_jobs), 0, ITEM_DEFAULT, 20}, + {"heartbeatinterval", store_time, ITEM(res_store.heartbeat_interval), 0, ITEM_DEFAULT, 0}, + {"tlsenable", store_bit, ITEM(res_store.tls_enable), 1, 0, 0}, + {"tlsrequire", store_bit, ITEM(res_store.tls_require), 1, 0, 0}, +Index: bscan.c +=================================================================== +--- bscan.c (.../tags/Release-2.2.0/bacula/src/stored) (revision 5508) ++++ bscan.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -120,7 +120,7 @@ + " -m update media info in database\n" + " -n specify the database name (default bacula)\n" + " -u specify database user name (default bacula)\n" +-" -P specify database password (default none)\n" + " -h specify database host (default NULL)\n" + " -p proceed inspite of I/O errors\n" + " -r list records\n" +@@ -326,6 +326,7 @@ + mdcr->StartFile = dcr->StartFile; + mdcr->EndBlock = dcr->EndBlock; + mdcr->EndFile = dcr->EndFile; ++ mdcr->VolMediaId = dcr->VolMediaId; + mjcr->read_dcr->VolLastIndex = dcr->VolLastIndex; + if (!create_jobmedia_record(db, mjcr)) { + Pmsg2(000, _("Could not create JobMedia record for Volume=%s Job=%s\n"), +@@ -476,6 +477,7 @@ + dcr->VolFirstIndex = dcr->FileIndex = 0; + dcr->StartBlock = dcr->EndBlock = 0; + dcr->StartFile = dcr->EndFile = 0; ++ dcr->VolMediaId = 0; + } + + Pmsg1(000, _("VOL_LABEL: OK for Volume: %s\n"), mr.VolumeName); +@@ -1177,6 +1179,7 @@ + + dcr->EndBlock = dev->EndBlock; + dcr->EndFile = dev->EndFile; ++ dcr->VolMediaId = dev->VolCatInfo.VolMediaId; + + memset(&jmr, 0, sizeof(jmr)); + jmr.JobId = mjcr->JobId; +Index: askdir.c +=================================================================== +--- askdir.c (.../tags/Release-2.2.0/bacula/src/stored) (revision 5508) ++++ askdir.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -398,7 +398,7 @@ + dcr->StartFile, dcr->EndFile, + dcr->StartBlock, dcr->EndBlock, + dcr->Copy, dcr->Stripe, +- edit_uint64(dcr->dev->VolCatInfo.VolMediaId, ed1)); ++ edit_uint64(dcr->VolMediaId, ed1)); + Dmsg1(100, ">dird: %s", dir->msg); + if (bnet_recv(dir) <= 0) { + Dmsg0(190, "create_jobmedia error bnet_recv\n"); +Index: dev.h +=================================================================== +--- dev.h (.../tags/Release-2.2.0/bacula/src/stored) (revision 5508) ++++ dev.h (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -447,6 +447,7 @@ + uint32_t StartFile; /* Start write file */ + uint32_t StartBlock; /* Start write block */ + uint32_t EndBlock; /* Ending block written */ ++ int64_t VolMediaId; /* MediaId */ + int64_t job_spool_size; /* Current job spool size */ + int64_t max_job_spool_size; /* Max job spool size */ + char VolumeName[MAX_NAME_LENGTH]; /* Volume name */ +Index: block.c +=================================================================== +--- block.c (.../tags/Release-2.2.0/bacula/src/stored) (revision 5508) ++++ block.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -611,6 +611,7 @@ + dev->block_num = dcr->EndBlock; + dev->file = dcr->EndFile; + } ++ dcr->VolMediaId = dev->VolCatInfo.VolMediaId; + if (dcr->VolFirstIndex == 0 && block->FirstIndex > 0) { + dcr->VolFirstIndex = block->FirstIndex; + } +@@ -1098,6 +1099,7 @@ + dev->block_num = dcr->EndBlock; + dev->file = dcr->EndFile; + } ++ dcr->VolMediaId = dev->VolCatInfo.VolMediaId; + dev->file_addr += block->read_len; + dev->file_size += block->read_len; + diff --git a/bacula/patches/2.2.1-restore.patch b/bacula/patches/2.2.1-restore.patch new file mode 100644 index 0000000000..255058475c --- /dev/null +++ b/bacula/patches/2.2.1-restore.patch @@ -0,0 +1,117 @@ +Index: fd_cmds.c +=================================================================== +--- fd_cmds.c (.../tags/Release-2.2.1/bacula/src/stored) (revision 5508) ++++ fd_cmds.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -1,18 +1,4 @@ + /* +- * This file handles commands from the File daemon. +- * +- * Kern Sibbald, MM +- * +- * We get here because the Director has initiated a Job with +- * the Storage daemon, then done the same with the File daemon, +- * then when the Storage daemon receives a proper connection from +- * the File daemon, control is passed here to handle the +- * subsequent File daemon commands. +- * +- * Version $Id$ +- * +- */ +-/* + Bacula® - The Network Backup Solution + + Copyright (C) 2000-2007 Free Software Foundation Europe e.V. +@@ -39,6 +25,20 @@ + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. + */ ++/* ++ * This file handles commands from the File daemon. ++ * ++ * Kern Sibbald, MM ++ * ++ * We get here because the Director has initiated a Job with ++ * the Storage daemon, then done the same with the File daemon, ++ * then when the Storage daemon receives a proper connection from ++ * the File daemon, control is passed here to handle the ++ * subsequent File daemon commands. ++ * ++ * Version $Id$ ++ * ++ */ + + #include "bacula.h" + #include "stored.h" +Index: bscan.c +=================================================================== +--- bscan.c (.../tags/Release-2.2.1/bacula/src/stored) (revision 5508) ++++ bscan.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -326,6 +326,7 @@ + mdcr->StartFile = dcr->StartFile; + mdcr->EndBlock = dcr->EndBlock; + mdcr->EndFile = dcr->EndFile; ++ mdcr->VolMediaId = dcr->VolMediaId; + mjcr->read_dcr->VolLastIndex = dcr->VolLastIndex; + if (!create_jobmedia_record(db, mjcr)) { + Pmsg2(000, _("Could not create JobMedia record for Volume=%s Job=%s\n"), +@@ -476,6 +477,7 @@ + dcr->VolFirstIndex = dcr->FileIndex = 0; + dcr->StartBlock = dcr->EndBlock = 0; + dcr->StartFile = dcr->EndFile = 0; ++ dcr->VolMediaId = 0; + } + + Pmsg1(000, _("VOL_LABEL: OK for Volume: %s\n"), mr.VolumeName); +@@ -1177,6 +1179,7 @@ + + dcr->EndBlock = dev->EndBlock; + dcr->EndFile = dev->EndFile; ++ dcr->VolMediaId = dev->VolCatInfo.VolMediaId; + + memset(&jmr, 0, sizeof(jmr)); + jmr.JobId = mjcr->JobId; +Index: askdir.c +=================================================================== +--- askdir.c (.../tags/Release-2.2.1/bacula/src/stored) (revision 5508) ++++ askdir.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -398,7 +398,7 @@ + dcr->StartFile, dcr->EndFile, + dcr->StartBlock, dcr->EndBlock, + dcr->Copy, dcr->Stripe, +- edit_uint64(dcr->dev->VolCatInfo.VolMediaId, ed1)); ++ edit_uint64(dcr->VolMediaId, ed1)); + Dmsg1(100, ">dird: %s", dir->msg); + if (bnet_recv(dir) <= 0) { + Dmsg0(190, "create_jobmedia error bnet_recv\n"); +Index: dev.h +=================================================================== +--- dev.h (.../tags/Release-2.2.1/bacula/src/stored) (revision 5508) ++++ dev.h (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -447,6 +447,7 @@ + uint32_t StartFile; /* Start write file */ + uint32_t StartBlock; /* Start write block */ + uint32_t EndBlock; /* Ending block written */ ++ int64_t VolMediaId; /* MediaId */ + int64_t job_spool_size; /* Current job spool size */ + int64_t max_job_spool_size; /* Max job spool size */ + char VolumeName[MAX_NAME_LENGTH]; /* Volume name */ +Index: block.c +=================================================================== +--- block.c (.../tags/Release-2.2.1/bacula/src/stored) (revision 5508) ++++ block.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -611,6 +611,7 @@ + dev->block_num = dcr->EndBlock; + dev->file = dcr->EndFile; + } ++ dcr->VolMediaId = dev->VolCatInfo.VolMediaId; + if (dcr->VolFirstIndex == 0 && block->FirstIndex > 0) { + dcr->VolFirstIndex = block->FirstIndex; + } +@@ -1098,6 +1099,7 @@ + dev->block_num = dcr->EndBlock; + dev->file = dcr->EndFile; + } ++ dcr->VolMediaId = dev->VolCatInfo.VolMediaId; + dev->file_addr += block->read_len; + dev->file_size += block->read_len; + diff --git a/bacula/patches/2.2.2-restore.patch b/bacula/patches/2.2.2-restore.patch new file mode 100644 index 0000000000..c061e4cf3c --- /dev/null +++ b/bacula/patches/2.2.2-restore.patch @@ -0,0 +1,117 @@ +Index: fd_cmds.c +=================================================================== +--- fd_cmds.c (.../tags/Release-2.2.2/bacula/src/stored) (revision 5508) ++++ fd_cmds.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -1,18 +1,4 @@ + /* +- * This file handles commands from the File daemon. +- * +- * Kern Sibbald, MM +- * +- * We get here because the Director has initiated a Job with +- * the Storage daemon, then done the same with the File daemon, +- * then when the Storage daemon receives a proper connection from +- * the File daemon, control is passed here to handle the +- * subsequent File daemon commands. +- * +- * Version $Id$ +- * +- */ +-/* + Bacula® - The Network Backup Solution + + Copyright (C) 2000-2007 Free Software Foundation Europe e.V. +@@ -39,6 +25,20 @@ + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. + */ ++/* ++ * This file handles commands from the File daemon. ++ * ++ * Kern Sibbald, MM ++ * ++ * We get here because the Director has initiated a Job with ++ * the Storage daemon, then done the same with the File daemon, ++ * then when the Storage daemon receives a proper connection from ++ * the File daemon, control is passed here to handle the ++ * subsequent File daemon commands. ++ * ++ * Version $Id$ ++ * ++ */ + + #include "bacula.h" + #include "stored.h" +Index: bscan.c +=================================================================== +--- bscan.c (.../tags/Release-2.2.2/bacula/src/stored) (revision 5508) ++++ bscan.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -326,6 +326,7 @@ + mdcr->StartFile = dcr->StartFile; + mdcr->EndBlock = dcr->EndBlock; + mdcr->EndFile = dcr->EndFile; ++ mdcr->VolMediaId = dcr->VolMediaId; + mjcr->read_dcr->VolLastIndex = dcr->VolLastIndex; + if (!create_jobmedia_record(db, mjcr)) { + Pmsg2(000, _("Could not create JobMedia record for Volume=%s Job=%s\n"), +@@ -476,6 +477,7 @@ + dcr->VolFirstIndex = dcr->FileIndex = 0; + dcr->StartBlock = dcr->EndBlock = 0; + dcr->StartFile = dcr->EndFile = 0; ++ dcr->VolMediaId = 0; + } + + Pmsg1(000, _("VOL_LABEL: OK for Volume: %s\n"), mr.VolumeName); +@@ -1177,6 +1179,7 @@ + + dcr->EndBlock = dev->EndBlock; + dcr->EndFile = dev->EndFile; ++ dcr->VolMediaId = dev->VolCatInfo.VolMediaId; + + memset(&jmr, 0, sizeof(jmr)); + jmr.JobId = mjcr->JobId; +Index: askdir.c +=================================================================== +--- askdir.c (.../tags/Release-2.2.2/bacula/src/stored) (revision 5508) ++++ askdir.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -398,7 +398,7 @@ + dcr->StartFile, dcr->EndFile, + dcr->StartBlock, dcr->EndBlock, + dcr->Copy, dcr->Stripe, +- edit_uint64(dcr->dev->VolCatInfo.VolMediaId, ed1)); ++ edit_uint64(dcr->VolMediaId, ed1)); + Dmsg1(100, ">dird: %s", dir->msg); + if (bnet_recv(dir) <= 0) { + Dmsg0(190, "create_jobmedia error bnet_recv\n"); +Index: dev.h +=================================================================== +--- dev.h (.../tags/Release-2.2.2/bacula/src/stored) (revision 5508) ++++ dev.h (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -447,6 +447,7 @@ + uint32_t StartFile; /* Start write file */ + uint32_t StartBlock; /* Start write block */ + uint32_t EndBlock; /* Ending block written */ ++ int64_t VolMediaId; /* MediaId */ + int64_t job_spool_size; /* Current job spool size */ + int64_t max_job_spool_size; /* Max job spool size */ + char VolumeName[MAX_NAME_LENGTH]; /* Volume name */ +Index: block.c +=================================================================== +--- block.c (.../tags/Release-2.2.2/bacula/src/stored) (revision 5508) ++++ block.c (.../branches/Branch-2.2/bacula/src/stored) (revision 5508) +@@ -611,6 +611,7 @@ + dev->block_num = dcr->EndBlock; + dev->file = dcr->EndFile; + } ++ dcr->VolMediaId = dev->VolCatInfo.VolMediaId; + if (dcr->VolFirstIndex == 0 && block->FirstIndex > 0) { + dcr->VolFirstIndex = block->FirstIndex; + } +@@ -1098,6 +1099,7 @@ + dev->block_num = dcr->EndBlock; + dev->file = dcr->EndFile; + } ++ dcr->VolMediaId = dev->VolCatInfo.VolMediaId; + dev->file_addr += block->read_len; + dev->file_size += block->read_len; + diff --git a/bacula/patches/2.2.3-tls.patch b/bacula/patches/2.2.3-tls.patch new file mode 100644 index 0000000000..c65132e48a --- /dev/null +++ b/bacula/patches/2.2.3-tls.patch @@ -0,0 +1,43 @@ + + This patch was supplied by Landon Fuller and corrects a bug that + caused high CPU usage when connecting from bconsole to the Director. + This fixes bug #944. + + Apply this patch to version 2.2.3 (it should work with any 2.2.x + version with: + + cd + patch -p0 <2.2.3-tls.patch + ./configure (your options) + make + ... + make install + +Index: src/lib/tls.c +=================================================================== +--- src/lib/tls.c (revision 5507) ++++ src/lib/tls.c (working copy) +@@ -622,13 +622,21 @@ + break; + + case SSL_ERROR_WANT_READ: ++ /* If we timeout on a select, this will be unset */ ++ FD_SET((unsigned)bsock->m_fd, &fdset); ++ tv.tv_sec = 10; ++ tv.tv_usec = 0; ++ /* Block until we can read */ ++ select(fdmax, &fdset, NULL, NULL, &tv); ++ break; ++ + case SSL_ERROR_WANT_WRITE: + /* If we timeout on a select, this will be unset */ + FD_SET((unsigned)bsock->m_fd, &fdset); + tv.tv_sec = 10; + tv.tv_usec = 0; +- /* Block until we can read or write */ +- select(fdmax, NULL, &fdset, &fdset, &tv); ++ /* Block until we can write */ ++ select(fdmax, NULL, &fdset, NULL, &tv); + break; + + case SSL_ERROR_ZERO_RETURN: diff --git a/bacula/technotes-2.3 b/bacula/technotes-2.3 index b96674ebe1..1390c5c1eb 100644 --- a/bacula/technotes-2.3 +++ b/bacula/technotes-2.3 @@ -1,6 +1,12 @@ Technical notes on version 2.3 General: +12Sep07 +kes Implement patch supplied by Landon to fix bug #944 where using + TLS with bconsole uses 99+% of the CPU. +kes Note, you need GTK >= 2.10 to be able to link the Tray Monitor + program. +kes Move patches into patches directory. 11Sep07 ebl Fix bug #946 about "bacula-dir -t" witch doesn't works as expected.