]> git.sur5r.net Git - bacula/bacula/commitdiff
Attempt to fix bug #1128 InChanger flag cleared during Migration
authorKern Sibbald <kern@sibbald.com>
Tue, 26 Aug 2008 13:15:58 +0000 (13:15 +0000)
committerKern Sibbald <kern@sibbald.com>
Tue, 26 Aug 2008 13:15:58 +0000 (13:15 +0000)
     job when reading from one autochanger and writing to another.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@7509 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/patches/2.4.2-inchanger.patch [new file with mode: 0644]
bacula/src/cats/sql_update.c
bacula/src/dird/catreq.c
bacula/src/dird/dird.c
bacula/src/version.h
bacula/technotes-2.5

diff --git a/bacula/patches/2.4.2-inchanger.patch b/bacula/patches/2.4.2-inchanger.patch
new file mode 100644 (file)
index 0000000..5b3e566
--- /dev/null
@@ -0,0 +1,100 @@
+
+  Attempt to fix bug #1128 InChanger flag cleared during Migration
+  job when reading from one autochanger and writing to another.
+  Testing is needed.
+  Apply this patch to Bacula version 2.4.2 with:
+
+  cd <bacula-source>
+  patch -p0 <2.4.2-inchanger.patch
+  ./configure <your options>
+  make
+  ...
+  make install
+
+
+Index: src/dird/catreq.c
+===================================================================
+--- src/dird/catreq.c  (revision 7507)
++++ src/dird/catreq.c  (working copy)
+@@ -83,7 +83,7 @@
+    jcr->MediaId = mr->MediaId;
+    pm_strcpy(jcr->VolumeName, mr->VolumeName);
+    bash_spaces(mr->VolumeName);
+-   stat = bnet_fsend(sd, OK_media, mr->VolumeName, mr->VolJobs,
++   stat = sd->fsend(OK_media, mr->VolumeName, mr->VolJobs,
+       mr->VolFiles, mr->VolBlocks, edit_uint64(mr->VolBytes, ed1),
+       mr->VolMounts, mr->VolErrors, mr->VolWrites,
+       edit_uint64(mr->MaxVolBytes, ed2),
+@@ -266,11 +266,22 @@
+          }
+       }
+       Dmsg2(400, "Update media: BefVolJobs=%u After=%u\n", mr.VolJobs, sdmr.VolJobs);
++
+       /* Check if the volume has been written by the job, 
+        * and update the LastWritten field if needed */
+       if (mr.VolBlocks != sdmr.VolBlocks) {
+          mr.LastWritten = sdmr.LastWritten;
+       }
++
++      /*
++       * Update to point to the last device used to write the Volume.
++       *   However, do so only if we are writing the tape, i.e.
++       *   the number of VolWrites has increased.
++       */
++      if (jcr->wstore && jcr->wstore->StorageId && sdmr.VolWrites > mr.VolWrites) {
++         mr.StorageId = jcr->wstore->StorageId;
++      }
++
+       /* Copy updated values to original media record */
+       mr.VolJobs      = sdmr.VolJobs;
+       mr.VolFiles     = sdmr.VolFiles;
+@@ -285,14 +296,6 @@
+       mr.VolWriteTime = sdmr.VolWriteTime;
+       mr.VolParts     = sdmr.VolParts;
+       bstrncpy(mr.VolStatus, sdmr.VolStatus, sizeof(mr.VolStatus));
+-      /*
+-       * Update to point to the last device used to write the Volume.
+-       *   However, do so only if we are writing the tape, i.e.
+-       *   the number of VolBlocks has increased.
+-       */
+-      if (jcr->wstore && jcr->wstore->StorageId && mr.VolBlocks != sdmr.VolBlocks) {
+-         mr.StorageId = jcr->wstore->StorageId;
+-      }
+       Dmsg2(400, "db_update_media_record. Stat=%s Vol=%s\n", mr.VolStatus, mr.VolumeName);
+       /*
+Index: src/dird/dird.c
+===================================================================
+--- src/dird/dird.c    (revision 7507)
++++ src/dird/dird.c    (working copy)
+@@ -914,6 +914,7 @@
+          db_create_storage_record(NULL, db, &sr);
+          store->StorageId = sr.StorageId;   /* set storage Id */
+          if (!sr.created) {                 /* if not created, update it */
++            sr.AutoChanger = store->autochanger;
+             db_update_storage_record(NULL, db, &sr);
+          }
+Index: src/cats/sql_update.c
+===================================================================
+--- src/cats/sql_update.c      (revision 7507)
++++ src/cats/sql_update.c      (working copy)
+@@ -1,7 +1,7 @@
+ /*
+    Bacula® - The Network Backup Solution
+-   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
++   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+    The main author of Bacula is Kern Sibbald, with contributions from
+    many others, a complete list can be found in the file AUTHORS.
+@@ -445,7 +445,8 @@
+ db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
+ {
+    char ed1[50], ed2[50];
+-   if (mr->InChanger != 0 && mr->Slot != 0) {
++   if (mr->InChanger != 0 && mr->Slot != 0 && mr->StorageId != 0 &&
++       mr->MediaId != 0) {
+       Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
+            "Slot=%d AND StorageId=%s AND MediaId!=%s",
+             mr->Slot, 
index a729a2cc1c4010091cf4d76e3276360ef22628a3..530cec8539a88886e6792601686102b2c2015625 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -195,8 +195,8 @@ db_update_job_end_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, bool stats_enabled)
 
    if (stat && stats_enabled) {
       Mmsg(mdb->cmd,
-          "INSERT INTO JobStat (SELECT * FROM Job WHERE JobId=%s)",
-          edit_int64(jr->JobId, ed3));
+           "INSERT INTO JobStat (SELECT * FROM Job WHERE JobId=%s)",
+           edit_int64(jr->JobId, ed3));
       INSERT_DB(jcr, mdb, mdb->cmd); /* TODO: get a message ? */
    }
    db_unlock(mdb);
@@ -459,7 +459,8 @@ void
 db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
 {
    char ed1[50], ed2[50];
-   if (mr->InChanger != 0 && mr->Slot != 0) {
+   if (mr->InChanger != 0 && mr->Slot != 0 && mr->StorageId != 0 &&
+       mr->MediaId != 0) {
       Mmsg(mdb->cmd, "UPDATE Media SET InChanger=0 WHERE "
            "Slot=%d AND StorageId=%s AND MediaId!=%s",
             mr->Slot, 
index b406767fead0e8d7020e36f962af2dc9a30ba5e5..b1504fe86cadcc8f0c1464c4df6feb85a6edc184 100644 (file)
@@ -83,7 +83,7 @@ static int send_volume_info_to_storage_daemon(JCR *jcr, BSOCK *sd, MEDIA_DBR *mr
    jcr->MediaId = mr->MediaId;
    pm_strcpy(jcr->VolumeName, mr->VolumeName);
    bash_spaces(mr->VolumeName);
-   stat = bnet_fsend(sd, OK_media, mr->VolumeName, mr->VolJobs,
+   stat = sd->fsend(OK_media, mr->VolumeName, mr->VolJobs,
       mr->VolFiles, mr->VolBlocks, edit_uint64(mr->VolBytes, ed1),
       mr->VolMounts, mr->VolErrors, mr->VolWrites,
       edit_uint64(mr->MaxVolBytes, ed2),
@@ -267,6 +267,7 @@ void catalog_request(JCR *jcr, BSOCK *bs)
          }
       }
       Dmsg2(400, "Update media: BefVolJobs=%u After=%u\n", mr.VolJobs, sdmr.VolJobs);
+
       /*
        * Check if the volume has been written by the job, 
        * and update the LastWritten field if needed.
@@ -274,6 +275,16 @@ void catalog_request(JCR *jcr, BSOCK *bs)
       if (mr.VolBlocks != sdmr.VolBlocks && VolLastWritten != 0) {
          mr.LastWritten = VolLastWritten;
       }
+
+      /*
+       * Update to point to the last device used to write the Volume.
+       *   However, do so only if we are writing the tape, i.e.
+       *   the number of VolWrites has increased.
+       */
+      if (jcr->wstore && jcr->wstore->StorageId && sdmr.VolWrites > mr.VolWrites) {
+         mr.StorageId = jcr->wstore->StorageId;
+      }
+
       /* Copy updated values to original media record */
       mr.VolJobs      = sdmr.VolJobs;
       mr.VolFiles     = sdmr.VolFiles;
@@ -292,14 +303,6 @@ void catalog_request(JCR *jcr, BSOCK *bs)
       if (sdmr.VolWriteTime >= 0) {
          mr.VolWriteTime = sdmr.VolWriteTime;
       }
-      /*
-       * Update to point to the last device used to write the Volume.
-       *   However, do so only if we are writing the tape, i.e.
-       *   the number of VolBlocks has increased.
-       */
-      if (jcr->wstore && jcr->wstore->StorageId && mr.VolBlocks != sdmr.VolBlocks) {
-         mr.StorageId = jcr->wstore->StorageId;
-      }
 
       Dmsg2(400, "db_update_media_record. Stat=%s Vol=%s\n", mr.VolStatus, mr.VolumeName);
       /*
index 959d33466cb5d7a8e32c876beb1b93659a971af9..79c06d232445033f144b79f2bc66b3d3a346b2d2 100644 (file)
@@ -936,6 +936,7 @@ static bool check_catalog()
          db_create_storage_record(NULL, db, &sr);
          store->StorageId = sr.StorageId;   /* set storage Id */
          if (!sr.created) {                 /* if not created, update it */
+            sr.AutoChanger = store->autochanger;
             db_update_storage_record(NULL, db, &sr);
          }
 
index 8c26f18b7571e97b3cd862d639cc4f0a2a26563f..aa8a862a54df117db43d118cc37695232465285c 100644 (file)
@@ -4,8 +4,8 @@
 
 #undef  VERSION
 #define VERSION "2.5.3"
-#define BDATE   "21 Aug 2008"
-#define LSMDATE "21Aug08"
+#define BDATE   "26 Aug 2008"
+#define LSMDATE "26Aug08"
 
 #define PROG_COPYRIGHT "Copyright (C) %d-2008 Free Software Foundation Europe e.V.\n"
 #define BYEAR "2008"       /* year for copyright messages in progs */
index 5883c75d538c193a990620cae8f63f237ebcdb48..82ad9bc321bb9f3224d16b3be9b763e216efe127 100644 (file)
@@ -32,6 +32,10 @@ separator in console (!$%&'()*+,-/:;<>?[]^`{|}~)
 
 
 General:
+26Aug08
+kes  Attempt to fix bug #1128 InChanger flag cleared during Migration
+     job when reading from one autochanger and writing to another.
+kes  Minor tweaks (copyright dates convert to use method instead of bnet).
 21Aug08
 kes  Fix NULL Volume error when reading (or Migration or VBackup) must switch
      drives when no tape is mounted.