From efa9de2bf9a842da19446e014116a1b8d003f3e9 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Sun, 21 Jun 2009 09:46:45 +0000 Subject: [PATCH] Re-fix bug #1311 if MaxDiffInterval exceeded ensure job upgraded git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@8916 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/kernstodo | 11 ++++++++--- bacula/patches/3.0.1-maxdiff.patch | 14 +++++++++----- bacula/src/dird/fd_cmds.c | 27 +++++++++++++++++++-------- bacula/src/version.h | 4 ++-- bacula/technotes | 2 ++ 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/bacula/kernstodo b/bacula/kernstodo index 1606fb963e..2d2f3d7a06 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -1,5 +1,5 @@ Kern's ToDo List - 02 May 2008 + 21 June 2009 Rescue: Add to USB key: @@ -81,6 +81,12 @@ Professional Needs: Priority: ================ +- Fix restore of acls and extended attributes to count ERROR + messages and make errors non-fatal. +- Put save/restore various platform acl/xattrs on a pointer to simplify + the code. + + - Why no error message if restore has no permission on the where directory? - Possibly allow manual "purge" to purge a Volume that has not @@ -96,11 +102,10 @@ Priority: - Add bRC_EndJob -- stops more calls to plugin this job - Add bRC_Term (unload plugin) - remove time_t from Jmsg and use utime_t? -- Extended ACLs - Deadlock detection, watchdog sees if counter advances when jobs are running. With debug on, can do a "status" command. - User options for plugins. -- Pool Storage override precidence over command line. +- Pool Storage override precedence over command line. - Autolabel only if Volume catalog information indicates tape not written. This will avoid overwriting a tape that gets an I/O error on reading the volume label. diff --git a/bacula/patches/3.0.1-maxdiff.patch b/bacula/patches/3.0.1-maxdiff.patch index 143334e287..4fbd75f22a 100644 --- a/bacula/patches/3.0.1-maxdiff.patch +++ b/bacula/patches/3.0.1-maxdiff.patch @@ -16,9 +16,9 @@ Index: src/dird/fd_cmds.c =================================================================== ---- src/dird/fd_cmds.c (revision 8902) +--- src/dird/fd_cmds.c (revision 8911) +++ src/dird/fd_cmds.c (working copy) -@@ -198,22 +198,29 @@ +@@ -198,22 +198,33 @@ 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); @@ -26,6 +26,8 @@ Index: src/dird/fd_cmds.c - if (jcr->get_JobLevel() == L_INCREMENTAL && have_full && jcr->job->MaxDiffInterval > 0) { + if (have_full) { + last_full_time = str_to_utime(jcr->stime); ++ } else { ++ do_full = true; /* No full, upgrade to one */ + } + /* Make sure the last diff is recent enough */ + if (have_full && jcr->get_JobLevel() == L_INCREMENTAL && jcr->job->MaxDiffInterval > 0) { @@ -33,6 +35,10 @@ Index: src/dird/fd_cmds.c 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); ++ /* If no Diff since Full, use Full time */ ++ if (last_diff_time < last_full_time) { ++ last_diff_time = last_full_time; ++ } + } else { + /* No last differential, so use last full time */ + last_diff_time = last_full_time; @@ -45,8 +51,6 @@ Index: src/dird/fd_cmds.c + /* 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); @@ -55,7 +59,7 @@ Index: src/dird/fd_cmds.c /* 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 @@ +@@ -221,7 +232,7 @@ level_to_str(jcr->get_JobLevel())); jcr->set_JobLevel(jcr->jr.JobLevel = L_FULL); } else if (do_diff) { diff --git a/bacula/src/dird/fd_cmds.c b/bacula/src/dird/fd_cmds.c index 6859a6e55f..3a1d1999bd 100644 --- a/bacula/src/dird/fd_cmds.c +++ b/bacula/src/dird/fd_cmds.c @@ -198,22 +198,33 @@ void get_level_since_time(JCR *jcr, char *since, int since_len) 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); + } else { + do_full = true; /* No full, upgrade to one */ + } + /* 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); + /* If no Diff since Full, use Full time */ + if (last_diff_time < last_full_time) { + last_diff_time = last_full_time; + } + } 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); } 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 +232,7 @@ void get_level_since_time(JCR *jcr, char *since, int since_len) 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())); diff --git a/bacula/src/version.h b/bacula/src/version.h index 7a344ed3f1..31f94b1488 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -4,8 +4,8 @@ #undef VERSION #define VERSION "3.0.2" -#define BDATE "18 June 2009" -#define LSMDATE "18Jun09" +#define BDATE "21 June 2009" +#define LSMDATE "21Jun09" #define PROG_COPYRIGHT "Copyright (C) %d-2009 Free Software Foundation Europe e.V.\n" #define BYEAR "2009" /* year for copyright messages in progs */ diff --git a/bacula/technotes b/bacula/technotes index 94472d8d77..b82c8eb30a 100644 --- a/bacula/technotes +++ b/bacula/technotes @@ -2,6 +2,8 @@ General: +21Jun09 +kes Re-fix bug #1311 if MaxDiffInterval exceeded ensure job upgraded 18Jun09 kes Add all Job Types to job_type_to_str() for bat. kes Fix bug #1311 if MaxDiffInterval exceeded ensure job upgraded -- 2.39.5