From e43d8a7934303997643041147e2481adcdf44995 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Tue, 18 Nov 2008 19:50:45 +0000 Subject: [PATCH] kes Probably fix for bug #1188 where Volume is purged while writing on it. kes Get message enhancement to avoid job name lookup. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@8056 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/patches/2.4.3-getmsg.patch | 135 +++++++++++++++++++++++++++ bacula/patches/2.4.3-purge-bug.patch | 29 ++++++ bacula/src/dird/ua_purge.c | 3 + bacula/technotes-2.5 | 2 + 4 files changed, 169 insertions(+) create mode 100644 bacula/patches/2.4.3-getmsg.patch create mode 100644 bacula/patches/2.4.3-purge-bug.patch diff --git a/bacula/patches/2.4.3-getmsg.patch b/bacula/patches/2.4.3-getmsg.patch new file mode 100644 index 0000000000..926cbcdbb6 --- /dev/null +++ b/bacula/patches/2.4.3-getmsg.patch @@ -0,0 +1,135 @@ + + This patch used the jcr stored in the BSOCK packet during callbacks + to the Director rather than looking them up in the JCR list. + + It can be applied to Bacula version 2.4.3 (or earlier) with: + + cd + patch -p0 <2.4.3-getmsg.patch + ./configure + make + ... + make install + + +Index: src/dird/getmsg.c +=================================================================== +--- src/dird/getmsg.c (revision 7970) ++++ src/dird/getmsg.c (working copy) +@@ -1,7 +1,7 @@ + /* + Bacula® - The Network Backup Solution + +- Copyright (C) 2000-2007 Free Software Foundation Europe e.V. ++ Copyright (C) 2000-2008 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. +@@ -20,7 +20,7 @@ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +- Bacula® is a registered trademark of John Walker. ++ Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +@@ -102,12 +102,12 @@ + char Job[MAX_NAME_LENGTH]; + char MsgType[20]; + int type, level; +- JCR *jcr; ++ JCR *jcr = bs->jcr(); + char *msg; + + for (;;) { + n = bs->recv(); +- Dmsg2(100, "bget_dirmsg %d: %s", n, bs->msg); ++ Dmsg2(300, "bget_dirmsg %d: %s\n", n, bs->msg); + + if (is_bnet_stop(bs)) { + return n; /* error or terminate */ +@@ -142,7 +142,7 @@ + bs->fsend("btime %s\n", edit_uint64(get_current_btime(),ed1)); + break; + default: +- Emsg1(M_WARNING, 0, _("bget_dirmsg: unknown bnet signal %d\n"), bs->msglen); ++ Jmsg1(jcr, M_WARNING, 0, _("bget_dirmsg: unknown bnet signal %d\n"), bs->msglen); + return n; + } + continue; +@@ -160,21 +160,13 @@ + * Try to fulfill it. + */ + if (sscanf(bs->msg, "%020s Job=%127s ", MsgType, Job) != 2) { +- Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg); ++ Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg); + continue; + } +- if (strcmp(Job, "*System*") == 0) { +- jcr = NULL; /* No jcr */ +- } else if (!(jcr=get_jcr_by_full_name(Job))) { +- Emsg1(M_ERROR, 0, _("Job not found: %s\n"), bs->msg); +- continue; +- } +- Dmsg1(900, "Getmsg got jcr 0x%x\n", jcr); + + /* Skip past "Jmsg Job=nnn" */ + if (!(msg=find_msg_start(bs->msg))) { +- Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg); +- free_jcr(jcr); ++ Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg); + continue; + } + +@@ -185,8 +177,7 @@ + if (bs->msg[0] == 'J') { /* Job message */ + if (sscanf(bs->msg, "Jmsg Job=%127s type=%d level=%d", + Job, &type, &level) != 3) { +- Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg); +- free_jcr(jcr); ++ Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg); + continue; + } + Dmsg1(900, "Got msg: %s\n", bs->msg); +@@ -199,7 +190,6 @@ + } + Dmsg1(900, "Dispatch msg: %s", msg); + dispatch_message(jcr, type, level, msg); +- free_jcr(jcr); + continue; + } + /* +@@ -209,21 +199,16 @@ + if (bs->msg[0] == 'C') { /* Catalog request */ + Dmsg2(900, "Catalog req jcr 0x%x: %s", jcr, bs->msg); + catalog_request(jcr, bs); +- Dmsg1(900, "Calling freejcr 0x%x\n", jcr); +- free_jcr(jcr); + continue; + } + if (bs->msg[0] == 'U') { /* SD sending attributes */ + Dmsg2(900, "Catalog upd jcr 0x%x: %s", jcr, bs->msg); + catalog_update(jcr, bs); +- Dmsg1(900, "Calling freejcr 0x%x\n", jcr); +- free_jcr(jcr); + continue; + } + if (bs->msg[0] == 'M') { /* Mount request */ + Dmsg1(900, "Mount req: %s", bs->msg); + mount_request(jcr, bs, msg); +- free_jcr(jcr); + continue; + } + if (bs->msg[0] == 'S') { /* Status change */ +@@ -232,9 +217,8 @@ + if (sscanf(bs->msg, Job_status, &Job, &JobStatus) == 2) { + jcr->SDJobStatus = JobStatus; /* current status */ + } else { +- Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg); ++ Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg); + } +- free_jcr(jcr); + continue; + } + #ifdef needed diff --git a/bacula/patches/2.4.3-purge-bug.patch b/bacula/patches/2.4.3-purge-bug.patch new file mode 100644 index 0000000000..4682962e44 --- /dev/null +++ b/bacula/patches/2.4.3-purge-bug.patch @@ -0,0 +1,29 @@ + + This patch corrects appears to fix bug #1188, where a Volume can + be purged while it is being written. + + Apply it to Bacula 2.4.3 (possibly earlier versions) + with: + + cd + patch -p0 <2.4.3-purge-bug.patch + ./configure + make + ... + make install + + +Index: src/dird/ua_purge.c +=================================================================== +--- src/dird/ua_purge.c (revision 8054) ++++ src/dird/ua_purge.c (working copy) +@@ -463,6 +463,9 @@ + bool purged = false; + char ed1[50]; + ++ if (mr->FirstWritten == 0 || mr->LastWritten == 0) { ++ goto bail_out; /* not written cannot purge */ ++ } + if (strcmp(mr->VolStatus, "Purged") == 0) { + purged = true; + goto bail_out; diff --git a/bacula/src/dird/ua_purge.c b/bacula/src/dird/ua_purge.c index d4b66e0ce9..d34c07baaf 100644 --- a/bacula/src/dird/ua_purge.c +++ b/bacula/src/dird/ua_purge.c @@ -463,6 +463,9 @@ bool is_volume_purged(UAContext *ua, MEDIA_DBR *mr) bool purged = false; char ed1[50]; + if (mr->FirstWritten == 0 || mr->LastWritten == 0) { + goto bail_out; /* not written cannot purge */ + } if (strcmp(mr->VolStatus, "Purged") == 0) { purged = true; goto bail_out; diff --git a/bacula/technotes-2.5 b/bacula/technotes-2.5 index 34cccf50f6..c551f0148b 100644 --- a/bacula/technotes-2.5 +++ b/bacula/technotes-2.5 @@ -11,6 +11,8 @@ mixed priorities General: 18Nov08 +kes kes Probably fix for bug #1188 where Volume is purged while writing + on it. kes Implement bsr block level checking for disk files. However, it does not work correctly in accurate tests, and all the migration and copy tests, so it is turned off. -- 2.39.5