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);
- 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) {
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;
+ /* 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);
/* 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) {