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);
/* Requests from the Director daemon */
static char use_storage[] = "use storage=%127s media_type=%127s "
int Copy, Stripe;
DIRSTORE *store;
RCTX rctx;
- char *msg;
- alist *msgs;
alist *dirstore;
memset(&rctx, 0, sizeof(RCTX));
* use_device for each device that it wants to use.
*/
dirstore = New(alist(10, not_owned_by_alist));
- msgs = jcr->reserve_msgs = New(alist(10, not_owned_by_alist));
+ jcr->reserve_msgs = New(alist(10, not_owned_by_alist));
do {
Dmsg2(dbglvl, "jid=%u <dird: %s", jid(), dir->msg);
ok = sscanf(dir->msg, use_storage, store_name.c_str(),
lock_reservations();
for ( ; !fail && !job_canceled(jcr); ) {
- while ((msg = (char *)msgs->pop())) {
- free(msg);
- }
+ pop_reserve_messages(jcr);
rctx.suitable_device = false;
rctx.have_volume = false;
rctx.VolumeName[0] = 0;
Dmsg2(dbglvl, "jid=%u >dird: %s", jid(), dir->msg);
}
- release_msgs(jcr);
+ release_reserve_messages(jcr);
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;
-
- return false;
+ AUTOCHANGER *changer = vol->dev->device->changer_res;
- Dmsg2(dbglvl, "jid=%u search changers for %s\n", (int)rctx.jcr->JobId,
- rctx.device_name);
- foreach_res(changer, R_AUTOCHANGER) {
- Dmsg3(dbglvl, "jid=%u Try match changer res=%s device=%s\n",
- (int)rctx.jcr->JobId, changer->hdr.name, rctx.device_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) {
- if (device->dev == vol->dev) {
- Dmsg2(dbglvl, "jid=%u Found changer device %s\n",
- (int)rctx.jcr->JobId, device->hdr.name);
- return true;
- }
- Dmsg2(dbglvl, "jid=%u Incorrect changer device %s\n",
- (int)rctx.jcr->JobId, device->hdr.name);
- }
- }
- }
+ /* 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;
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) {
- return;
+ goto bail_out;
}
}
/* 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();
+}
+
+/*
+ * Pop and release any reservations messages
+ */
+static void pop_reserve_messages(JCR *jcr)
+{
+ alist *msgs;
+ char *msg;
+
+ jcr->lock();
+ msgs = jcr->reserve_msgs;
+ if (!msgs) {
+ goto bail_out;
+ }
+ while ((msg = (char *)msgs->pop())) {
+ free(msg);
+ }
+bail_out:
+ jcr->unlock();
+}
+
+/*
+ * Also called from acquire.c
+ */
+void release_reserve_messages(JCR *jcr)
+{
+ pop_reserve_messages(jcr);
+ jcr->lock();
+ if (!jcr->reserve_msgs) {
+ goto bail_out;
+ }
+ delete jcr->reserve_msgs;
+ jcr->reserve_msgs = NULL;
+
+bail_out:
+ jcr->unlock();
}