From 0926b2ec13b15b661f904a046a50de6a7566f09d Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Tue, 23 Dec 2008 15:50:58 +0000 Subject: [PATCH] Fix bug #1208. Inappropriate Volume purging git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/branches/Branch-2.4@8240 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/src/stored/acquire.c | 2 +- bacula/src/stored/askdir.c | 29 +++++++++++++++++++++-------- bacula/src/stored/bcopy.c | 2 +- bacula/src/stored/bextract.c | 2 +- bacula/src/stored/block.c | 6 +++--- bacula/src/stored/bls.c | 2 +- bacula/src/stored/bscan.c | 2 +- bacula/src/stored/btape.c | 2 +- bacula/src/stored/label.c | 4 +++- bacula/src/stored/protos.h | 2 +- bacula/src/stored/spool.c | 2 +- bacula/technotes-2.4 | 2 ++ 12 files changed, 37 insertions(+), 20 deletions(-) diff --git a/bacula/src/stored/acquire.c b/bacula/src/stored/acquire.c index d02010bf83..8357cb8017 100644 --- a/bacula/src/stored/acquire.c +++ b/bacula/src/stored/acquire.c @@ -451,7 +451,7 @@ bool release_device(DCR *dcr) Dmsg2(200, "dir_create_jobmedia. Release vol=%s dev=%s\n", dev->VolCatInfo.VolCatName, dev->print_name()); if (!dev->at_weot() && !dir_create_jobmedia_record(dcr)) { - Jmsg(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), + Jmsg2(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), dcr->VolCatInfo.VolCatName, jcr->Job); } /* If no more writers, and no errors, and wrote something, write an EOF */ diff --git a/bacula/src/stored/askdir.c b/bacula/src/stored/askdir.c index c6b72b1250..e88d0a10e7 100644 --- a/bacula/src/stored/askdir.c +++ b/bacula/src/stored/askdir.c @@ -387,7 +387,7 @@ bail_out: /* * After writing a Volume, create the JobMedia record. */ -bool dir_create_jobmedia_record(DCR *dcr) +bool dir_create_jobmedia_record(DCR *dcr, bool zero) { JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; @@ -398,18 +398,31 @@ bool dir_create_jobmedia_record(DCR *dcr) return true; } + /* Throw out records where FI is zero -- i.e. nothing done */ + if (!zero && dcr->VolFirstIndex == 0 && + (dcr->StartBlock != 0 || dcr->EndBlock != 0)) { + Dmsg0(1000, "JobMedia problem FI=0 StartBlock!=0\n"); + return true; + } + if (!dcr->WroteVol) { return true; /* nothing written to tape */ } dcr->WroteVol = false; - dir->fsend(Create_job_media, jcr->Job, - dcr->VolFirstIndex, dcr->VolLastIndex, - dcr->StartFile, dcr->EndFile, - dcr->StartBlock, dcr->EndBlock, - dcr->Copy, dcr->Stripe, - edit_uint64(dcr->VolMediaId, ed1)); - Dmsg1(100, ">dird %s", dir->msg); + if (zero) { + /* Send dummy place holder to avoid purging */ + dir->fsend(Create_job_media, jcr->Job, + 0 , 0, 0, 0, 0, 0, 0, 0, edit_uint64(dcr->VolMediaId, ed1)); + } else { + dir->fsend(Create_job_media, jcr->Job, + dcr->VolFirstIndex, dcr->VolLastIndex, + dcr->StartFile, dcr->EndFile, + dcr->StartBlock, dcr->EndBlock, + dcr->Copy, dcr->Stripe, + edit_uint64(dcr->VolMediaId, ed1)); + } + Dmsg1(100, ">dird %s", dir->msg); if (dir->recv() <= 0) { Dmsg0(190, "create_jobmedia error bnet_recv\n"); Jmsg(jcr, M_FATAL, 0, _("Error creating JobMedia record: ERR=%s\n"), diff --git a/bacula/src/stored/bcopy.c b/bacula/src/stored/bcopy.c index 836a43415d..3b1aa80f2b 100644 --- a/bacula/src/stored/bcopy.c +++ b/bacula/src/stored/bcopy.c @@ -358,7 +358,7 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess /* Dummies to replace askdir.c */ bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { return 1; } -bool dir_create_jobmedia_record(DCR *dcr) { return 1; } +bool dir_create_jobmedia_record(DCR *dcr, bool zero) { return 1; } bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} diff --git a/bacula/src/stored/bextract.c b/bacula/src/stored/bextract.c index 45fc89110c..5b841190b2 100644 --- a/bacula/src/stored/bextract.c +++ b/bacula/src/stored/bextract.c @@ -482,7 +482,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) /* Dummies to replace askdir.c */ bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { return 1; } -bool dir_create_jobmedia_record(DCR *dcr) { return 1; } +bool dir_create_jobmedia_record(DCR *dcr, bool zero) { return 1; } bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} diff --git a/bacula/src/stored/block.c b/bacula/src/stored/block.c index 5efc332669..7f1a99baab 100644 --- a/bacula/src/stored/block.c +++ b/bacula/src/stored/block.c @@ -365,7 +365,7 @@ bool write_block_to_device(DCR *dcr) /* Create a jobmedia record for this job */ if (!dir_create_jobmedia_record(dcr)) { dev->dev_errno = EIO; - Jmsg(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), + Jmsg2(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), dcr->VolCatInfo.VolCatName, jcr->Job); set_new_volume_parameters(dcr); stat = false; @@ -719,7 +719,7 @@ static bool terminate_writing_volume(DCR *dcr) if (!dir_create_jobmedia_record(dcr)) { Dmsg0(190, "Error from create JobMedia\n"); dev->dev_errno = EIO; - Jmsg(dcr->jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), + Jmsg2(dcr->jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), dcr->VolCatInfo.VolCatName, dcr->jcr->Job); ok = false; goto bail_out; @@ -795,7 +795,7 @@ static bool do_new_file_bookkeeping(DCR *dcr) if (!dir_create_jobmedia_record(dcr)) { Dmsg0(190, "Error from create_job_media.\n"); dev->dev_errno = EIO; - Jmsg(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), + Jmsg2(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), dcr->VolCatInfo.VolCatName, jcr->Job); terminate_writing_volume(dcr); dev->dev_errno = EIO; diff --git a/bacula/src/stored/bls.c b/bacula/src/stored/bls.c index 46a824e060..84501e1da7 100644 --- a/bacula/src/stored/bls.c +++ b/bacula/src/stored/bls.c @@ -446,7 +446,7 @@ static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sess /* Dummies to replace askdir.c */ bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { return 1; } -bool dir_create_jobmedia_record(DCR *dcr) { return 1; } +bool dir_create_jobmedia_record(DCR *dcr, bool zero) { return 1; } bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} diff --git a/bacula/src/stored/bscan.c b/bacula/src/stored/bscan.c index 157287c0b9..b21bfb5e97 100644 --- a/bacula/src/stored/bscan.c +++ b/bacula/src/stored/bscan.c @@ -1286,7 +1286,7 @@ static JCR *create_jcr(JOB_DBR *jr, DEV_RECORD *rec, uint32_t JobId) /* Dummies to replace askdir.c */ bool dir_find_next_appendable_volume(DCR *dcr) { return 1;} bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten) { return 1; } -bool dir_create_jobmedia_record(DCR *dcr) { return 1; } +bool dir_create_jobmedia_record(DCR *dcr, bool zero) { return 1; } bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; } bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;} bool dir_send_job_status(JCR *jcr) {return 1;} diff --git a/bacula/src/stored/btape.c b/bacula/src/stored/btape.c index aa55a7ba09..55b20090c8 100644 --- a/bacula/src/stored/btape.c +++ b/bacula/src/stored/btape.c @@ -2661,7 +2661,7 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) return 1; } -bool dir_create_jobmedia_record(DCR *dcr) +bool dir_create_jobmedia_record(DCR *dcr, bool zero) { dcr->WroteVol = false; return 1; diff --git a/bacula/src/stored/label.c b/bacula/src/stored/label.c index 1c2d008360..23d296bb8e 100644 --- a/bacula/src/stored/label.c +++ b/bacula/src/stored/label.c @@ -435,7 +435,8 @@ bail_out: /* * Write a volume label. This is ONLY called if we have a valid Bacula - * label of type PRE_LABEL; + * label of type PRE_LABEL or we are recyling an existing Volume. + * * Returns: true if OK * false if unable to write it */ @@ -522,6 +523,7 @@ bool rewrite_volume_label(DCR *dcr, bool recycle) if (recycle) { dev->VolCatInfo.VolCatMounts++; dev->VolCatInfo.VolCatRecycles++; + dir_create_jobmedia_record(dcr, true); } else { dev->VolCatInfo.VolCatMounts = 1; dev->VolCatInfo.VolCatRecycles = 0; diff --git a/bacula/src/stored/protos.h b/bacula/src/stored/protos.h index f666c6fd8b..6800f6769b 100644 --- a/bacula/src/stored/protos.h +++ b/bacula/src/stored/protos.h @@ -55,7 +55,7 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr); bool dir_ask_sysop_to_mount_volume(DCR *dcr, int mode); bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec); bool dir_send_job_status(JCR *jcr); -bool dir_create_jobmedia_record(DCR *dcr); +bool dir_create_jobmedia_record(DCR *dcr, bool zero=false); bool dir_update_device(JCR *jcr, DEVICE *dev); bool dir_update_changer(JCR *jcr, AUTOCHANGER *changer); diff --git a/bacula/src/stored/spool.c b/bacula/src/stored/spool.c index 6e18b12a85..0242f848d8 100644 --- a/bacula/src/stored/spool.c +++ b/bacula/src/stored/spool.c @@ -299,7 +299,7 @@ static bool despool_data(DCR *dcr, bool commit) } if (!dir_create_jobmedia_record(dcr)) { - Jmsg(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), + Jmsg2(jcr, M_FATAL, 0, _("Could not create JobMedia record for Volume=\"%s\" Job=%s\n"), dcr->VolCatInfo.VolCatName, jcr->Job); } /* Set new file/block parameters for current dcr */ diff --git a/bacula/technotes-2.4 b/bacula/technotes-2.4 index 95fc9cdcf8..99b01468ca 100644 --- a/bacula/technotes-2.4 +++ b/bacula/technotes-2.4 @@ -1,6 +1,8 @@ Technical notes on version 2.4 General: +23Dec08 +kes Fix bug #1208. Inappropriate Volume purging. 22Dec08 kes Modify sql_update.c to edit zeros rather than NULL in unset fields. This should fix bug #1206, where apparently the user -- 2.39.5