X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Faskdir.c;h=b85d78e6ebbba8b90cac1caebc0f4eb8037b7053;hb=8e1af760af1f56f1799dd6df02b3875ebc87407f;hp=48c30d5c7a1673e314bcffbf400d4f1145d1a654;hpb=816d46dd2eab62a2f0c577da1f119cbe4a53c307;p=bacula%2Fbacula diff --git a/bacula/src/stored/askdir.c b/bacula/src/stored/askdir.c index 48c30d5c7a..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. @@ -56,7 +56,7 @@ static char OK_media[] = "1000 OK VolName=%127s VolJobs=%u VolFiles=%lu" " VolBlocks=%lu VolBytes=%lld VolMounts=%lu VolErrors=%lu VolWrites=%lu" " MaxVolBytes=%lld VolCapacityBytes=%lld VolStatus=%20s" " Slot=%ld MaxVolJobs=%lu MaxVolFiles=%lu InChanger=%ld" - " VolReadTime=%s VolWriteTime=%s EndFile=%lu EndBlock=%lu" + " VolReadTime=%lld VolWriteTime=%lld EndFile=%lu EndBlock=%lu" " VolParts=%lu LabelType=%ld MediaId=%lld\n"; @@ -167,7 +167,6 @@ bool dir_send_job_status(JCR *jcr) */ static bool do_get_volume_info(DCR *dcr) { - char ed_vrt[50], ed_vwt[50]; JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; VOLUME_CAT_INFO vol; @@ -188,7 +187,7 @@ static bool do_get_volume_info(DCR *dcr) &vol.VolCatWrites, &vol.VolCatMaxBytes, &vol.VolCatCapacityBytes, vol.VolCatStatus, &vol.Slot, &vol.VolCatMaxJobs, &vol.VolCatMaxFiles, - &InChanger, ed_vrt, ed_vwt, + &InChanger, &vol.VolReadTime, &vol.VolWriteTime, &vol.EndFile, &vol.EndBlock, &vol.VolCatParts, &vol.LabelType, &vol.VolMediaId); if (n != 22) { @@ -197,8 +196,6 @@ static bool do_get_volume_info(DCR *dcr) Mmsg(jcr->errmsg, _("Error getting Volume info: %s"), dir->msg); return false; } - vol.VolReadTime = str_to_int64(ed_vrt); - vol.VolWriteTime = str_to_int64(ed_vwt); vol.InChanger = InChanger; /* bool in structure */ unbash_spaces(vol.VolCatName); bstrncpy(dcr->VolumeName, vol.VolCatName, sizeof(dcr->VolumeName)); @@ -245,7 +242,7 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) * Returns: true on success dcr->VolumeName is volume * reserve_volume() called on Volume name * false on failure dcr->VolumeName[0] == 0 - * also sets dcr->volume_in_use if at least one + * also sets dcr->found_in_use if at least one * in use volume was found. * * Volume information returned in dcr @@ -256,19 +253,21 @@ bool dir_find_next_appendable_volume(DCR *dcr) JCR *jcr = dcr->jcr; BSOCK *dir = jcr->dir_bsock; bool rtn; + char lastVolume[MAX_NAME_LENGTH]; Dmsg2(200, "dir_find_next_appendable_volume: reserved=%d Vol=%s\n", - dcr->reserved_device, dcr->VolumeName); + dcr->is_reserved(), dcr->VolumeName); /* - * Try the fourty oldest or most available volumes. Note, + * Try the twenty oldest or most available volumes. Note, * the most available could already be mounted on another * drive, so we continue looking for a not in use Volume. */ lock_volumes(); P(vol_info_mutex); - dcr->volume_in_use = false; - for (int vol_index=1; vol_index < 40; vol_index++) { + dcr->clear_found_in_use(); + lastVolume[0] = 0; + for (int vol_index=1; vol_index < 20; vol_index++) { bash_spaces(dcr->media_type); bash_spaces(dcr->pool_name); dir->fsend(Find_media, jcr->Job, vol_index, dcr->pool_name, dcr->media_type); @@ -276,9 +275,15 @@ bool dir_find_next_appendable_volume(DCR *dcr) unbash_spaces(dcr->pool_name); Dmsg1(100, ">dird %s", dir->msg); if (do_get_volume_info(dcr)) { - if (!is_volume_in_use(dcr)) { + /* Give up if we get the same volume name twice */ + if (lastVolume[0] && strcmp(lastVolume, dcr->VolumeName) == 0) { + Dmsg1(100, "Got same vol = %s\n", lastVolume); + break; + } + bstrncpy(lastVolume, dcr->VolumeName, sizeof(lastVolume)); + if (dcr->can_i_write_volume()) { Dmsg1(100, "Call reserve_volume. Vol=%s\n", dcr->VolumeName); - if (reserve_volume(dcr, dcr->VolumeName) == 0) { + if (reserve_volume(dcr, dcr->VolumeName) == NULL) { Dmsg2(100, "Could not reserve volume %s on %s\n", dcr->VolumeName, dcr->dev->print_name()); continue; @@ -289,7 +294,8 @@ bool dir_find_next_appendable_volume(DCR *dcr) goto get_out; } else { Dmsg1(100, "Volume %s is in use.\n", dcr->VolumeName); - dcr->volume_in_use = true; + /* If volume is not usable, it is in use by someone else */ + dcr->set_found_in_use(); continue; } } @@ -324,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; } @@ -381,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; } @@ -397,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"), @@ -446,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(); } @@ -475,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 ( ;; ) { @@ -485,14 +511,12 @@ 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) { - Jmsg(jcr, M_MOUNT, 0, _( + Mmsg(dev->errmsg, _( "Job %s waiting. Cannot find any appendable volumes.\n" "Please use the \"label\" command to create a new Volume for:\n" " Storage: %s\n" @@ -502,6 +526,8 @@ 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); } } @@ -533,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"); @@ -612,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) { @@ -635,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");