]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/reserve.c
kes When applying a storage override, release all previous storage
[bacula/bacula] / bacula / src / stored / reserve.c
index c27bb08f7eaf5d861eaed23d647dbb2fdeadd617..797a85c263ca3114b0f166e8c8325589a1d020dd 100644 (file)
@@ -54,6 +54,7 @@ static bool reserve_device_for_read(DCR *dcr);
 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 "
@@ -573,8 +574,6 @@ static bool use_storage_cmd(JCR *jcr)
    int Copy, Stripe;
    DIRSTORE *store;
    RCTX rctx;
-   char *msg;
-   alist *msgs;
    alist *dirstore;
 
    memset(&rctx, 0, sizeof(RCTX));
@@ -584,7 +583,7 @@ static bool use_storage_cmd(JCR *jcr)
     *   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(), 
@@ -664,9 +663,7 @@ static bool use_storage_cmd(JCR *jcr)
 
       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;
@@ -784,26 +781,10 @@ static bool use_storage_cmd(JCR *jcr)
       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
@@ -814,27 +795,16 @@ void release_msgs(JCR *jcr)
  */
 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) {
-      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);
-         }
-      }
-   }
+   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;
 }
 
@@ -910,7 +880,7 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx)
             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;
@@ -955,6 +925,9 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx)
                break;
             }
          }
+         if (ok) {
+            break;
+         }
       } /* end for loop over reserved volumes */
 
       lock_volumes();
@@ -966,7 +939,7 @@ bool find_suitable_device_for_job(JCR *jcr, RCTX &rctx)
       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;
    }
@@ -1479,17 +1452,23 @@ static int can_reserve_drive(DCR *dcr, RCTX &rctx)
    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
@@ -1498,15 +1477,18 @@ static void queue_reserve_message(JCR *jcr)
    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();
 }
 
 /*
@@ -1518,7 +1500,7 @@ void send_drive_reserve_messages(JCR *jcr, void sendit(const char *msg, int len,
    alist *msgs;
    char *msg;
 
-   lock_reservations();
+   jcr->lock();
    msgs = jcr->reserve_msgs;
    if (!msgs || msgs->size() == 0) {
       goto bail_out;
@@ -1534,5 +1516,42 @@ void send_drive_reserve_messages(JCR *jcr, void sendit(const char *msg, int len,
    }
 
 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();
 }