From 26a993b7e42628d20ba263dfa760ee1a5761a8f7 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Fri, 15 Feb 2008 08:33:57 +0000 Subject: [PATCH] kes Fix creating first JobMedia record during Migration to include proper index. This caused slow restores of migrated jobs. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/branches/Branch-2.2@6421 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/patches/2.2.8-jobmedia.patch | 149 ++++++++++++++++++++++++++++ bacula/src/stored/device.c | 40 +++----- bacula/src/stored/mac.c | 19 ++-- bacula/src/stored/protos.h | 1 + bacula/technotes-2.1 | 3 + 5 files changed, 179 insertions(+), 33 deletions(-) create mode 100644 bacula/patches/2.2.8-jobmedia.patch diff --git a/bacula/patches/2.2.8-jobmedia.patch b/bacula/patches/2.2.8-jobmedia.patch new file mode 100644 index 0000000000..497c9c7dba --- /dev/null +++ b/bacula/patches/2.2.8-jobmedia.patch @@ -0,0 +1,149 @@ + + This patch fixes a migration bug that always has a zero index entry + (JobMedia record) as the first entry. This causes Bacula to search + for the first record during a restore rather than seek directly to + it. + + Apply this patch to Bacula 2.2.8 (and possibly any prior 2.2.x version) with: + + cd + patch -p0 <2.2.8-jobmedia.patch + ./configure + make + ... + make install + + +Index: src/stored/device.c +=================================================================== +--- src/stored/device.c (revision 6391) ++++ src/stored/device.c (working copy) +@@ -1,7 +1,7 @@ + /* + Bacula® - The Network Backup Solution + +- Copyright (C) 2000-2008 Free Software Foundation Europe e.V. ++ Copyright (C) 2000-2007 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. +@@ -200,6 +200,19 @@ + return ok; /* device locked */ + } + ++void set_start_vol_position(DCR *dcr) ++{ ++ DEVICE *dev = dcr->dev; ++ /* Set new start position */ ++ if (dev->is_tape()) { ++ dcr->StartBlock = dev->block_num; ++ dcr->StartFile = dev->file; ++ } else { ++ dcr->StartBlock = (uint32_t)dev->file_addr; ++ dcr->StartFile = (uint32_t)(dev->file_addr >> 32); ++ } ++} ++ + /* + * We have a new Volume mounted, so reset the Volume parameters + * concerning this job. The global changes were made earlier +@@ -208,24 +221,11 @@ + void set_new_volume_parameters(DCR *dcr) + { + JCR *jcr = dcr->jcr; +- DEVICE *dev = dcr->dev; + if (dcr->NewVol && !dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE)) { + Jmsg1(jcr, M_ERROR, 0, "%s", jcr->errmsg); + } +- /* Set new start/end positions */ +- if (dev->is_tape()) { +- dcr->StartBlock = dev->block_num; +- dcr->StartFile = dev->file; +- } else { +- dcr->StartBlock = (uint32_t)dev->file_addr; +- dcr->StartFile = (uint32_t)(dev->file_addr >> 32); +- } +- /* Reset indicies */ +- dcr->VolFirstIndex = 0; +- dcr->VolLastIndex = 0; ++ set_new_file_parameters(dcr); + jcr->NumWriteVolumes++; +- dcr->NewVol = false; +- dcr->WroteVol = false; + } + + /* +@@ -235,16 +235,8 @@ + */ + void set_new_file_parameters(DCR *dcr) + { +- DEVICE *dev = dcr->dev; ++ set_start_vol_position(dcr); + +- /* Set new start/end positions */ +- if (dev->is_tape()) { +- dcr->StartBlock = dev->block_num; +- dcr->StartFile = dev->file; +- } else { +- dcr->StartBlock = (uint32_t)dev->file_addr; +- dcr->StartFile = (uint32_t)(dev->file_addr >> 32); +- } + /* Reset indicies */ + dcr->VolFirstIndex = 0; + dcr->VolLastIndex = 0; +Index: src/stored/mac.c +=================================================================== +--- src/stored/mac.c (revision 6391) ++++ src/stored/mac.c (working copy) +@@ -1,15 +1,7 @@ + /* +- * SD -- mac.c -- responsible for doing +- * migration, archive, and copy jobs. +- * +- * Kern Sibbald, January MMVI +- * +- * Version $Id$ +- */ +-/* + Bacula® - The Network Backup Solution + +- Copyright (C) 2006-2006 Free Software Foundation Europe e.V. ++ Copyright (C) 2006-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. +@@ -33,6 +25,14 @@ + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. + */ ++/* ++ * SD -- mac.c -- responsible for doing ++ * migration, archive, and copy jobs. ++ * ++ * Kern Sibbald, January MMVI ++ * ++ * Version $Id$ ++ */ + + #include "bacula.h" + #include "stored.h" +@@ -108,6 +108,7 @@ + + jcr->dcr->VolFirstIndex = jcr->dcr->VolLastIndex = 0; + jcr->run_time = time(NULL); ++ set_start_vol_position(jcr->dcr); + + ok = read_records(jcr->read_dcr, record_cb, mount_next_read_volume); + goto ok_out; +Index: src/stored/protos.h +=================================================================== +--- src/stored/protos.h (revision 6391) ++++ src/stored/protos.h (working copy) +@@ -126,6 +126,7 @@ + bool open_device(DCR *dcr); + bool first_open_device(DCR *dcr); + bool fixup_device_block_write_error(DCR *dcr); ++void set_start_vol_position(DCR *dcr); + void set_new_volume_parameters(DCR *dcr); + void set_new_file_parameters(DCR *dcr); + bool is_device_unmounted(DEVICE *dev); diff --git a/bacula/src/stored/device.c b/bacula/src/stored/device.c index 7e8656974f..b38b512d0b 100644 --- a/bacula/src/stored/device.c +++ b/bacula/src/stored/device.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2008 Free Software Foundation Europe e.V. + Copyright (C) 2000-2007 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. @@ -200,6 +200,19 @@ bail_out: return ok; /* device locked */ } +void set_start_vol_position(DCR *dcr) +{ + DEVICE *dev = dcr->dev; + /* Set new start position */ + if (dev->is_tape()) { + dcr->StartBlock = dev->block_num; + dcr->StartFile = dev->file; + } else { + dcr->StartBlock = (uint32_t)dev->file_addr; + dcr->StartFile = (uint32_t)(dev->file_addr >> 32); + } +} + /* * We have a new Volume mounted, so reset the Volume parameters * concerning this job. The global changes were made earlier @@ -208,24 +221,11 @@ bail_out: void set_new_volume_parameters(DCR *dcr) { JCR *jcr = dcr->jcr; - DEVICE *dev = dcr->dev; if (dcr->NewVol && !dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE)) { Jmsg1(jcr, M_ERROR, 0, "%s", jcr->errmsg); } - /* Set new start/end positions */ - if (dev->is_tape()) { - dcr->StartBlock = dev->block_num; - dcr->StartFile = dev->file; - } else { - dcr->StartBlock = (uint32_t)dev->file_addr; - dcr->StartFile = (uint32_t)(dev->file_addr >> 32); - } - /* Reset indicies */ - dcr->VolFirstIndex = 0; - dcr->VolLastIndex = 0; + set_new_file_parameters(dcr); jcr->NumWriteVolumes++; - dcr->NewVol = false; - dcr->WroteVol = false; } /* @@ -235,16 +235,8 @@ void set_new_volume_parameters(DCR *dcr) */ void set_new_file_parameters(DCR *dcr) { - DEVICE *dev = dcr->dev; + set_start_vol_position(dcr); - /* Set new start/end positions */ - if (dev->is_tape()) { - dcr->StartBlock = dev->block_num; - dcr->StartFile = dev->file; - } else { - dcr->StartBlock = (uint32_t)dev->file_addr; - dcr->StartFile = (uint32_t)(dev->file_addr >> 32); - } /* Reset indicies */ dcr->VolFirstIndex = 0; dcr->VolLastIndex = 0; diff --git a/bacula/src/stored/mac.c b/bacula/src/stored/mac.c index 11528ad84c..59e4c1ff61 100644 --- a/bacula/src/stored/mac.c +++ b/bacula/src/stored/mac.c @@ -1,15 +1,7 @@ -/* - * SD -- mac.c -- responsible for doing - * migration, archive, and copy jobs. - * - * Kern Sibbald, January MMVI - * - * Version $Id$ - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2006-2006 Free Software Foundation Europe e.V. + Copyright (C) 2006-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. @@ -33,6 +25,14 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * SD -- mac.c -- responsible for doing + * migration, archive, and copy jobs. + * + * Kern Sibbald, January MMVI + * + * Version $Id$ + */ #include "bacula.h" #include "stored.h" @@ -108,6 +108,7 @@ bool do_mac(JCR *jcr) jcr->dcr->VolFirstIndex = jcr->dcr->VolLastIndex = 0; jcr->run_time = time(NULL); + set_start_vol_position(jcr->dcr); ok = read_records(jcr->read_dcr, record_cb, mount_next_read_volume); goto ok_out; diff --git a/bacula/src/stored/protos.h b/bacula/src/stored/protos.h index 0a673d0141..7d1b75a3e2 100644 --- a/bacula/src/stored/protos.h +++ b/bacula/src/stored/protos.h @@ -126,6 +126,7 @@ void dvd_remove_empty_part(DCR *dcr); bool open_device(DCR *dcr); bool first_open_device(DCR *dcr); bool fixup_device_block_write_error(DCR *dcr); +void set_start_vol_position(DCR *dcr); void set_new_volume_parameters(DCR *dcr); void set_new_file_parameters(DCR *dcr); bool is_device_unmounted(DEVICE *dev); diff --git a/bacula/technotes-2.1 b/bacula/technotes-2.1 index cc75afd623..13b794b104 100644 --- a/bacula/technotes-2.1 +++ b/bacula/technotes-2.1 @@ -1,6 +1,9 @@ Technical notes on version 2.2 General: +14Feb08 +kes Fix creating first JobMedia record during Migration to include + proper index. This caused slow restores of migrated jobs. 10Feb08 kes Fix bug #1047, which had a heap overrun when stripping certain paths, and do not strip paths on symbolic links. -- 2.39.5