]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/next_vol.c
Fix typo
[bacula/bacula] / bacula / src / dird / next_vol.c
index 65a9a3bfa8854b2fd8ec7a3707e58001ba0953b1..1f00693d0d09eb4718cc5f76874fa0ac4522d84c 100644 (file)
  */
 int find_next_volume_for_append(JCR *jcr, MEDIA_DBR *mr, int create)
 {
-   int ok, retry = 0;
+   int retry = 0;
+   bool ok;
+   bool InChanger;
 
    mr->PoolId = jcr->PoolId;
    bstrncpy(mr->MediaType, jcr->store->media_type, sizeof(mr->MediaType));
    Dmsg2(120, "CatReq FindMedia: Id=%d, MediaType=%s\n", mr->PoolId, mr->MediaType);
+   /*
+    * If we are using an Autochanger, restrict Volume 
+    *  search to the Autochanger on the first pass 
+    */
+   InChanger = jcr->store->autochanger;
    /*
     * Find the Next Volume for Append
     */
    db_lock(jcr->db);
    for ( ;; ) {
       bstrncpy(mr->VolStatus, "Append", sizeof(mr->VolStatus));  /* want only appendable volumes */
-      ok = db_find_next_volume(jcr, jcr->db, 1, mr);  
+      /*
+       *  1. Look for volume with "Append" status.
+       */
+      ok = db_find_next_volume(jcr, jcr->db, 1, InChanger, mr);  
       Dmsg2(100, "catreq after find_next_vol ok=%d FW=%d\n", ok, mr->FirstWritten);
       if (!ok) {
-        /* Well, try finding recycled volumes */
-        ok = find_recycled_volume(jcr, mr);
+        /*
+         * 2. Try finding a recycled volume
+         */
+        ok = find_recycled_volume(jcr, InChanger, mr);
          Dmsg2(100, "find_recycled_volume %d FW=%d\n", ok, mr->FirstWritten);
         if (!ok) {
+           /*
+            * 3. Try pruning Volumes
+            */
            prune_volumes(jcr);  
-           ok = recycle_oldest_purged_volume(jcr, mr);
+           ok = recycle_oldest_purged_volume(jcr, InChanger, mr);
+           if (InChanger) {
+              InChanger = false;
+              if (!ok) {
+                 continue;           /* retry again accepting any volume */
+              }
+           }
             Dmsg2(200, "find_recycled_volume2 %d FW=%d\n", ok, mr->FirstWritten);
            if (!ok && create) {
-              /* See if we can create a new Volume */
+              /*
+                * 4. Try "creating" a new Volume
+               */
               ok = newVolume(jcr, mr);
            }
         }
 
+        /* 
+         *  Look at more drastic ways to find an Appendable Volume
+         */ 
         if (!ok && (jcr->pool->purge_oldest_volume ||
                     jcr->pool->recycle_oldest_volume)) {
             Dmsg2(200, "No next volume found. PurgeOldest=%d\n RecyleOldest=%d",
                jcr->pool->purge_oldest_volume, jcr->pool->recycle_oldest_volume);
            /* Find oldest volume to recycle */
-           ok = db_find_next_volume(jcr, jcr->db, -1, mr);
+           ok = db_find_next_volume(jcr, jcr->db, -1, InChanger, mr);
             Dmsg1(400, "Find oldest=%d\n", ok);
            if (ok) {
               UAContext *ua;
                Dmsg0(400, "Try purge.\n");
-              /* Try to purge oldest volume */
+              /* 
+               * 5.  Try to purging oldest volume only if not UA calling us.
+               */
               ua = new_ua_context(jcr);
-              if (jcr->pool->purge_oldest_volume) {
+              if (jcr->pool->purge_oldest_volume && create) {
                   Jmsg(jcr, M_INFO, 0, _("Purging oldest volume \"%s\"\n"), mr->VolumeName);
                  ok = purge_jobs_from_volume(ua, mr);
-              } else {
+              /*
+               * 5. or try recycling the oldest volume
+               */
+              } else if (jcr->pool->recycle_oldest_volume) {
                   Jmsg(jcr, M_INFO, 0, _("Pruning oldest volume \"%s\"\n"), mr->VolumeName);
                  ok = prune_volume(ua, mr);
               }