X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Faskdir.c;h=b85d78e6ebbba8b90cac1caebc0f4eb8037b7053;hb=8e1af760af1f56f1799dd6df02b3875ebc87407f;hp=3b83ca961fb3402bcd8f5a416ca1116c45d820c7;hpb=cc737e50ed8209da7d752acd05c1089bec33c787;p=bacula%2Fbacula diff --git a/bacula/src/stored/askdir.c b/bacula/src/stored/askdir.c index 3b83ca961f..b85d78e6eb 100644 --- a/bacula/src/stored/askdir.c +++ b/bacula/src/stored/askdir.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2008 Free Software Foundation Europe e.V. + Copyright (C) 2000-2009 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. @@ -281,7 +281,7 @@ bool dir_find_next_appendable_volume(DCR *dcr) break; } bstrncpy(lastVolume, dcr->VolumeName, sizeof(lastVolume)); - if (dcr->can_i_use_volume()) { + if (dcr->can_i_write_volume()) { Dmsg1(100, "Call reserve_volume. Vol=%s\n", dcr->VolumeName); if (reserve_volume(dcr, dcr->VolumeName) == NULL) { Dmsg2(100, "Could not reserve volume %s on %s\n", dcr->VolumeName, @@ -330,7 +330,7 @@ bool dir_update_volume_info(DCR *dcr, bool label, bool update_LastWritten) POOL_MEM VolumeName; /* If system job, do not update catalog */ - if (jcr->JobType == JT_SYSTEM) { + if (jcr->get_JobType() == JT_SYSTEM) { return true; } @@ -387,14 +387,21 @@ 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; char ed1[50]; /* If system job, do not update catalog */ - if (jcr->JobType == JT_SYSTEM) { + if (jcr->get_JobType() == JT_SYSTEM) { + 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(100, "JobMedia FI=0 StartBlock!=0 record suppressed\n"); return true; } @@ -403,13 +410,19 @@ bool dir_create_jobmedia_record(DCR *dcr) } 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"), @@ -452,6 +465,10 @@ bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) ser_bytes(rec->data, rec->data_len); dir->msglen = ser_length(dir->msg); Dmsg1(1800, ">dird %s\n", dir->msg); /* Attributes */ + if (rec->Stream == STREAM_UNIX_ATTRIBUTES || + rec->Stream == STREAM_UNIX_ATTRIBUTES_EX) { + dir->set_data_end(); /* set offset of last valid data */ + } return dir->send(); } @@ -481,6 +498,9 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) JCR *jcr = dcr->jcr; bool got_vol = false; + if (job_canceled(jcr)) { + return false; + } Dmsg0(400, "enter dir_ask_sysop_to_create_appendable_volume\n"); ASSERT(dev->blocked()); for ( ;; ) { @@ -491,11 +511,9 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) Jmsg(jcr, M_INFO, 0, "%s", dev->errmsg); return false; } - dev->dlock(); got_vol = dir_find_next_appendable_volume(dcr); /* get suggested volume */ - dev->dunlock(); if (got_vol) { - return true; + goto get_out; } else { if (stat == W_TIMEOUT || stat == W_MOUNT) { Mmsg(dev->errmsg, _( @@ -508,9 +526,9 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) dev->print_name(), dcr->pool_name, dcr->media_type); + Jmsg(jcr, M_MOUNT, 0, "%s", dev->errmsg); + Dmsg1(100, "%s", dev->errmsg); } - Jmsg(jcr, M_MOUNT, 0, "%s", dev->errmsg); - Dmsg1(100, "%s", dev->errmsg); } set_jcr_job_status(jcr, JS_WaitMedia); @@ -541,6 +559,8 @@ bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) } Dmsg1(100, "Someone woke me for device %s\n", dev->print_name()); } + +get_out: set_jcr_job_status(jcr, JS_Running); dir_send_job_status(jcr); Dmsg0(100, "leave dir_ask_sysop_to_mount_create_appendable_volume\n"); @@ -620,7 +640,7 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr, int mode) if (dev->poll) { Dmsg1(400, "Poll timeout in mount vol on device %s\n", dev->print_name()); Dmsg1(400, "Blocked=%s\n", dev->print_blocked()); - goto bail_out; + goto get_out; } if (stat == W_TIMEOUT) { @@ -643,7 +663,7 @@ bool dir_ask_sysop_to_mount_volume(DCR *dcr, int mode) break; } -bail_out: +get_out: set_jcr_job_status(jcr, JS_Running); dir_send_job_status(jcr); Dmsg0(400, "leave dir_ask_sysop_to_mount_volume\n");