]> git.sur5r.net Git - bacula/bacula/commitdiff
Commit maxdiff patch
authorKern Sibbald <kern@sibbald.com>
Thu, 18 Jun 2009 12:49:45 +0000 (12:49 +0000)
committerKern Sibbald <kern@sibbald.com>
Thu, 18 Jun 2009 12:49:45 +0000 (12:49 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@8909 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/patches/3.0.1-maxdiff.patch [new file with mode: 0644]

diff --git a/bacula/patches/3.0.1-maxdiff.patch b/bacula/patches/3.0.1-maxdiff.patch
new file mode 100644 (file)
index 0000000..143334e
--- /dev/null
@@ -0,0 +1,66 @@
+
+ This patch can be applied to version 3.0.1 and ensures that
+ if maxdiffinterval is set, it will be done even if no prior
+ Diff job ran.  This should fix bug #1311.
+
+ Apply it to version 3.0.1 with:
+
+ cd <bacula-source>
+ patch -p0 <3.0.1-maxdiff.patch
+ ./configure <your-options>
+ make
+ ...
+ make install
+
+
+
+Index: src/dird/fd_cmds.c
+===================================================================
+--- src/dird/fd_cmds.c (revision 8902)
++++ src/dird/fd_cmds.c (working copy)
+@@ -198,22 +198,29 @@
+       now = (utime_t)time(NULL);
+       jcr->jr.JobId = 0;     /* flag to return since time */
+       have_full = db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime);
+-      /* If there was a successful job, make sure it is recent enough */
+-      if (jcr->get_JobLevel() == L_INCREMENTAL && have_full && jcr->job->MaxDiffInterval > 0) {
++      if (have_full) {
++         last_full_time = str_to_utime(jcr->stime);
++      }
++      /* Make sure the last diff is recent enough */
++      if (have_full && jcr->get_JobLevel() == L_INCREMENTAL && jcr->job->MaxDiffInterval > 0) {
+          /* Lookup last diff job */
+          if (db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_DIFFERENTIAL)) {
+             last_diff_time = str_to_utime(stime);
+-            do_diff = ((now - last_diff_time) >= jcr->job->MaxDiffInterval);
++         } else {
++            /* No last differential, so use last full time */
++            last_diff_time = last_full_time;
+          }
++         do_diff = ((now - last_diff_time) >= jcr->job->MaxDiffInterval);
+       }
+-      if (have_full && jcr->job->MaxFullInterval > 0 &&
+-         db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_FULL)) {
+-         last_full_time = str_to_utime(stime);
++      /* Note, do_full takes precedence over do_diff */
++      if (have_full && jcr->job->MaxFullInterval > 0) {
+          do_full = ((now - last_full_time) >= jcr->job->MaxFullInterval);
++      } else {
++         do_full = true;
+       }
+       free_pool_memory(stime);
+-      if (!have_full || do_full) {
++      if (do_full) {
+          /* No recent Full job found, so upgrade this one to Full */
+          Jmsg(jcr, M_INFO, 0, "%s", db_strerror(jcr->db));
+          Jmsg(jcr, M_INFO, 0, _("No prior or suitable Full backup found in catalog. Doing FULL backup.\n"));
+@@ -221,7 +228,7 @@
+             level_to_str(jcr->get_JobLevel()));
+          jcr->set_JobLevel(jcr->jr.JobLevel = L_FULL);
+        } else if (do_diff) {
+-         /* No recent diff job found, so upgrade this one to Full */
++         /* No recent diff job found, so upgrade this one to Diff */
+          Jmsg(jcr, M_INFO, 0, _("No prior or suitable Differential backup found in catalog. Doing Differential backup.\n"));
+          bsnprintf(since, since_len, _(" (upgraded from %s)"),
+             level_to_str(jcr->get_JobLevel()));