On Tue, Apr 21, 2009 at 06:38:14PM -0400, Mordechai T. Abzug wrote: > Looks like MaxFullInterval is working correctly, but MaxDiffInterval > isn't. > > Is this a bug, or am I missing something?
Oh, I think I see the problem. I've *never* run a differential on this client. That's a problem here: diff -Nur bacula-3.0.0/src/dird/fd_cmds.c bacula-3.0.0-maxdiff_fix/src/dird/fd_cmds.c --- bacula-3.0.0/src/dird/fd_cmds.c 2008-10-24 09:04:16.000000000 -0400 +++ bacula-3.0.0-maxdiff_fix/src/dird/fd_cmds.c 2009-04-21 20:29:45.000000000 -0400 @@ -198,6 +198,8 @@ 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 { + do_diff = 1; /* if it's *never* run, promote */ } } if (have_full && jcr->job->MaxFullInterval > 0 && However, I also wrote a patch to add in MaxIncrInterval and Level=Poll, similar to a feature request I recently made. It also incorporates the above patch. Here it is: diff -ur bacula-3.0.0-dist/src/cats/sql_find.c bacula-3.0.0-maxincr_and_poll/src/cats/sql_find.c --- bacula-3.0.0-dist/src/cats/sql_find.c 2009-03-07 15:59:46.000000000 -0500 +++ bacula-3.0.0-maxincr_and_poll/src/cats/sql_find.c 2009-04-21 19:54:01.000000000 -0400 @@ -86,8 +86,9 @@ if (jr->JobLevel == L_DIFFERENTIAL) { /* SQL cmd for Differential backup already edited above */ - /* Incremental is since last Full, Incremental, or Differential */ - } else if (jr->JobLevel == L_INCREMENTAL) { + /* Incremental is since last Full, Incremental, or Differential. + For Poll, do Incremental search as worst case */ + } else if (jr->JobLevel == L_INCREMENTAL || jr->JobLevel == L_POLL) { /* * For an Incremental job, we must first ensure * that a Full backup was done (cmd edited above) diff -ur bacula-3.0.0-dist/src/dird/backup.c bacula-3.0.0-maxincr_and_poll/src/dird/backup.c --- bacula-3.0.0-dist/src/dird/backup.c 2009-03-07 15:59:46.000000000 -0500 +++ bacula-3.0.0-maxincr_and_poll/src/dird/backup.c 2009-04-21 19:40:10.000000000 -0400 @@ -85,6 +85,10 @@ return false; } + if (jcr->get_JobLevel() == L_POLL) { /* do nothing if not promoted */ + return true; + } + jcr->jr.PoolId = get_or_create_pool_record(jcr, jcr->pool->name()); if (jcr->jr.PoolId == 0) { return false; @@ -189,6 +193,11 @@ return do_vbackup(jcr); } + if (jcr->get_JobLevel() == L_POLL) { + set_jcr_job_status(jcr, JS_Terminated); + return true; /* nothing to do for unpromoted poll jobs */ + } + /* Print Job Start message */ Jmsg(jcr, M_INFO, 0, _("Start Backup JobId %s, Job=%s\n"), edit_uint64(jcr->JobId, ed1), jcr->Job); diff -ur bacula-3.0.0-dist/src/dird/dird_conf.c bacula-3.0.0-maxincr_and_poll/src/dird/dird_conf.c --- bacula-3.0.0-dist/src/dird/dird_conf.c 2009-03-05 04:43:19.000000000 -0500 +++ bacula-3.0.0-maxincr_and_poll/src/dird/dird_conf.c 2009-04-21 06:26:44.000000000 -0400 @@ -305,6 +305,7 @@ {"maxstartdelay",store_time, ITEM(res_job.MaxStartDelay), 0, 0, 0}, {"maxfullinterval", store_time, ITEM(res_job.MaxFullInterval), 0, 0, 0}, {"maxdiffinterval", store_time, ITEM(res_job.MaxDiffInterval), 0, 0, 0}, + {"maxincrinterval", store_time, ITEM(res_job.MaxIncrInterval), 0, 0, 0}, {"jobretention", store_time, ITEM(res_job.JobRetention), 0, 0, 0}, {"prefixlinks", store_bool, ITEM(res_job.PrefixLinks), 0, ITEM_DEFAULT, false}, {"prunejobs", store_bool, ITEM(res_job.PruneJobs), 0, ITEM_DEFAULT, false}, @@ -457,6 +458,7 @@ {"Base", L_BASE, JT_BACKUP}, {"Incremental", L_INCREMENTAL, JT_BACKUP}, {"Differential", L_DIFFERENTIAL, JT_BACKUP}, + {"Poll", L_POLL, JT_BACKUP}, {"Since", L_SINCE, JT_BACKUP}, {"VirtualFull", L_VIRTUAL_FULL, JT_BACKUP}, {"Catalog", L_VERIFY_CATALOG, JT_VERIFY}, diff -ur bacula-3.0.0-dist/src/dird/dird_conf.h bacula-3.0.0-maxincr_and_poll/src/dird/dird_conf.h --- bacula-3.0.0-dist/src/dird/dird_conf.h 2009-01-28 05:47:21.000000000 -0500 +++ bacula-3.0.0-maxincr_and_poll/src/dird/dird_conf.h 2009-04-21 05:18:52.000000000 -0400 @@ -395,6 +395,7 @@ utime_t JobRetention; /* job retention period in seconds */ utime_t MaxFullInterval; /* Maximum time interval between Fulls */ utime_t MaxDiffInterval; /* Maximum time interval between Diffs */ + utime_t MaxIncrInterval; /* Maximum time interval between Incrementals */ utime_t DuplicateJobProximity; /* Permitted time between duplicicates */ int64_t spool_size; /* Size of spool file for this job */ uint32_t MaxConcurrentJobs; /* Maximum concurrent jobs */ diff -ur bacula-3.0.0-dist/src/dird/fd_cmds.c bacula-3.0.0-maxincr_and_poll/src/dird/fd_cmds.c --- bacula-3.0.0-dist/src/dird/fd_cmds.c 2008-10-24 09:04:16.000000000 -0400 +++ bacula-3.0.0-maxincr_and_poll/src/dird/fd_cmds.c 2009-04-21 20:49:51.000000000 -0400 @@ -164,9 +164,11 @@ bool have_full; bool do_full = false; bool do_diff = false; + bool do_incr = false; utime_t now; utime_t last_full_time; utime_t last_diff_time; + utime_t last_incr_time; since[0] = 0; /* If job cloned and a since time already given, use it */ @@ -187,23 +189,39 @@ switch (jcr->get_JobLevel()) { case L_DIFFERENTIAL: case L_INCREMENTAL: + case L_POLL: POOLMEM *stime = get_pool_memory(PM_MESSAGE); /* Look up start time of last Full job */ 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 ((jcr->get_JobLevel() == L_INCREMENTAL || jcr->get_JobLevel() == L_POLL) + && have_full && 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 { + do_diff = 1; /* if there was *never* a diff, we're overdue */ } } - 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); - do_full = ((now - last_full_time) >= jcr->job->MaxFullInterval); + if (have_full && jcr->job->MaxFullInterval > 0) { + if (db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_FULL)) { + last_full_time = str_to_utime(stime); + do_full = ((now - last_full_time) >= jcr->job->MaxFullInterval); + } else { + do_full = 1; /* if there was never a full, we're overdue. Redundant to have_full */ + } + } + if (jcr->get_JobLevel()==L_POLL && have_full && !do_full && !do_diff && + jcr->job->MaxIncrInterval > 0) { + if (db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_INCREMENTAL)) { + last_incr_time = str_to_utime(stime); + do_incr = ((now - last_incr_time) >= jcr->job->MaxIncrInterval); + } else { + do_incr = 1; /* if there was never an incremental, we're overdue */ + } } free_pool_memory(stime); @@ -220,6 +238,12 @@ bsnprintf(since, since_len, _(" (upgraded from %s)"), level_to_str(jcr->get_JobLevel())); jcr->set_JobLevel(jcr->jr.JobLevel = L_DIFFERENTIAL); + } else if (do_incr) { + /* No recent diff job found, so upgrade this one to Full */ + Jmsg(jcr, M_INFO, 0, _("No prior or suitable Incremental backup found in catalog. Doing Incremental backup.\n")); + bsnprintf(since, since_len, _(" (upgraded from %s)"), + level_to_str(jcr->get_JobLevel())); + jcr->set_JobLevel(jcr->jr.JobLevel = L_INCREMENTAL); } else { if (jcr->job->rerun_failed_levels) { if (db_find_failed_job_since(jcr, jcr->db, &jcr->jr, jcr->stime, JobLevel)) { diff -ur bacula-3.0.0-dist/src/dird/ua_run.c bacula-3.0.0-maxincr_and_poll/src/dird/ua_run.c --- bacula-3.0.0-dist/src/dird/ua_run.c 2009-03-25 17:14:58.000000000 -0400 +++ bacula-3.0.0-maxincr_and_poll/src/dird/ua_run.c 2009-04-21 06:48:02.000000000 -0400 @@ -688,6 +688,7 @@ add_prompt(ua, _("Differential")); add_prompt(ua, _("Since")); add_prompt(ua, _("VirtualFull")); + add_prompt(ua, _("Poll")); switch (do_prompt(ua, "", _("Select level"), NULL, 0)) { // case 0: // jcr->JobLevel = L_BASE; @@ -707,6 +708,9 @@ case 4: jcr->set_JobLevel(L_VIRTUAL_FULL); break; + case 5: + jcr->set_JobLevel(L_POLL); + break; default: break; } diff -ur bacula-3.0.0-dist/src/filed/status.c bacula-3.0.0-maxincr_and_poll/src/filed/status.c --- bacula-3.0.0-dist/src/filed/status.c 2009-03-06 15:00:47.000000000 -0500 +++ bacula-3.0.0-maxincr_and_poll/src/filed/status.c 2009-04-21 06:55:27.000000000 -0400 @@ -446,6 +446,9 @@ case L_DIFFERENTIAL: str = _("Differential"); break; + case L_POLL: + str = _("Poll"); + break; case L_SINCE: str = _("Since"); break; diff -ur bacula-3.0.0-dist/src/jcr.h bacula-3.0.0-maxincr_and_poll/src/jcr.h --- bacula-3.0.0-dist/src/jcr.h 2009-03-07 15:59:46.000000000 -0500 +++ bacula-3.0.0-maxincr_and_poll/src/jcr.h 2009-04-21 19:46:14.000000000 -0400 @@ -45,6 +45,7 @@ #define L_INCREMENTAL 'I' /* since last backup */ #define L_DIFFERENTIAL 'D' /* since last full backup */ #define L_SINCE 'S' +#define L_POLL 'P' /* poll if time for backup */ #define L_VERIFY_CATALOG 'C' /* verify from catalog */ #define L_VERIFY_INIT 'V' /* verify save (init DB) */ #define L_VERIFY_VOLUME_TO_CATALOG 'O' /* verify Volume to catalog entries */ diff -ur bacula-3.0.0-dist/src/lib/util.c bacula-3.0.0-maxincr_and_poll/src/lib/util.c --- bacula-3.0.0-dist/src/lib/util.c 2009-03-07 15:59:46.000000000 -0500 +++ bacula-3.0.0-maxincr_and_poll/src/lib/util.c 2009-04-21 06:53:57.000000000 -0400 @@ -408,6 +408,9 @@ case L_DIFFERENTIAL: str = _("Differential"); break; + case L_POLL: + str = _("Poll"); + break; case L_SINCE: str = _("Since"); break; - Morty ------------------------------------------------------------------------------ Stay on top of everything new and different, both inside and around Java (TM) technology - register by April 22, and save $200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco. 300 plus technical and hands-on sessions. Register today. Use priority code J9JMT32. http://p.sf.net/sfu/p _______________________________________________ Bacula-devel mailing list Bacula-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bacula-devel