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
[email protected]
https://lists.sourceforge.net/lists/listinfo/bacula-devel