X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Ffd_cmds.c;h=2ef63d9813f6ba74ee0b670c223abc230d7da047;hb=a80e5ce0c2e9476c9ce7d8a641b6f3e56f5d3735;hp=6859a6e55f3f51120354f7ad32d7dcc0333c11ac;hpb=642dd5bfda7b52382a8a9be2c01f31fe164371dd;p=bacula%2Fbacula diff --git a/bacula/src/dird/fd_cmds.c b/bacula/src/dird/fd_cmds.c index 6859a6e55f..2ef63d9813 100644 --- a/bacula/src/dird/fd_cmds.c +++ b/bacula/src/dird/fd_cmds.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2008 Free Software Foundation Europe e.V. + Copyright (C) 2000-2009 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -123,8 +123,8 @@ int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time, * Now send JobId and authorization key */ fd->fsend(jobcmd, edit_int64(jcr->JobId, ed1), jcr->Job, jcr->VolSessionId, - jcr->VolSessionTime, jcr->sd_auth_key); - if (strcmp(jcr->sd_auth_key, "dummy") != 0) { + jcr->VolSessionTime, jcr->sd_auth_key); + if (!jcr->keep_sd_auth_key && strcmp(jcr->sd_auth_key, "dummy")) { memset(jcr->sd_auth_key, 0, strlen(jcr->sd_auth_key)); } Dmsg1(100, ">filed: %s", fd->msg); @@ -171,7 +171,7 @@ void get_level_since_time(JCR *jcr, char *since, int since_len) bool do_full = false; bool do_diff = false; utime_t now; - utime_t last_full_time; + utime_t last_full_time = 0; utime_t last_diff_time; since[0] = 0; @@ -197,23 +197,47 @@ void get_level_since_time(JCR *jcr, char *since, int since_len) /* 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) { + /* + * This is probably redundant, but some of the code below + * uses jcr->stime, so don't remove unless you are sure. + */ + if (!db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime)) { + do_full = true; + } + have_full = db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_FULL); + if (have_full) { + last_full_time = str_to_utime(stime); + } else { + do_full = true; /* No full, upgrade to one */ + } + Dmsg4(50, "have_full=%d do_full=%d now=%lld full_time=%lld\n", have_full, + do_full, now, last_full_time); + /* 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; + } + Dmsg2(50, "last_diff_time=%lld last_full_time=%lld\n", last_diff_time, + last_full_time); + } else { + /* No last differential, so use last full time */ + last_diff_time = last_full_time; + Dmsg1(50, "No last_diff_time setting to full_time=%lld\n", last_full_time); } + do_diff = ((now - last_diff_time) >= jcr->job->MaxDiffInterval); + Dmsg2(50, "do_diff=%d diffInter=%lld\n", do_diff, 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 +245,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())); @@ -267,7 +291,7 @@ static void send_since_time(JCR *jcr) bool send_level_command(JCR *jcr) { BSOCK *fd = jcr->file_bsock; - const char *accurate = jcr->job->accurate?"accurate_":""; + const char *accurate = jcr->accurate?"accurate_":""; const char *not_accurate = ""; /* * Send Level command to File daemon @@ -330,6 +354,9 @@ static bool send_fileset(JCR *jcr) ie = fileset->exclude_items[i]; fd->fsend("E\n"); } + if (ie->ignoredir) { + bnet_fsend(fd, "Z %s\n", ie->ignoredir); + } for (j=0; jnum_opts; j++) { FOPTS *fo = ie->opts_list[j]; fd->fsend("O %s\n", fo->opts); @@ -375,9 +402,6 @@ static bool send_fileset(JCR *jcr) if (fo->plugin) { fd->fsend("G %s\n", fo->plugin); } - if (fo->ignoredir) { - bnet_fsend(fd, "Z %s\n", fo->ignoredir); - } if (fo->reader) { fd->fsend("D %s\n", fo->reader); } @@ -519,43 +543,6 @@ bool send_exclude_list(JCR *jcr) return true; } - -/* - * Send bootstrap file if any to the socket given (FD or SD). - * This is used for restore, verify VolumeToCatalog, and - * for migration. - */ -bool send_bootstrap_file(JCR *jcr, BSOCK *sock) -{ - FILE *bs; - char buf[1000]; - const char *bootstrap = "bootstrap\n"; - - Dmsg1(400, "send_bootstrap_file: %s\n", jcr->RestoreBootstrap); - if (!jcr->RestoreBootstrap) { - return true; - } - bs = fopen(jcr->RestoreBootstrap, "rb"); - if (!bs) { - berrno be; - Jmsg(jcr, M_FATAL, 0, _("Could not open bootstrap file %s: ERR=%s\n"), - jcr->RestoreBootstrap, be.bstrerror()); - set_jcr_job_status(jcr, JS_ErrorTerminated); - return false; - } - sock->fsend(bootstrap); - while (fgets(buf, sizeof(buf), bs)) { - sock->fsend("%s", buf); - } - sock->signal(BNET_EOD); - fclose(bs); - if (jcr->unlink_bsr) { - unlink(jcr->RestoreBootstrap); - jcr->unlink_bsr = false; - } - return true; -} - /* TODO: drop this with runscript.old_proto in bacula 1.42 */ static char runbefore[] = "RunBeforeJob %s\n"; static char runafter[] = "RunAfterJob %s\n";