return ok;
}
-void release_msgs(JCR *jcr)
-{
- alist *msgs = jcr->reserve_msgs;
- char *msg;
-
- if (!msgs) {
- return;
- }
- lock_reservations();
- while ((msg = (char *)msgs->pop())) {
- free(msg);
- }
- delete msgs;
- jcr->reserve_msgs = NULL;
- unlock_reservations();
-}
/*
* Walk through the autochanger resources and check if
*/
static bool is_vol_in_autochanger(RCTX &rctx, VOLRES *vol)
{
- AUTOCHANGER *changer;
- Dmsg2(dbglvl, "jid=%u search changers for %s\n", (int)rctx.jcr->JobId,
- rctx.device_name);
- foreach_res(changer, R_AUTOCHANGER) {
- Dmsg2(dbglvl, "jid=%u Try match changer res=%s\n",
- (int)rctx.jcr->JobId, changer->hdr.name);
- /* Find resource, and make sure we were able to open it */
- if (fnmatch(rctx.device_name, changer->hdr.name, 0) == 0) {
- DEVRES *device;
- /* Try each device in this AutoChanger */
- foreach_alist(device, changer->device) {
- Dmsg2(dbglvl, "jid=%u Try changer device %s\n",
- (int)rctx.jcr->JobId, device->hdr.name);
- if (device->dev == vol->dev) {
- Dmsg2(dbglvl, "jid=%u Found changer device %s\n",
- (int)rctx.jcr->JobId, device->hdr.name);
- return true;
- }
- }
- }
- }
+ AUTOCHANGER *changer = vol->dev->device->changer_res;
+
+ /* Find resource, and make sure we were able to open it */
+ if (fnmatch(rctx.device_name, changer->hdr.name, 0) == 0) {
+ Dmsg2(dbglvl, "jid=%u Found changer device %s\n",
+ (int)rctx.jcr->JobId, vol->dev->device->hdr.name);
+ return true;
+ }
+ Dmsg2(dbglvl, "jid=%u Incorrect changer device %s\n",
+ (int)rctx.jcr->JobId, changer->hdr.name);
return false;
}
continue;
}
- Dmsg2(dbglvl, "jid=%u vol=%s\n", (int)rctx.jcr->JobId, vol->vol_name);
+ Dmsg2(dbglvl, "jid=%u vol=%s OK for this job\n", (int)rctx.jcr->JobId, vol->vol_name);
foreach_alist(store, dirstore) {
int stat;
rctx.store = store;
rctx.device_name = device_name;
rctx.device = vol->dev->device;
- if (!vol->dev->is_autochanger()) {
+ if (vol->dev->is_autochanger()) {
+ Dmsg2(dbglvl, "jid=%u vol=%s is in changer\n", (int)rctx.jcr->JobId,
+ vol->vol_name);
if (!is_vol_in_autochanger(rctx, vol)) {
continue;
}
break;
}
}
+ if (ok) {
+ break;
+ }
} /* end for loop over reserved volumes */
lock_volumes();
unlock_volumes();
}
if (ok) {
- Dmsg2(dbglvl, "jid=%u got vol %s in reserved volums list\n", (int)rctx.jcr->JobId,
+ Dmsg2(dbglvl, "jid=%u got vol %s from in-use vols list\n", (int)rctx.jcr->JobId,
rctx.VolumeName);
return true;
}
return 0;
}
+
+
+
/*
- * search_lock is already set on entering this routine
+ * Queue a reservation error or failure message for this jcr
*/
static void queue_reserve_message(JCR *jcr)
{
int i;
- alist *msgs = jcr->reserve_msgs;
+ alist *msgs;
char *msg;
+ jcr->lock();
+
+ msgs = jcr->reserve_msgs;
if (!msgs) {
- return;
+ goto bail_out;
}
/*
* Look for duplicate message. If found, do
for (i=msgs->size()-1; i >= 0; i--) {
msg = (char *)msgs->get(i);
if (!msg) {
- return;
+ goto bail_out;
}
/* Comparison based on 4 digit message number */
if (strncmp(msg, jcr->errmsg, 4) == 0) {
}
/* Message unique, so insert it */
jcr->reserve_msgs->push(bstrdup(jcr->errmsg));
+
+bail_out:
+ jcr->unlock();
}
/*
alist *msgs;
char *msg;
- lock_reservations();
+ jcr->lock();
msgs = jcr->reserve_msgs;
if (!msgs || msgs->size() == 0) {
goto bail_out;
}
bail_out:
- unlock_reservations();
+ jcr->unlock();
+}
+
+void release_msgs(JCR *jcr)
+{
+ alist *msgs;
+ char *msg;
+
+ jcr->lock();
+ msgs = jcr->reserve_msgs;
+ if (!msgs) {
+ goto bail_out;
+ }
+ while ((msg = (char *)msgs->pop())) {
+ free(msg);
+ }
+ delete msgs;
+ jcr->reserve_msgs = NULL;
+
+bail_out:
+ jcr->unlock();
}