Hello, Does this problem seem to be fixed in the latest beta releases from your point of view?
Thanks, Kern On Wednesday 09 April 2008 03:40:17 Peter Much wrote: > <[EMAIL PROTECTED]> aka Peter Much schrieb > > mit Datum Tue, 26 Feb 2008 17:01:36 GMT in m2n.bacula.devel: > |Abstract: > |--------- > |Migration jobs may update table media.storage attribute of source > |volume with value of target volume. > | > | > |Impact: > |------- > |Any subsequent restore from that source volume may fail due to media > |mismatch. > |The reason why this went undetected seems to be that usually > |migration is used to empty the source volume, so there will be no > |more restores from it. > | > | > |Comment: > |-------- > |I am not very happy with that fix. It lacks transparency and does > |not follow an object-oriented approach. > |I have also not checked the various implications and relations of > |the involved variables under any configuration beyond the one I am > |using. In short: it just fixes my problem. > | > | > |Patch: > |------ > |--- src/dird/catreq.c.orig Fri Oct 26 19:19:39 2007 > |+++ src/dird/catreq.c Sun Feb 10 04:28:54 2008 > |@@ -271,6 +271,13 @@ > | if (mr.VolBlocks != sdmr.VolBlocks) { > | mr.LastWritten = sdmr.LastWritten; > | } > |+ if (jcr->wstore && jcr->wstore->StorageId) { > |+ /* On migrate check if volume has been written, otherwise > |+ * the read volume would also (wrongly) updated */ > |+ if (jcr->JobType != JT_MIGRATE || mr.VolBlocks != > | sdmr.VolBlocks) { + mr.StorageId = jcr->wstore->StorageId; > |+ } > |+ } > | /* Copy updated values to original media record */ > | mr.VolJobs = sdmr.VolJobs; > | mr.VolFiles = sdmr.VolFiles; > |@@ -285,9 +292,6 @@ > | mr.VolWriteTime = sdmr.VolWriteTime; > | mr.VolParts = sdmr.VolParts; > | bstrncpy(mr.VolStatus, sdmr.VolStatus, sizeof(mr.VolStatus)); > |- if (jcr->wstore && jcr->wstore->StorageId) { > |- mr.StorageId = jcr->wstore->StorageId; > |- } > | > | Dmsg2(400, "db_update_media_record. Stat=%s Vol=%s\n", > |mr.VolStatus, mr.VolumeName); > | /* > > Dear all, > > I have an extension proposal to that referenced Patch, respectively > the updated version that makes it into 2.2.9. > > A really funny race has happened to me. Funny, because it is > complicated, but it seems understandable and logical. It fascinated > me. > > We have said that during a migration the jobmedia record of the > /read/ Media in the Catalog might be updated, and then might use > the storage_id value of the /write/ Media. > So now we block these updates, /if/ the used length (NumBlocks) > of the respective Media has /not changed/ (because then it is > likely the read Media). > > Now there is one case where the used length of the read Media > will change. That is, when the read Media is written at nearly > the same time by another job! > Unlikely as it may be, this actually happened to me - the following > way: > A Migrate reads a job that stretches over two Volumes. At the time > when the Migrate wants to mount the next Volume, this next Volume > is currently written by another job. So the Migrate has to wait > for it. At that time the Migrate seems to have already fetched > the Volume data from the Catalog! Now when the write completes, > that will update the Catalog. And when the Migrate finally completes > it will write back the -now oldfashioned and wrong- data - and > because now the Size differs, this will not be catched with the new > patch. > At next occasion we then get a size mismatch. > > This can only happen with autochangers, and it can only happen > with disk volumes - because for tape volumes it is already catched > in catreq.c - these have a count of VolFiles, which Disk Volumes > seem not to have. > Therefore I might suggest to catch it also for disk volumes. > Patch based on 2.2.9-p3 > > --- src/dird/catreq.c.orig 2008-03-22 10:34:20.000000000 +0100 > +++ src/dird/catreq.c 2008-04-09 02:01:07.000000000 +0200 > @@ -255,7 +255,7 @@ > /* > * Insanity check for VolFiles get set to a smaller value > */ > - if (sdmr.VolFiles < mr.VolFiles) { > + if (sdmr.VolFiles < mr.VolFiles || sdmr.VolBlocks < mr.VolBlocks) > { Jmsg(jcr, M_FATAL, 0, _("Volume Files at %u being set to %u" " for Volume > \"%s\". This is incorrect.\n"), > mr.VolFiles, sdmr.VolFiles, mr.VolumeName); > > ------------------------------------------------------------------------- > This SF.net email is sponsored by the 2008 JavaOne(SM) Conference > Don't miss this year's exciting event. There's still time to save $100. > Use priority code J8TL2D2. > http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/java >one _______________________________________________ > Bacula-devel mailing list > Bacula-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/bacula-devel ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ Bacula-devel mailing list Bacula-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bacula-devel