X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=bacula%2Fsrc%2Fstored%2Freserve.c;h=1aafd357f047cf937c00ae1ef08d333a6d7472bc;hb=bc9b9b481e86991abd879d30aa03b64b4c68d578;hp=745e176068282d362fca005562b55e386fa96569;hpb=f1d2a09fc7f7629e0bf10fa9a01a9cbb18f0243a;p=bacula%2Fbacula diff --git a/bacula/src/stored/reserve.c b/bacula/src/stored/reserve.c index 745e176068..1aafd357f0 100644 --- a/bacula/src/stored/reserve.c +++ b/bacula/src/stored/reserve.c @@ -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. @@ -39,8 +39,6 @@ #include "bacula.h" #include "stored.h" -#define jid() ((uint32_t)get_jobid_from_tid()) - const int dbglvl = 50; static dlist *vol_list = NULL; @@ -55,6 +53,7 @@ static bool reserve_device_for_append(DCR *dcr, RCTX &rctx); static bool use_storage_cmd(JCR *jcr); static void queue_reserve_message(JCR *jcr); static void pop_reserve_messages(JCR *jcr); +void switch_device(DCR *dcr, DEVICE *dev); /* Requests from the Director daemon */ static char use_storage[] = "use storage=%127s media_type=%127s " @@ -84,7 +83,10 @@ static int my_compare(void *item1, void *item2) return strcmp(((VOLRES *)item1)->vol_name, ((VOLRES *)item2)->vol_name); } - +/* + * This allows a given thread to recursively call lock_reservations. + * It must, of course, call unlock_... the same number of times. + */ void init_reservations_lock() { int errstat; @@ -134,6 +136,9 @@ void _unlock_reservations() int vol_list_lock_count = 0; +/* + * This allows a given thread to recursively call to lock_volumes() + */ void _lock_volumes() { int errstat; @@ -173,12 +178,12 @@ static void debug_list_volumes(const char *imsg) lock_volumes(); foreach_dlist(vol, vol_list) { if (vol->dev) { - Mmsg(msg, "List from %s: %s at %p on device %s\n", imsg, - vol->vol_name, vol->vol_name, vol->dev->print_name()); + Mmsg(msg, "List %s: %s rel=%d on device %s\n", imsg, + vol->vol_name, vol->released, vol->dev->print_name()); } else { - Mmsg(msg, "List from %s: %s at %p no dev\n", imsg, vol->vol_name, vol->vol_name); + Mmsg(msg, "List %s: %s rel=%d no dev\n", imsg, vol->vol_name, vol->released); } - Dmsg2(dbglvl, "jid=%u %s", jid(), msg.c_str()); + Dmsg1(dbglvl, "%s", msg.c_str()); } #ifdef xxx @@ -212,11 +217,11 @@ void list_volumes(void sendit(const char *msg, int len, void *sarg), void *arg) if (dev) { len = Mmsg(msg, "%s on device %s\n", vol->vol_name, dev->print_name()); sendit(msg.c_str(), len, arg); - len = Mmsg(msg, " Reader=%d writers=%d reserved=%d\n", dev->can_read()?1:0, - dev->num_writers, dev->reserved_device); + len = Mmsg(msg, " Reader=%d writers=%d reserved=%d released=%d\n", + dev->can_read()?1:0, dev->num_writers, dev->reserved_device, vol->released); sendit(msg.c_str(), len, arg); } else { - len = Mmsg(msg, "%s no dev\n", vol->vol_name); + len = Mmsg(msg, "%s no device. released=%d\n", vol->vol_name, vol->released); sendit(msg.c_str(), len, arg); } } @@ -234,7 +239,7 @@ static VOLRES *new_vol_item(DCR *dcr, const char *VolumeName) memset(vol, 0, sizeof(VOLRES)); vol->vol_name = bstrdup(VolumeName); vol->dev = dcr->dev; - Dmsg4(dbglvl, "jid=%u new Vol=%s at %p dev=%s\n", (int)dcr->jcr->JobId, + Dmsg3(dbglvl, "new Vol=%s at %p dev=%s\n", VolumeName, vol->vol_name, vol->dev->print_name()); return vol; } @@ -306,11 +311,11 @@ static void free_vol_item(VOLRES *vol) VOLRES *reserve_volume(DCR *dcr, const char *VolumeName) { VOLRES *vol, *nvol; - DEVICE *dev = dcr->dev; + DEVICE * volatile dev = dcr->dev; ASSERT(dev != NULL); - Dmsg2(dbglvl, "jid=%u reserve_volume %s\n", jid(), VolumeName); + Dmsg1(dbglvl, "enter reserve_volume %s\n", VolumeName); /* * We lock the reservations system here to ensure * when adding a new volume that no newly scheduled @@ -324,22 +329,28 @@ VOLRES *reserve_volume(DCR *dcr, const char *VolumeName) */ if (dev->vol) { vol = dev->vol; + Dmsg4(dbglvl, "Vol attached=%s, newvol=%s release=%d on %s\n", + vol->vol_name, VolumeName, vol->released, dev->print_name()); /* * Make sure we don't remove the current volume we are inserting - * because it was probably inserted by another job. + * because it was probably inserted by another job, or it + * is not being used and is marked as released. */ if (strcmp(vol->vol_name, VolumeName) == 0) { + Dmsg1(dbglvl, "=== OK, vol=%s on device. set not released.\n", VolumeName); + vol->released = false; /* retake vol if released previously */ goto get_out; /* Volume already on this device */ } else { - if (dev->is_busy() && dev->VolHdr.VolumeName[0]) { - vol = NULL; + /* Don't release a volume if it is in use */ + if (!vol->released) { + Dmsg1(dbglvl, "Cannot free vol=%s. It is not released.\n", vol->vol_name); + vol = NULL; /* vol in use */ goto get_out; } - Dmsg3(dbglvl, "jid=%u reserve_vol free vol=%s at %p\n", - (int)dcr->jcr->JobId, vol->vol_name, vol->vol_name); + Dmsg2(dbglvl, "reserve_vol free vol=%s at %p\n", vol->vol_name, vol->vol_name); + unload_autochanger(dcr, -1); /* unload the volume */ + free_volume(dev); debug_list_volumes("reserve_vol free"); - vol_list->remove(vol); - free_vol_item(vol); } } @@ -351,14 +362,14 @@ VOLRES *reserve_volume(DCR *dcr, const char *VolumeName) */ vol = (VOLRES *)vol_list->binary_insert(nvol, my_compare); if (vol != nvol) { - Dmsg3(dbglvl, "jid=%u Found vol=%s dev-same=%d\n", jid(), vol->vol_name, dev==vol->dev); + Dmsg2(dbglvl, "Found vol=%s dev-same=%d\n", vol->vol_name, dev==vol->dev); /* * At this point, a Volume with this name already is in the list, * so we simply release our new Volume entry. Note, this should * only happen if we are moving the volume from one drive to another. */ - Dmsg3(dbglvl, "jid=%u reserve_vol free-tmp vol=%s at %p\n", - (int)dcr->jcr->JobId, vol->vol_name, vol->vol_name); + Dmsg2(dbglvl, "reserve_vol free-tmp vol=%s at %p\n", + vol->vol_name, vol->vol_name); /* * Clear dev pointer so that free_vol_item() doesn't * take away our volume. @@ -369,9 +380,12 @@ VOLRES *reserve_volume(DCR *dcr, const char *VolumeName) /* Check if we are trying to use the Volume on a different drive */ if (dev != vol->dev) { /* Caller wants to switch Volume to another device */ + switch_device(dcr, vol->dev); + dev = vol->dev; +#ifdef xxx if (!vol->dev->is_busy()) { /* OK to move it -- I'm not sure this will work */ - Dmsg4(dbglvl, "==== jid=%u Swap vol=%s from dev=%s to %s\n", jid(), VolumeName, + Dmsg3(dbglvl, "==== Swap vol=%s from dev=%s to %s\n", VolumeName, vol->dev->print_name(), dev->print_name()); vol->dev->vol = NULL; /* take vol from old drive */ vol->dev->VolHdr.VolumeName[0] = 0; @@ -379,20 +393,56 @@ VOLRES *reserve_volume(DCR *dcr, const char *VolumeName) dev->vol = vol; /* point dev at vol */ dev->VolHdr.VolumeName[0] = 0; } else { - Dmsg4(dbglvl, "jid=%u Volume busy could not swap vol=%s from dev=%s to %s\n", - jid(), VolumeName, vol->dev->print_name(), dev->print_name()); + Dmsg3(dbglvl, "==== Swap not possible Vol busy vol=%s from dev=%s to %s\n", + VolumeName, vol->dev->print_name(), dev->print_name()); vol = NULL; /* device busy */ + goto get_out; } +#endif } } dev->vol = vol; get_out: + if (vol) { + Dmsg1(dbglvl, "=== set not released. vol=%s\n", vol->vol_name); + vol->released = false; + } debug_list_volumes("end new volume"); unlock_volumes(); return vol; } +/* + * Switch from current device to given device + * (not yet used) + */ +void switch_device(DCR *dcr, DEVICE *dev) +{ + // lock_reservations(); + DCR save_dcr; + + dev->dlock(); + memcpy(&save_dcr, dcr, sizeof(save_dcr)); + clean_device(dcr); /* clean up the dcr */ + + dcr->dev = dev; /* get new device pointer */ + Jmsg(dcr->jcr, M_INFO, 0, _("Device switch. New device %s chosen.\n"), + dcr->dev->print_name()); + + bstrncpy(dcr->VolumeName, save_dcr.VolumeName, sizeof(dcr->VolumeName)); + bstrncpy(dcr->media_type, save_dcr.media_type, sizeof(dcr->media_type)); + dcr->VolCatInfo.Slot = save_dcr.VolCatInfo.Slot; + bstrncpy(dcr->pool_name, save_dcr.pool_name, sizeof(dcr->pool_name)); + bstrncpy(dcr->pool_type, save_dcr.pool_type, sizeof(dcr->pool_type)); + bstrncpy(dcr->dev_name, dev->dev_name, sizeof(dcr->dev_name)); + + dev->reserved_device++; + dcr->reserved_device = true; + + dev->dunlock(); +} + /* * Search for a Volume name in the Volume list. * @@ -407,7 +457,7 @@ VOLRES *find_volume(DCR *dcr) vol.vol_name = bstrdup(dcr->VolumeName); fvol = (VOLRES *)vol_list->binary_search(&vol, my_compare); free(vol.vol_name); - Dmsg3(dbglvl, "jid=%u find_vol=%s found=%d\n", jid(), dcr->VolumeName, fvol!=NULL); + Dmsg2(dbglvl, "find_vol=%s found=%d\n", dcr->VolumeName, fvol!=NULL); debug_list_volumes("find_volume"); unlock_volumes(); return fvol; @@ -423,7 +473,7 @@ void unreserve_device(DCR *dcr) if (dcr->reserved_device) { dcr->reserved_device = false; dev->reserved_device--; - Dmsg3(dbglvl, "jid=%u Dec reserve=%d dev=%s\n", jid(), dev->reserved_device, dev->print_name()); + Dmsg2(dbglvl, "Dec reserve=%d dev=%s\n", dev->reserved_device, dev->print_name()); dcr->reserved_device = false; /* If we set read mode in reserving, remove it */ if (dev->can_read()) { @@ -433,15 +483,20 @@ void unreserve_device(DCR *dcr) Jmsg1(dcr->jcr, M_ERROR, 0, _("Hey! num_writers=%d!!!!\n"), dev->num_writers); dev->num_writers = 0; } + if (dev->reserved_device == 0 && dev->num_writers == 0) { + volume_unused(dcr); + } } - - volume_unused(dcr); } /* * Free a Volume from the Volume list if it is no longer used + * Note, for tape drives we want to remember where the Volume + * was when last used, so rather than free the volume entry, + * we simply mark it "released" so when the drive is really + * needed for another volume, we can reuse it. * - * Returns: true if the Volume found and removed from the list + * Returns: true if the Volume found and "removed" from the list * false if the Volume is not in the list or is in use */ bool volume_unused(DCR *dcr) @@ -449,16 +504,23 @@ bool volume_unused(DCR *dcr) DEVICE *dev = dcr->dev; if (dev->vol == NULL) { - Dmsg2(dbglvl, "jid=%u vol_unused: no vol on %s\n", (int)dcr->jcr->JobId, dev->print_name()); + Dmsg1(dbglvl, "vol_unused: no vol on %s\n", dev->print_name()); debug_list_volumes("null vol cannot unreserve_volume"); return false; } +#ifdef xxx if (dev->is_busy()) { - Dmsg2(dbglvl, "jid=%u vol_unused: no vol on %s\n", (int)dcr->jcr->JobId, dev->print_name()); + Dmsg1(dbglvl, "vol_unused: busy on %s\n", dev->print_name()); debug_list_volumes("dev busy cannot unreserve_volume"); return false; } +#endif +#ifdef xxx + if (dev->num_writers > 0 || dev->reserved_device > 0) { + ASSERT(0); + } +#endif /* * If this is a tape, we do not free the volume, rather we wait @@ -466,29 +528,36 @@ bool volume_unused(DCR *dcr) * explicitly read in this drive. This allows the SD to remember * where the tapes are or last were. */ - if (dev->is_tape() || dev->is_autochanger()) { + Dmsg3(dbglvl, "=== mark released vol=%s num_writers=%d reserved=%d\n", + dev->vol->vol_name, dev->num_writers, dev->reserved_device); + dev->vol->released = true; + if (dev->is_tape()) { // || dev->is_autochanger()) { return true; } else { + /* + * Note, this frees the volume reservation entry, but the + * file descriptor remains open with the OS. + */ return free_volume(dev); } } /* - * Unconditionally release the volume + * Unconditionally release the volume entry */ bool free_volume(DEVICE *dev) { VOLRES *vol; if (dev->vol == NULL) { - Dmsg2(dbglvl, "jid=%u No vol on dev %s\n", jid(), dev->print_name()); + Dmsg1(dbglvl, "No vol on dev %s\n", dev->print_name()); return false; } lock_volumes(); vol = dev->vol; dev->vol = NULL; vol_list->remove(vol); - Dmsg3(dbglvl, "jid=%u free_volume %s dev=%s\n", jid(), vol->vol_name, dev->print_name()); + Dmsg2(dbglvl, "=== free_volume %s dev=%s\n", vol->vol_name, dev->print_name()); free_vol_item(vol); debug_list_volumes("free_volume"); unlock_volumes(); @@ -515,11 +584,9 @@ void free_volume_list() lock_volumes(); foreach_dlist(vol, vol_list) { if (vol->dev) { - Dmsg3(dbglvl, "jid=%u free vol_list Volume=%s dev=%s\n", jid(), - vol->vol_name, vol->dev->print_name()); + Dmsg2(dbglvl, "free vol_list Volume=%s dev=%s\n", vol->vol_name, vol->dev->print_name()); } else { - Dmsg3(dbglvl, "jid=%u free vol_list Volume=%s dev=%p\n", jid(), - vol->vol_name, vol->dev); + Dmsg1(dbglvl, "free vol_list Volume=%s No dev\n", vol->vol_name); } free(vol->vol_name); vol->vol_name = NULL; @@ -533,25 +600,25 @@ bool is_volume_in_use(DCR *dcr) { VOLRES *vol = find_volume(dcr); if (!vol) { - Dmsg2(dbglvl, "jid=%u Vol=%s not in use.\n", jid(), dcr->VolumeName); + Dmsg1(dbglvl, "Vol=%s not in use.\n", dcr->VolumeName); return false; /* vol not in list */ } ASSERT(vol->dev != NULL); if (dcr->dev == vol->dev) { /* same device OK */ - Dmsg2(dbglvl, "jid=%u Vol=%s on same dev.\n", jid(), dcr->VolumeName); + Dmsg1(dbglvl, "Vol=%s on same dev.\n", dcr->VolumeName); return false; } else { - Dmsg4(dbglvl, "jid=%u Vol=%s on %s we have %s\n", jid(), dcr->VolumeName, + Dmsg3(dbglvl, "Vol=%s on %s we have %s\n", dcr->VolumeName, vol->dev->print_name(), dcr->dev->print_name()); } if (!vol->dev->is_busy()) { - Dmsg3(dbglvl, "jid=%u Vol=%s dev=%s not busy.\n", jid(), dcr->VolumeName, vol->dev->print_name()); + Dmsg2(dbglvl, "Vol=%s dev=%s not busy.\n", dcr->VolumeName, vol->dev->print_name()); return false; } else { - Dmsg3(dbglvl, "jid=%u Vol=%s dev=%s busy.\n", jid(), dcr->VolumeName, vol->dev->print_name()); + Dmsg2(dbglvl, "Vol=%s dev=%s busy.\n", dcr->VolumeName, vol->dev->print_name()); } - Dmsg3(dbglvl, "jid=%u Vol=%s in use by %s.\n", jid(), dcr->VolumeName, vol->dev->print_name()); + Dmsg2(dbglvl, "Vol=%s in use by %s.\n", dcr->VolumeName, vol->dev->print_name()); return true; } @@ -587,7 +654,7 @@ static bool use_storage_cmd(JCR *jcr) dirstore = New(alist(10, not_owned_by_alist)); jcr->reserve_msgs = New(alist(10, not_owned_by_alist)); do { - Dmsg2(dbglvl, "jid=%u msg); + Dmsg1(dbglvl, "msg); ok = sscanf(dir->msg, use_storage, store_name.c_str(), media_type.c_str(), pool_name.c_str(), pool_type.c_str(), &append, &Copy, &Stripe) == 7; @@ -616,7 +683,7 @@ static bool use_storage_cmd(JCR *jcr) /* Now get all devices */ while (dir->recv() >= 0) { - Dmsg2(dbglvl, "jid=%u msg); + Dmsg1(dbglvl, "msg); ok = sscanf(dir->msg, use_device, dev_name.c_str()) == 1; if (!ok) { break; @@ -630,12 +697,11 @@ static bool use_storage_cmd(JCR *jcr) char *device_name; if (debug_level >= dbglvl) { foreach_alist(store, dirstore) { - Dmsg6(dbglvl, "jid=%u Storage=%s media_type=%s pool=%s pool_type=%s append=%d\n", - (int)rctx.jcr->JobId, + Dmsg5(dbglvl, "Storage=%s media_type=%s pool=%s pool_type=%s append=%d\n", store->name, store->media_type, store->pool_name, store->pool_type, store->append); foreach_alist(device_name, store->device) { - Dmsg2(dbglvl, "jid=%u Device=%s\n", jid(), device_name); + Dmsg1(dbglvl, " Device=%s\n", device_name); } } } @@ -681,8 +747,7 @@ static bool use_storage_cmd(JCR *jcr) rctx.PreferMountedVols = false; rctx.exact_match = false; rctx.autochanger_only = true; - Dmsg6(dbglvl, "jid=%u PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", - (int)rctx.jcr->JobId, + Dmsg5(dbglvl, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device, rctx.autochanger_only, rctx.any_drive); if ((ok = find_suitable_device_for_job(jcr, rctx))) { @@ -697,8 +762,7 @@ static bool use_storage_cmd(JCR *jcr) rctx.try_low_use_drive = false; } rctx.autochanger_only = false; - Dmsg6(dbglvl, "jid=%u PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", - (int)rctx.jcr->JobId, + Dmsg5(dbglvl, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device, rctx.autochanger_only, rctx.any_drive); if ((ok = find_suitable_device_for_job(jcr, rctx))) { @@ -713,8 +777,7 @@ static bool use_storage_cmd(JCR *jcr) rctx.PreferMountedVols = true; rctx.exact_match = true; rctx.autochanger_only = false; - Dmsg6(dbglvl, "jid=%u PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", - (int)rctx.jcr->JobId, + Dmsg5(dbglvl, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device, rctx.autochanger_only, rctx.any_drive); if ((ok = find_suitable_device_for_job(jcr, rctx))) { @@ -722,8 +785,7 @@ static bool use_storage_cmd(JCR *jcr) } /* Look for any mounted drive */ rctx.exact_match = false; - Dmsg6(dbglvl, "jid=%u PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", - (int)rctx.jcr->JobId, + Dmsg5(dbglvl, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device, rctx.autochanger_only, rctx.any_drive); if ((ok = find_suitable_device_for_job(jcr, rctx))) { @@ -731,8 +793,7 @@ static bool use_storage_cmd(JCR *jcr) } /* Try any drive */ rctx.any_drive = true; - Dmsg6(dbglvl, "jid=%u PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", - (int)rctx.jcr->JobId, + Dmsg5(dbglvl, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device, rctx.autochanger_only, rctx.any_drive); if ((ok = find_suitable_device_for_job(jcr, rctx))) { @@ -749,10 +810,9 @@ static bool use_storage_cmd(JCR *jcr) */ if (repeat++ > 1) { /* try algorithm 3 times */ bmicrosleep(30, 0); /* wait a bit */ - Dmsg1(dbglvl, "jid=%u repeat reserve algorithm\n", (int)rctx.jcr->JobId); + Dmsg0(dbglvl, "repeat reserve algorithm\n"); } else if (!rctx.suitable_device || !wait_for_device(jcr, wait_for_device_retries)) { - Dmsg1(dbglvl, "jid=%u Fail. !suitable_device || !wait_for_device\n", - (int)rctx.jcr->JobId); + Dmsg0(dbglvl, "Fail. !suitable_device || !wait_for_device\n"); fail = true; } lock_reservations(); @@ -773,14 +833,14 @@ static bool use_storage_cmd(JCR *jcr) dev_name.c_str(), media_type.c_str()); dir->fsend(NO_device, dev_name.c_str()); - Dmsg2(dbglvl, "jid=%u >dird: %s", jid(), dir->msg); + Dmsg1(dbglvl, ">dird: %s", dir->msg); } } else { unbash_spaces(dir->msg); pm_strcpy(jcr->errmsg, dir->msg); Jmsg(jcr, M_FATAL, 0, _("Failed command: %s\n"), jcr->errmsg); dir->fsend(BAD_use, jcr->errmsg); - Dmsg2(dbglvl, "jid=%u >dird: %s", jid(), dir->msg); + Dmsg1(dbglvl, ">dird: %s", dir->msg); } release_reserve_messages(jcr); @@ -801,12 +861,10 @@ static bool is_vol_in_autochanger(RCTX &rctx, VOLRES *vol) /* Find resource, and make sure we were able to open it */ if (strcmp(rctx.device_name, changer->hdr.name) == 0) { - Dmsg2(dbglvl, "jid=%u Found changer device %s\n", - (int)rctx.jcr->JobId, vol->dev->device->hdr.name); + Dmsg1(dbglvl, "Found changer device %s\n", vol->dev->device->hdr.name); return true; } - Dmsg2(dbglvl, "jid=%u Incorrect changer device %s\n", - (int)rctx.jcr->JobId, changer->hdr.name); + Dmsg1(dbglvl, "Incorrect changer device %s\n", changer->hdr.name); return false; } @@ -826,8 +884,7 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx) } else { dirstore = jcr->read_store; } - Dmsg5(dbglvl, "jid=%u PrefMnt=%d exact=%d suitable=%d chgronly=%d\n", - (int)rctx.jcr->JobId, + Dmsg4(dbglvl, "PrefMnt=%d exact=%d suitable=%d chgronly=%d\n", rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device, rctx.autochanger_only); @@ -841,7 +898,7 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx) dlist *temp_vol_list, *save_vol_list; VOLRES *vol = NULL; lock_volumes(); - Dmsg1(dbglvl, "jid=%u lock volumes\n", (uint32_t)rctx.jcr->JobId); + Dmsg0(dbglvl, "lock volumes\n"); /* * Create a temporary copy of the volume list. We do this, @@ -852,7 +909,7 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx) * we can take note and act accordingly (probably redo the * search at least a few times). */ - Dmsg1(dbglvl, "jid=%u duplicate vol list\n", (int)rctx.jcr->JobId); + Dmsg0(dbglvl, "duplicate vol list\n"); temp_vol_list = New(dlist(vol, &vol->link)); foreach_dlist(vol, vol_list) { VOLRES *nvol; @@ -868,14 +925,14 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx) Jmsg(jcr, M_WARNING, 0, "Logic error. Duplicating vol list hit duplicate.\n"); } } - Dmsg1(dbglvl, "jid=%u unlock volumes\n", (uint32_t)jcr->JobId); + Dmsg0(dbglvl, "unlock volumes\n"); unlock_volumes(); /* Look through reserved volumes for one we can use */ - Dmsg1(dbglvl, "jid=%u look for vol in vol list\n", (int)rctx.jcr->JobId); + Dmsg0(dbglvl, "look for vol in vol list\n"); foreach_dlist(vol, temp_vol_list) { if (!vol->dev) { - Dmsg2(dbglvl, "jid=%u vol=%s no dev\n", (int)rctx.jcr->JobId, vol->vol_name); + Dmsg1(dbglvl, "vol=%s no dev\n", vol->vol_name); continue; } /* Check with Director if this Volume is OK */ @@ -884,7 +941,7 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx) continue; } - Dmsg2(dbglvl, "jid=%u vol=%s OK for this job\n", (int)rctx.jcr->JobId, vol->vol_name); + Dmsg1(dbglvl, "vol=%s OK for this job\n", vol->vol_name); foreach_alist(store, dirstore) { int stat; rctx.store = store; @@ -894,13 +951,12 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx) rctx.device = vol->dev->device; if (vol->dev->is_autochanger()) { - Dmsg2(dbglvl, "jid=%u vol=%s is in changer\n", (int)rctx.jcr->JobId, - vol->vol_name); + Dmsg1(dbglvl, "vol=%s is in changer\n", vol->vol_name); if (!is_vol_in_autochanger(rctx, vol)) { continue; } } else if (strcmp(device_name, vol->dev->device->hdr.name) != 0) { - Dmsg3(dbglvl, "jid=%u device=%s not suitable want %s\n", (int)rctx.jcr->JobId, + Dmsg2(dbglvl, "device=%s not suitable want %s\n", vol->dev->device->hdr.name, device_name); continue; } @@ -908,22 +964,20 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx) bstrncpy(rctx.VolumeName, vol->vol_name, sizeof(rctx.VolumeName)); rctx.have_volume = true; /* Try reserving this device and volume */ - Dmsg3(dbglvl, "jid=%u try vol=%s on device=%s\n", (int)rctx.jcr->JobId, - rctx.VolumeName, device_name); + Dmsg2(dbglvl, "try vol=%s on device=%s\n", rctx.VolumeName, device_name); stat = reserve_device(rctx); if (stat == 1) { /* found available device */ - Dmsg2(dbglvl, "jid=%u Suitable device found=%s\n", (int)rctx.jcr->JobId, - device_name); + Dmsg1(dbglvl, "Suitable device found=%s\n", device_name); ok = true; break; } else if (stat == 0) { /* device busy */ - Dmsg2(dbglvl, "jid=%u Suitable device=%s, busy: not use\n", - (int)rctx.jcr->JobId, device_name); + Dmsg1(dbglvl, "Suitable device=%s, busy: not use\n", device_name); } else { /* otherwise error */ - Dmsg1(dbglvl, "jid=%u No suitable device found.\n", (int)rctx.jcr->JobId); + Dmsg0(dbglvl, "No suitable device found.\n"); } rctx.have_volume = false; + rctx.VolumeName[0] = 0; } if (ok) { break; @@ -934,19 +988,19 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx) } } /* end for loop over reserved volumes */ - Dmsg1(dbglvl, "jid=%u lock volumes\n", (uint32_t)rctx.jcr->JobId); + Dmsg0(dbglvl, "lock volumes\n"); lock_volumes(); save_vol_list = vol_list; vol_list = temp_vol_list; free_volume_list(); /* release temp_vol_list */ vol_list = save_vol_list; - Dmsg1(dbglvl, "jid=%u deleted temp vol list\n", (int)rctx.jcr->JobId); - Dmsg1(dbglvl, "jid=%u lock volumes\n", (uint32_t)rctx.jcr->JobId); + Dmsg0(dbglvl, "deleted temp vol list\n"); + Dmsg0(dbglvl, "unlock volumes\n"); unlock_volumes(); + debug_list_volumes("=== After free temp table\n"); } if (ok) { - Dmsg2(dbglvl, "jid=%u got vol %s from in-use vols list\n", (int)rctx.jcr->JobId, - rctx.VolumeName); + Dmsg1(dbglvl, "got vol %s from in-use vols list\n", rctx.VolumeName); return true; } @@ -963,16 +1017,14 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx) rctx.device_name = device_name; stat = search_res_for_device(rctx); if (stat == 1) { /* found available device */ - Dmsg2(dbglvl, "jid=%u available device found=%s\n", (int)rctx.jcr->JobId, - device_name); + Dmsg1(dbglvl, "available device found=%s\n", device_name); ok = true; break; } else if (stat == 0) { /* device busy */ - Dmsg2(dbglvl, "jid=%u Suitable device=%s, busy: not use\n", - (int)rctx.jcr->JobId, device_name); + Dmsg1(dbglvl, "Suitable device=%s, busy: not use\n", device_name); } else { /* otherwise error */ - Dmsg1(dbglvl, "jid=%u No suitable device found.\n", (int)rctx.jcr->JobId); + Dmsg0(dbglvl, "No suitable device found.\n"); } } if (ok) { @@ -991,29 +1043,26 @@ int search_res_for_device(RCTX &rctx) AUTOCHANGER *changer; int stat; - Dmsg2(dbglvl, "jid=%u search res for %s\n", (int)rctx.jcr->JobId, rctx.device_name); + Dmsg1(dbglvl, "search res for %s\n", rctx.device_name); /* Look through Autochangers first */ foreach_res(changer, R_AUTOCHANGER) { - Dmsg2(dbglvl, "jid=%u Try match changer res=%s\n", (int)rctx.jcr->JobId, changer->hdr.name); + Dmsg1(dbglvl, "Try match changer res=%s\n", changer->hdr.name); /* Find resource, and make sure we were able to open it */ if (strcmp(rctx.device_name, changer->hdr.name) == 0) { /* Try each device in this AutoChanger */ foreach_alist(rctx.device, changer->device) { - Dmsg2(dbglvl, "jid=%u Try changer device %s\n", (int)rctx.jcr->JobId, - rctx.device->hdr.name); + Dmsg1(dbglvl, "Try changer device %s\n", rctx.device->hdr.name); stat = reserve_device(rctx); if (stat != 1) { /* try another device */ continue; } /* Debug code */ if (rctx.store->append == SD_APPEND) { - Dmsg3(dbglvl, "jid=%u Device %s reserved=%d for append.\n", - (int)rctx.jcr->JobId, rctx.device->hdr.name, - rctx.jcr->dcr->dev->reserved_device); + Dmsg2(dbglvl, "Device %s reserved=%d for append.\n", + rctx.device->hdr.name, rctx.jcr->dcr->dev->reserved_device); } else { - Dmsg3(dbglvl, "jid=%u Device %s reserved=%d for read.\n", - (int)rctx.jcr->JobId, rctx.device->hdr.name, - rctx.jcr->read_dcr->dev->reserved_device); + Dmsg2(dbglvl, "Device %s reserved=%d for read.\n", + rctx.device->hdr.name, rctx.jcr->read_dcr->dev->reserved_device); } return stat; } @@ -1023,7 +1072,7 @@ int search_res_for_device(RCTX &rctx) /* Now if requested look through regular devices */ if (!rctx.autochanger_only) { foreach_res(rctx.device, R_DEVICE) { - Dmsg2(dbglvl, "jid=%u Try match res=%s\n", (int)rctx.jcr->JobId, rctx.device->hdr.name); + Dmsg1(dbglvl, "Try match res=%s\n", rctx.device->hdr.name); /* Find resource, and make sure we were able to open it */ if (strcmp(rctx.device_name, rctx.device->hdr.name) == 0) { stat = reserve_device(rctx); @@ -1032,13 +1081,11 @@ int search_res_for_device(RCTX &rctx) } /* Debug code */ if (rctx.store->append == SD_APPEND) { - Dmsg3(dbglvl, "jid=%u Device %s reserved=%d for append.\n", - (int)rctx.jcr->JobId, rctx.device->hdr.name, - rctx.jcr->dcr->dev->reserved_device); + Dmsg2(dbglvl, "Device %s reserved=%d for append.\n", + rctx.device->hdr.name, rctx.jcr->dcr->dev->reserved_device); } else { - Dmsg3(dbglvl, "jid=%u Device %s reserved=%d for read.\n", - (int)rctx.jcr->JobId, rctx.device->hdr.name, - rctx.jcr->read_dcr->dev->reserved_device); + Dmsg2(dbglvl, "Device %s reserved=%d for read.\n", + rctx.device->hdr.name, rctx.jcr->read_dcr->dev->reserved_device); } return stat; } @@ -1061,8 +1108,7 @@ static int reserve_device(RCTX &rctx) const int name_len = MAX_NAME_LENGTH; /* Make sure MediaType is OK */ - Dmsg3(dbglvl, "jid=%u chk MediaType device=%s request=%s\n", - (int)rctx.jcr->JobId, + Dmsg2(dbglvl, "chk MediaType device=%s request=%s\n", rctx.device->media_type, rctx.store->media_type); if (strcmp(rctx.device->media_type, rctx.store->media_type) != 0) { return -1; @@ -1086,7 +1132,7 @@ static int reserve_device(RCTX &rctx) } rctx.suitable_device = true; - Dmsg2(dbglvl, "jid=%u try reserve %s\n", rctx.jcr->JobId, rctx.device->hdr.name); + Dmsg1(dbglvl, "try reserve %s\n", rctx.device->hdr.name); rctx.jcr->dcr = dcr = new_dcr(rctx.jcr, rctx.jcr->dcr, rctx.device->dev); if (!dcr) { BSOCK *dir = rctx.jcr->dir_bsock; @@ -1099,26 +1145,34 @@ static int reserve_device(RCTX &rctx) bstrncpy(dcr->media_type, rctx.store->media_type, name_len); bstrncpy(dcr->dev_name, rctx.device_name, name_len); if (rctx.store->append == SD_APPEND) { - Dmsg3(dbglvl, "jid=%u have_vol=%d vol=%s\n", (int)rctx.jcr->JobId, - rctx.have_volume, rctx.VolumeName); + Dmsg2(dbglvl, "call reserve for append: have_vol=%d vol=%s\n", rctx.have_volume, rctx.VolumeName); ok = reserve_device_for_append(dcr, rctx); if (!ok) { goto bail_out; } rctx.jcr->dcr = dcr; - Dmsg6(dbglvl, "jid=%u Reserved=%d dev_name=%s mediatype=%s pool=%s ok=%d\n", - (int)rctx.jcr->JobId, + Dmsg5(dbglvl, "Reserved=%d dev_name=%s mediatype=%s pool=%s ok=%d\n", dcr->dev->reserved_device, dcr->dev_name, dcr->media_type, dcr->pool_name, ok); - if (!rctx.have_volume) { + Dmsg3(dbglvl, "Vol=%s num_writers=%d, have_vol=%d\n", + rctx.VolumeName, dcr->dev->num_writers, rctx.have_volume); + if (rctx.have_volume) { + if (reserve_volume(dcr, rctx.VolumeName)) { + Dmsg1(dbglvl, "Reserved vol=%s\n", rctx.VolumeName); + } else { + Dmsg1(dbglvl, "Could not reserve vol=%s\n", rctx.VolumeName); + goto bail_out; + } + } else { dcr->any_volume = true; + Dmsg0(dbglvl, "no vol, call find_next_appendable_vol.\n"); if (dir_find_next_appendable_volume(dcr)) { bstrncpy(rctx.VolumeName, dcr->VolumeName, sizeof(rctx.VolumeName)); - Dmsg2(dbglvl, "jid=%u looking for Volume=%s\n", (int)rctx.jcr->JobId, rctx.VolumeName); rctx.have_volume = true; + Dmsg1(dbglvl, "looking for Volume=%s\n", rctx.VolumeName); } else { - Dmsg1(dbglvl, "jid=%u No next volume found\n", (int)rctx.jcr->JobId); + Dmsg0(dbglvl, "No next volume found\n"); rctx.have_volume = false; rctx.VolumeName[0] = 0; /* @@ -1131,13 +1185,24 @@ static int reserve_device(RCTX &rctx) if (dcr->volume_in_use && !rctx.PreferMountedVols) { rctx.PreferMountedVols = true; if (dcr->VolumeName[0]) { - volume_unused(dcr); + unreserve_device(dcr); } goto bail_out; } + /* + * Note. Under some circumstances, the Director can hand us + * a Volume name that is not the same as the one on the current + * drive, and in that case, the call above to find the next + * volume will fail because in attempting to reserve the Volume + * the code will realize that we already have a tape mounted, + * and it will fail. This *should* only happen if there are + * writers, thus the following test. In that case, we simply + * bail out, and continue waiting, rather than plunging on + * and hoping that the operator can resolve the problem. + */ if (dcr->dev->num_writers != 0) { if (dcr->VolumeName[0]) { - volume_unused(dcr); + unreserve_device(dcr); } goto bail_out; } @@ -1147,8 +1212,7 @@ static int reserve_device(RCTX &rctx) ok = reserve_device_for_read(dcr); if (ok) { rctx.jcr->read_dcr = dcr; - Dmsg6(dbglvl, "jid=%u Read reserved=%d dev_name=%s mediatype=%s pool=%s ok=%d\n", - (int)rctx.jcr->JobId, + Dmsg5(dbglvl, "Read reserved=%d dev_name=%s mediatype=%s pool=%s ok=%d\n", dcr->dev->reserved_device, dcr->dev_name, dcr->media_type, dcr->pool_name, ok); } @@ -1156,13 +1220,14 @@ static int reserve_device(RCTX &rctx) if (!ok) { goto bail_out; } + if (rctx.notify_dir) { POOL_MEM dev_name; BSOCK *dir = rctx.jcr->dir_bsock; pm_strcpy(dev_name, rctx.device->hdr.name); bash_spaces(dev_name); ok = dir->fsend(OK_device, dev_name.c_str()); /* Return real device name */ - Dmsg2(dbglvl, "jid=%u >dird: %s", jid(), dir->msg); + Dmsg1(dbglvl, ">dird: %s", dir->msg); } else { ok = true; } @@ -1170,8 +1235,8 @@ static int reserve_device(RCTX &rctx) bail_out: rctx.have_volume = false; -// free_dcr(dcr); - Dmsg1(dbglvl, "jid=%u Not OK.\n", (int)rctx.jcr->JobId); + rctx.VolumeName[0] = 0; + Dmsg0(dbglvl, "Not OK.\n"); return 0; } @@ -1192,8 +1257,7 @@ static bool reserve_device_for_read(DCR *dcr) dev->dlock(); if (is_device_unmounted(dev)) { - Dmsg2(dbglvl, "jid=%u Device %s is BLOCKED due to user unmount.\n", - (int)jcr->JobId, dev->print_name()); + Dmsg1(dbglvl, "Device %s is BLOCKED due to user unmount.\n", dev->print_name()); Mmsg(jcr->errmsg, _("3601 JobId=%u device %s is BLOCKED due to user unmount.\n"), jcr->JobId, dev->print_name()); queue_reserve_message(jcr); @@ -1201,8 +1265,8 @@ static bool reserve_device_for_read(DCR *dcr) } if (dev->is_busy()) { - Dmsg5(dbglvl, "jid=%u Device %s is busy ST_READ=%d num_writers=%d reserved=%d.\n", - (int)jcr->JobId, dev->print_name(), + Dmsg4(dbglvl, "Device %s is busy ST_READ=%d num_writers=%d reserved=%d.\n", + dev->print_name(), dev->state & ST_READ?1:0, dev->num_writers, dev->reserved_device); Mmsg(jcr->errmsg, _("3602 JobId=%u device %s is busy (already reading/writing).\n"), jcr->JobId, dev->print_name()); @@ -1214,8 +1278,7 @@ static bool reserve_device_for_read(DCR *dcr) dev->set_read(); ok = true; dev->reserved_device++; - Dmsg4(dbglvl, "jid=%u Inc reserve=%d dev=%s %p\n", (int)jcr->JobId, - dev->reserved_device, dev->print_name(), dev); + Dmsg3(dbglvl, "Inc reserve=%d dev=%s %p\n", dev->reserved_device, dev->print_name(), dev); dcr->reserved_device = true; bail_out: @@ -1253,7 +1316,7 @@ static bool reserve_device_for_append(DCR *dcr, RCTX &rctx) if (dev->can_read()) { Mmsg(jcr->errmsg, _("3603 JobId=%u device %s is busy reading.\n"), jcr->JobId, dev->print_name()); - Dmsg2(dbglvl, "jid=%u %s", jid(), jcr->errmsg); + Dmsg1(dbglvl, "%s", jcr->errmsg); queue_reserve_message(jcr); goto bail_out; } @@ -1262,22 +1325,21 @@ static bool reserve_device_for_append(DCR *dcr, RCTX &rctx) if (is_device_unmounted(dev)) { Mmsg(jcr->errmsg, _("3604 JobId=%u device %s is BLOCKED due to user unmount.\n"), jcr->JobId, dev->print_name()); - Dmsg2(dbglvl, "jid=%u %s", jid(), jcr->errmsg); + Dmsg1(dbglvl, "%s", jcr->errmsg); queue_reserve_message(jcr); goto bail_out; } - Dmsg2(dbglvl, "jid=%u reserve_append device is %s\n", - (int)jcr->JobId, dev->print_name()); + Dmsg1(dbglvl, "reserve_append device is %s\n", dev->print_name()); /* Now do detailed tests ... */ if (can_reserve_drive(dcr, rctx) != 1) { - Dmsg1(dbglvl, "jid=%u can_reserve_drive!=1\n", (int)jcr->JobId); + Dmsg0(dbglvl, "can_reserve_drive!=1\n"); goto bail_out; } dev->reserved_device++; - Dmsg4(dbglvl, "jid=%u Inc reserve=%d dev=%s %p\n", (int)jcr->JobId, dev->reserved_device, + Dmsg3(dbglvl, "Inc reserve=%d dev=%s %p\n", dev->reserved_device, dev->print_name(), dev); dcr->reserved_device = true; ok = true; @@ -1296,18 +1358,17 @@ static int is_pool_ok(DCR *dcr) if (strcmp(dev->pool_name, dcr->pool_name) == 0 && strcmp(dev->pool_type, dcr->pool_type) == 0) { /* OK, compatible device */ - Dmsg2(dbglvl, "jid=%u OK dev: %s num_writers=0, reserved, pool matches\n", - jcr->JobId, dev->print_name()); + Dmsg1(dbglvl, "OK dev: %s num_writers=0, reserved, pool matches\n", dev->print_name()); return 1; } else { /* Drive Pool not suitable for us */ Mmsg(jcr->errmsg, _( "3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" nreserve=%d on drive %s.\n"), - jcr->JobId, dcr->pool_name, dev->pool_name, + (uint32_t)jcr->JobId, dcr->pool_name, dev->pool_name, dev->reserved_device, dev->print_name()); queue_reserve_message(jcr); - Dmsg3(dbglvl, "jid=%u failed: busy num_writers=0, reserved, pool=%s wanted=%s\n", - (int)jcr->JobId, dev->pool_name, dcr->pool_name); + Dmsg2(dbglvl, "failed: busy num_writers=0, reserved, pool=%s wanted=%s\n", + dev->pool_name, dcr->pool_name); } return 0; } @@ -1317,8 +1378,8 @@ static bool is_max_jobs_ok(DCR *dcr) DEVICE *dev = dcr->dev; JCR *jcr = dcr->jcr; - Dmsg5(dbglvl, "jid=%u MaxJobs=%d Jobs=%d reserves=%d Vol=%s\n", - (uint32_t)jcr->JobId, dcr->VolCatInfo.VolCatMaxJobs, + Dmsg4(dbglvl, "MaxJobs=%d Jobs=%d reserves=%d Vol=%s\n", + dcr->VolCatInfo.VolCatMaxJobs, dcr->VolCatInfo.VolCatJobs, dev->reserved_device, dcr->VolumeName); if (dcr->VolCatInfo.VolCatMaxJobs > 0 && dcr->VolCatInfo.VolCatMaxJobs <= @@ -1327,7 +1388,7 @@ static bool is_max_jobs_ok(DCR *dcr) Mmsg(jcr->errmsg, _("3610 JobId=%u Volume max jobs exceeded on drive %s.\n"), (uint32_t)jcr->JobId, dev->print_name()); queue_reserve_message(jcr); - Dmsg2(dbglvl, "jid=%u reserve dev failed: %s", (uint32_t)jcr->JobId, jcr->errmsg); + Dmsg1(dbglvl, "reserve dev failed: %s", jcr->errmsg); return false; /* wait */ } return true; @@ -1343,11 +1404,15 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx) DEVICE *dev = dcr->dev; JCR *jcr = dcr->jcr; - Dmsg6(dbglvl, "jid=%u PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", - (int)jcr->JobId, + Dmsg5(dbglvl, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device, rctx.autochanger_only, rctx.any_drive); + /* Check for max jobs on this Volume */ + if (!is_max_jobs_ok(dcr)) { + return 0; + } + /* setting any_drive overrides PreferMountedVols flag */ if (!rctx.any_drive) { /* @@ -1357,8 +1422,8 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx) * helps spread the load to the least used drives. */ if (rctx.try_low_use_drive && dev == rctx.low_use_drive) { - Dmsg3(dbglvl, "jid=%u OK dev=%s == low_drive=%s.\n", - jcr->JobId, dev->print_name(), rctx.low_use_drive->print_name()); + Dmsg2(dbglvl, "OK dev=%s == low_drive=%s.\n", + dev->print_name(), rctx.low_use_drive->print_name()); return 1; } /* If he wants a free drive, but this one is busy, no go */ @@ -1367,13 +1432,12 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx) if ((dev->num_writers + dev->reserved_device) < rctx.num_writers) { rctx.num_writers = dev->num_writers + dev->reserved_device; rctx.low_use_drive = dev; - Dmsg3(dbglvl, "jid=%u set low use drive=%s num_writers=%d\n", - (int)jcr->JobId, dev->print_name(), rctx.num_writers); + Dmsg2(dbglvl, "set low use drive=%s num_writers=%d\n", + dev->print_name(), rctx.num_writers); } else { - Dmsg2(dbglvl, "jid=%u not low use num_writers=%d\n", - (int)jcr->JobId, dev->num_writers+dev->reserved_device); + Dmsg1(dbglvl, "not low use num_writers=%d\n", dev->num_writers+dev->reserved_device); } - Dmsg1(dbglvl, "jid=%u failed: !prefMnt && busy.\n", jcr->JobId); + Dmsg0(dbglvl, "failed: !prefMnt && busy.\n"); Mmsg(jcr->errmsg, _("3605 JobId=%u wants free drive but device %s is busy.\n"), jcr->JobId, dev->print_name()); queue_reserve_message(jcr); @@ -1385,7 +1449,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx) Mmsg(jcr->errmsg, _("3606 JobId=%u prefers mounted drives, but drive %s has no Volume.\n"), jcr->JobId, dev->print_name()); queue_reserve_message(jcr); - Dmsg1(dbglvl, "jid=%u failed: want mounted -- no vol\n", (uint32_t)jcr->JobId); + Dmsg0(dbglvl, "failed: want mounted -- no vol\n"); return 0; /* No volume mounted */ } @@ -1395,12 +1459,11 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx) */ if (rctx.exact_match && rctx.have_volume) { bool ok; - Dmsg6(dbglvl, "jid=%u PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", - (int)jcr->JobId, + Dmsg5(dbglvl, "PrefMnt=%d exact=%d suitable=%d chgronly=%d any=%d\n", rctx.PreferMountedVols, rctx.exact_match, rctx.suitable_device, rctx.autochanger_only, rctx.any_drive); - Dmsg5(dbglvl, "jid=%u have_vol=%d have=%s resvol=%s want=%s\n", - (int)jcr->JobId, rctx.have_volume, dev->VolHdr.VolumeName, + Dmsg4(dbglvl, "have_vol=%d have=%s resvol=%s want=%s\n", + rctx.have_volume, dev->VolHdr.VolumeName, dev->vol?dev->vol->vol_name:"*none*", rctx.VolumeName); ok = strcmp(dev->VolHdr.VolumeName, rctx.VolumeName) == 0 || (dev->vol && strcmp(dev->vol->vol_name, rctx.VolumeName) == 0); @@ -1409,9 +1472,8 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx) jcr->JobId, rctx.VolumeName, dev->VolHdr.VolumeName, dev->print_name()); queue_reserve_message(jcr); - Dmsg4(dbglvl, "jid=%u not OK: dev have=%s resvol=%s want=%s\n", - (int)jcr->JobId, dev->VolHdr.VolumeName, - dev->vol?dev->vol->vol_name:"*none*", rctx.VolumeName); + Dmsg3(dbglvl, "not OK: dev have=%s resvol=%s want=%s\n", + dev->VolHdr.VolumeName, dev->vol?dev->vol->vol_name:"*none*", rctx.VolumeName); return 0; } if (is_volume_in_use(dcr)) { @@ -1424,8 +1486,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx) if (rctx.autochanger_only && !dev->is_busy() && dev->VolHdr.VolumeName[0] == 0) { /* Device is available but not yet reserved, reserve it for us */ - Dmsg2(dbglvl, "jid=%u OK Res Unused autochanger %s.\n", - jcr->JobId, dev->print_name()); + Dmsg1(dbglvl, "OK Res Unused autochanger %s.\n", dev->print_name()); bstrncpy(dev->pool_name, dcr->pool_name, sizeof(dev->pool_name)); bstrncpy(dev->pool_type, dcr->pool_type, sizeof(dev->pool_type)); return 1; /* reserve drive */ @@ -1437,22 +1498,18 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx) if (dev->num_writers == 0) { /* Now check if there are any reservations on the drive */ if (dev->reserved_device) { - if (!is_max_jobs_ok(dcr)) { - return 0; - } return is_pool_ok(dcr); } else if (dev->can_append()) { if (is_pool_ok(dcr)) { return 1; } else { /* Changing pool, unload old tape if any in drive */ - Dmsg1(dbglvl, "jid=%u OK dev: num_writers=0, not reserved, pool change, unload changer\n", - (int)jcr->JobId); + Dmsg0(dbglvl, "OK dev: num_writers=0, not reserved, pool change, unload changer\n"); unload_autochanger(dcr, 0); } } /* Device is available but not yet reserved, reserve it for us */ - Dmsg2(dbglvl, "jid=%u OK Dev avail reserved %s\n", jcr->JobId, dev->print_name()); + Dmsg1(dbglvl, "OK Dev avail reserved %s\n", dev->print_name()); bstrncpy(dev->pool_name, dcr->pool_name, sizeof(dev->pool_name)); bstrncpy(dev->pool_type, dcr->pool_type, sizeof(dev->pool_type)); return 1; /* reserve drive */ @@ -1463,9 +1520,6 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx) * available if pool is the same). */ if (dev->can_append() || dev->num_writers > 0) { - if (!is_max_jobs_ok(dcr)) { - return 0; - } return is_pool_ok(dcr); } else { Pmsg1(000, _("Logic error!!!! JobId=%u Should not get here.\n"), (int)jcr->JobId); @@ -1478,7 +1532,7 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx) Mmsg(jcr->errmsg, _("3911 JobId=%u failed reserve drive %s.\n"), jcr->JobId, dev->print_name()); queue_reserve_message(jcr); - Dmsg2(dbglvl, "jid=%u failed: No reserve %s\n", jcr->JobId, dev->print_name()); + Dmsg1(dbglvl, "failed: No reserve %s\n", dev->print_name()); return 0; }