]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Break the do_swapping into do_unload, do_swapping, and
authorKern Sibbald <kern@sibbald.com>
Thu, 24 Jul 2008 15:26:41 +0000 (15:26 +0000)
committerKern Sibbald <kern@sibbald.com>
Thu, 24 Jul 2008 15:26:41 +0000 (15:26 +0000)
     do_load.  It is much more logical that way.
kes  Implement a set_dcr_from_vol subroutine in acquire.c for
     reading volumes. This allows the dcr to be refreshed after being
     zapped when the wrong volume is mounted.
     This should fix bug #1126 -- During multiple tape restore, bacula
     does not ask for physical tape change, but rereads same tape

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/branches/Branch-2.4@7432 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/stored/acquire.c
bacula/src/stored/dev.h
bacula/src/stored/mount.c
bacula/src/stored/read_record.c
bacula/src/version.h
bacula/technotes-2.4

index 494aaaeec985933ff00acb3354ccfb3b808d1665..f6ae3ca58ce5b46d47bb1ff5420401fbf7ef6c68 100644 (file)
@@ -20,7 +20,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Bacula® is a registered trademark of John Walker.
+   Bacula® is a registered trademark of Kern Sibbald.
    The licensor of Bacula is the Free Software Foundation Europe
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
@@ -38,6 +38,7 @@
 
 /* Forward referenced functions */
 static void attach_dcr_to_dev(DCR *dcr);
+static void set_dcr_from_vol(DCR *dcr, VOL_LIST *vol);
 
 
 /*********************************************************************
@@ -88,15 +89,9 @@ bool acquire_device_for_read(DCR *dcr)
          jcr->NumReadVolumes, jcr->CurReadVolume);
       goto get_out;                   /* should not happen */   
    }
-   /*    
-    * Note, if we want to be able to work from a .bsr file only          
-    *  for disaster recovery, we must "simulate" reading the catalog
-    */
-   bstrncpy(dcr->VolumeName, vol->VolumeName, sizeof(dcr->VolumeName));
-   bstrncpy(dcr->VolCatInfo.VolCatName, vol->VolumeName, sizeof(dcr->VolCatInfo.VolCatName));
-   bstrncpy(dcr->media_type, vol->MediaType, sizeof(dcr->media_type));
-   dcr->VolCatInfo.Slot = vol->Slot;
-   dcr->VolCatInfo.InChanger = vol->Slot > 0; 
+   set_dcr_from_vol(dcr, vol);
+
+   Dmsg2(100, "Want Vol=%s Slot=%d\n", vol->VolumeName, vol->Slot);
     
    /*
     * If the MediaType requested for this volume is not the
@@ -174,20 +169,12 @@ bool acquire_device_for_read(DCR *dcr)
 
    dev->clear_unload();
 
-   if (reserve_volume(dcr, dcr->VolumeName) == NULL) {
-      Dmsg2(100, "Could not reserve volume %s on %s\n", dcr->VolumeName,
-            dcr->dev->print_name());
-      Jmsg2(jcr, M_FATAL, 0, _("Could not reserve volume %s on %s\n"), dcr->VolumeName,
-            dcr->dev->print_name());
-      goto get_out;
-   }
    if (dev->vol && dev->vol->is_swapping()) {
       dev->vol->set_slot(vol->Slot);
       Dmsg3(100, "swapping: slot=%d Vol=%s dev=%s\n", dev->vol->get_slot(),
          dev->vol->vol_name, dev->print_name());
    }
 
-
    init_device_wait_timers(dcr);
 
    tape_previously_mounted = dev->can_read() || dev->can_append() ||
@@ -217,7 +204,10 @@ bool acquire_device_for_read(DCR *dcr)
          goto get_out;                /* error return */
       }
 
-      dcr->do_swapping(false/*is_writing*/);
+      dcr->do_unload();
+      dcr->do_swapping(false/*!is_writing*/);
+      dcr->do_load(false /*!is_writing*/);
+      set_dcr_from_vol(dcr, vol);          /* refresh dcr with desired volume info */
 
       /*
        * This code ensures that the device is ready for
@@ -239,10 +229,12 @@ bool acquire_device_for_read(DCR *dcr)
       vol_label_status = read_dev_volume_label(dcr);
       switch (vol_label_status) {
       case VOL_OK:
+         Dmsg0(50, "Got correct volume.\n");
          ok = true;
          dev->VolCatInfo = dcr->VolCatInfo;     /* structure assignment */
          break;                    /* got it */
       case VOL_IO_ERROR:
+         Dmsg0(50, "IO Error\n");
          /*
           * Send error message generated by read_dev_volume_label()
           *  only we really had a tape mounted. This supresses superfluous
@@ -253,13 +245,10 @@ bool acquire_device_for_read(DCR *dcr)
          }
          goto default_path;
       case VOL_NAME_ERROR:
+         Dmsg0(50, "Vol name error.\n");
          if (dev->is_volume_to_unload()) {
             goto default_path;
          }
-//       if (tape_initially_mounted) {
-            tape_initially_mounted = false;
-//          goto default_path;
-//       }
          dev->set_unload();              /* force unload of unwanted tape */
          if (!unload_autochanger(dcr, -1)) {
             /* at least free the device so we can re-open with correct volume */
@@ -270,6 +259,7 @@ bool acquire_device_for_read(DCR *dcr)
       default:
          Jmsg1(jcr, M_WARNING, 0, "%s", jcr->errmsg);
 default_path:
+         Dmsg0(50, "default path\n");
          tape_previously_mounted = true;
          
          /*
@@ -289,15 +279,6 @@ default_path:
                try_autochanger = false;
                continue;              /* try reading volume mounted */
             }
-            /* Try closing and re-opening */
-            dev->close();
-            if (dev->open(dcr, OPEN_READ_ONLY) >= 0) {
-               continue;
-            }
-            if (!dev->poll) {
-               Jmsg3(jcr, M_WARNING, 0, _("Read open device %s Volume \"%s\" failed: ERR=%s\n"),
-                     dev->print_name(), dcr->VolumeName, dev->bstrerror());
-            }
          }
          
          /* Mount a specific volume and no other */
@@ -305,7 +286,7 @@ default_path:
          if (!dir_ask_sysop_to_mount_volume(dcr, ST_READ)) {
             goto get_out;             /* error return */
          }
-         try_autochanger = true;      /* permit using autochanger again */
+         try_autochanger = true;      /* permit trying the autochanger again */
          continue;                    /* try reading again */
       } /* end switch */
       break;
@@ -693,3 +674,16 @@ void free_dcr(DCR *dcr)
    }
    free(dcr);
 }
+
+static void set_dcr_from_vol(DCR *dcr, VOL_LIST *vol)
+{
+   /*    
+    * Note, if we want to be able to work from a .bsr file only          
+    *  for disaster recovery, we must "simulate" reading the catalog
+    */
+   bstrncpy(dcr->VolumeName, vol->VolumeName, sizeof(dcr->VolumeName));
+   bstrncpy(dcr->VolCatInfo.VolCatName, vol->VolumeName, sizeof(dcr->VolCatInfo.VolCatName));
+   bstrncpy(dcr->media_type, vol->MediaType, sizeof(dcr->media_type));
+   dcr->VolCatInfo.Slot = vol->Slot;
+   dcr->VolCatInfo.InChanger = vol->Slot > 0; 
+}
index ca2968fddbfa49e95b6a482b2b7d3eae40be7ddd..c2e860b417610ab054ea95725e9a82830fb3228c 100644 (file)
@@ -542,6 +542,8 @@ public:
    int check_volume_label(bool &ask, bool &autochanger);
    void release_volume();
    void do_swapping(bool is_writing);
+   bool do_unload();
+   bool do_load(bool is_writing);
    bool is_tape_position_ok();
 };
 
index 7f229c27903268ea8675e0e8e9d5c7a7330a38d9..efb76029d654fc00e9150ee54c23ea5754589972 100644 (file)
@@ -20,7 +20,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Bacula® is a registered trademark of John Walker.
+   Bacula® is a registered trademark of Kern Sibbald.
    The licensor of Bacula is the Free Software Foundation Europe
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
@@ -113,7 +113,9 @@ mount_next_vol:
       ask = true;                     /* ask operator to mount tape */
       do_find = true;                 /* re-find a volume after unload */
    }
-   do_swapping(true /*writing*/);
+   do_unload();
+   do_swapping(true /*is_writing*/);
+   do_load(true /*is_writing*/);
 
    if (do_find && !find_a_volume()) {
       goto no_lock_bail_out;
@@ -500,12 +502,30 @@ bool DCR::is_suitable_volume_mounted()
    return dir_get_volume_info(this, GET_VOL_INFO_FOR_WRITE);
 }
 
-void DCR::do_swapping(bool is_writing)
+bool DCR::do_unload()
 {
    if (dev->must_unload()) {
       Dmsg1(100, "must_unload release %s\n", dev->print_name());
       release_volume();
    }
+   return false;
+}
+
+bool DCR::do_load(bool is_writing)
+{
+   if (dev->must_load()) {
+      Dmsg1(100, "Must load %s\n", dev->print_name());
+      if (autoload_device(this, is_writing, NULL) > 0) {
+         dev->clear_load();
+         return true;
+      }
+      return false;
+   }
+   return true;
+}
+
+void DCR::do_swapping(bool is_writing)
+{
    /*
     * See if we are asked to swap the Volume from another device
     *  if so, unload the other device here, and attach the
@@ -522,17 +542,12 @@ void DCR::do_swapping(bool is_writing)
       }
       if (dev->vol) {
          dev->vol->clear_swapping();
+         Dmsg1(100, "=== set in_use vol=%s\n", dev->vol->vol_name);
          dev->vol->set_in_use();
          dev->VolHdr.VolumeName[0] = 0;  /* don't yet have right Volume */
       }
       dev->swap_dev = NULL;
    }
-   if (dev->must_load()) {
-      Dmsg1(100, "Must load %s\n", dev->print_name());
-      if (autoload_device(this, is_writing, NULL) > 0) {
-         dev->clear_load();
-      }
-   }
 }
 
 
index ab9d0e60a1116cb4d0b34b5c8102d92b895449b5..acb793f7580aac1b8996c6869430ea524787e6f6 100644 (file)
@@ -20,7 +20,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Bacula® is a registered trademark of John Walker.
+   Bacula® is a registered trademark of Kern Sibbald.
    The licensor of Bacula is the Free Software Foundation Europe
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
@@ -52,7 +52,7 @@ static bool try_repositioning(JCR *jcr, DEV_RECORD *rec, DCR *dcr);
 static char *rec_state_to_str(DEV_RECORD *rec);
 #endif
 
-static const int dbglvl = 1000;
+static const int dbglvl = 500;
 
 bool read_records(DCR *dcr,
        bool record_cb(DCR *dcr, DEV_RECORD *rec),
index 968144bd2348395b03e2dcea249dbf83726a1285..8e6d38ccfa2a0c3ce6540316a12b090e0647bcae 100644 (file)
@@ -4,8 +4,8 @@
 
 #undef  VERSION
 #define VERSION "2.4.2"
-#define BDATE   "22 July 2008"
-#define LSMDATE "22Jul08"
+#define BDATE   "24 July 2008"
+#define LSMDATE "24Jul08"
 
 #define PROG_COPYRIGHT "Copyright (C) %d-2008 Free Software Foundation Europe e.V.\n"
 #define BYEAR "2008"       /* year for copyright messages in progs */
@@ -32,7 +32,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Bacula® is a registered trademark of John Walker.
+   Bacula® is a registered trademark of Kern Sibbald.
    The licensor of Bacula is the Free Software Foundation Europe
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
index 7b44c28d13e942b40a32fe607d6089ca08996896..30950b544603ac26496c8f20a5e2634b884bbcd5 100644 (file)
@@ -2,6 +2,14 @@
 
 General:
 Release Version 2.4.2
+24Jul08
+kes  Break the do_swapping into do_unload, do_swapping, and
+     do_load.  It is much more logical that way.
+kes  Implement a set_dcr_from_vol subroutine in acquire.c for
+     reading volumes. This allows the dcr to be refreshed after being
+     zapped when the wrong volume is mounted.
+     This should fix bug #1126 -- During multiple tape restore, bacula
+     does not ask for physical tape change, but rereads same tape
 23Jul08
 kes  Apply patch submitted for bug #1107 with a small modification.
      This fixes a bug where bcopy copied too many records.