/*
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.
int reservations_lock_count = 0;
/* This applies to a drive and to Volumes */
-void _lock_reservations()
+void _lock_reservations(const char *file, int line)
{
int errstat;
reservations_lock_count++;
- if ((errstat=rwl_writelock(&reservation_lock)) != 0) {
+ if ((errstat=rwl_writelock_p(&reservation_lock, file, line)) != 0) {
berrno be;
Emsg2(M_ABORT, 0, "rwl_writelock failure. stat=%d: ERR=%s\n",
errstat, be.bstrerror(errstat));
*/
void DCR::unreserve_device()
{
+ dev->dlock();
lock_volumes();
if (is_reserved()) {
clear_reserved();
}
}
unlock_volumes();
+ dev->dunlock();
}
/*
*/
unbash_spaces(dir->msg);
pm_strcpy(jcr->errmsg, dir->msg);
- Jmsg(jcr, M_INFO, 0, _("Failed command: %s\n"), jcr->errmsg);
- Jmsg(jcr, M_FATAL, 0, _("\n"
- " Device \"%s\" with MediaType \"%s\" requested by DIR not found in SD Device resources.\n"),
- dev_name.c_str(), media_type.c_str());
+ Jmsg(jcr, M_FATAL, 0, _("Device reservation failed for JobId=%d: %s\n"),
+ jcr->JobId, jcr->errmsg);
dir->fsend(NO_device, dev_name.c_str());
Dmsg1(dbglvl, ">dird: %s", dir->msg);
rctx.suitable_device = true;
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 (rctx.store->append) {
+ dcr = new_dcr(rctx.jcr, rctx.jcr->dcr, rctx.device->dev);
+ } else {
+ dcr = new_dcr(rctx.jcr, rctx.jcr->read_dcr, rctx.device->dev);
+ }
if (!dcr) {
BSOCK *dir = rctx.jcr->dir_bsock;
dir->fsend(_("3926 Could not get dcr for device: %s\n"), rctx.device_name);
bool ok = false;
ASSERT(dcr);
+ if (job_canceled(jcr)) {
+ return false;
+ }
dev->dlock();
- if (is_device_unmounted(dev)) {
+ if (dev->is_device_unmounted()) {
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());
bool ok = false;
ASSERT(dcr);
+ if (job_canceled(jcr)) {
+ return false;
+ }
dev->dlock();
if (dev->can_read()) {
Mmsg(jcr->errmsg, _("3603 JobId=%u device %s is busy reading.\n"),
jcr->JobId, dev->print_name());
- Dmsg1(dbglvl, "%s", jcr->errmsg);
+ Dmsg1(dbglvl, "Failed: %s", jcr->errmsg);
queue_reserve_message(jcr);
goto bail_out;
}
/* If device is unmounted, we are out of luck */
- if (is_device_unmounted(dev)) {
+ if (dev->is_device_unmounted()) {
Mmsg(jcr->errmsg, _("3604 JobId=%u device %s is BLOCKED due to user unmount.\n"),
jcr->JobId, dev->print_name());
- Dmsg1(dbglvl, "%s", jcr->errmsg);
+ Dmsg1(dbglvl, "Failed: %s", jcr->errmsg);
queue_reserve_message(jcr);
goto bail_out;
}
"3608 JobId=%u wants Pool=\"%s\" but have Pool=\"%s\" nreserve=%d on drive %s.\n"),
(uint32_t)jcr->JobId, dcr->pool_name, dev->pool_name,
dev->num_reserved(), dev->print_name());
+ Dmsg1(dbglvl, "Failed: %s", jcr->errmsg);
queue_reserve_message(jcr);
- Dmsg2(dbglvl, "failed: busy num_writers=0, reserved, pool=%s wanted=%s\n",
- dev->pool_name, dcr->pool_name);
}
return 0;
}
dcr->VolCatInfo.VolCatJobs, dev->num_reserved(),
dcr->VolCatInfo.VolCatStatus,
dcr->VolumeName);
+ /* Limit max concurrent jobs on this drive */
+ if (dev->max_concurrent_jobs > 0 && dev->max_concurrent_jobs <=
+ (uint32_t)(dev->num_writers + dev->num_reserved())) {
+ /* Max Concurrent Jobs depassed or already reserved */
+ Mmsg(jcr->errmsg, _("3609 JobId=%u Max concurrent jobs exceeded on drive %s.\n"),
+ (uint32_t)jcr->JobId, dev->print_name());
+ Dmsg1(dbglvl, "Failed: %s", jcr->errmsg);
+ queue_reserve_message(jcr);
+ return false;
+ }
if (strcmp(dcr->VolCatInfo.VolCatStatus, "Recycle") == 0) {
return true;
}
/* Max Job Vols depassed or already reserved */
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);
Dmsg1(dbglvl, "reserve dev failed: %s", jcr->errmsg);
+ queue_reserve_message(jcr);
return false; /* wait */
}
return true;
} else {
Dmsg1(dbglvl, "not low use num_writers=%d\n", dev->num_writers+dev->num_reserved());
}
- 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());
+ Dmsg1(dbglvl, "Failed: %s", jcr->errmsg);
queue_reserve_message(jcr);
return 0;
}
if (rctx.PreferMountedVols && !dev->vol && dev->is_tape()) {
Mmsg(jcr->errmsg, _("3606 JobId=%u prefers mounted drives, but drive %s has no Volume.\n"),
jcr->JobId, dev->print_name());
+ Dmsg1(dbglvl, "Failed: %s", jcr->errmsg);
queue_reserve_message(jcr);
- Dmsg0(dbglvl, "failed: want mounted -- no vol\n");
return 0; /* No volume mounted */
}
Mmsg(jcr->errmsg, _("3911 JobId=%u failed reserve drive %s.\n"),
jcr->JobId, dev->print_name());
queue_reserve_message(jcr);
- Dmsg1(dbglvl, "failed: No reserve %s\n", dev->print_name());
+ Dmsg1(dbglvl, "Failed: No reserve %s\n", dev->print_name());
return 0;
}