X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fscheduler.c;h=d10abbca64ad8bb3b8b1da3aadf36a87e7e23e10;hb=52a36a2bdbe9311240f971e8088171e4e9841626;hp=684e694520830d475b9d9c03f3f74ad6c3d7c9ff;hpb=892f06cfa5f01fa76b0733ac90d9ef6956b3d636;p=bacula%2Fbacula diff --git a/bacula/src/dird/scheduler.c b/bacula/src/dird/scheduler.c index 684e694520..d10abbca64 100644 --- a/bacula/src/dird/scheduler.c +++ b/bacula/src/dird/scheduler.c @@ -1,3 +1,30 @@ +/* + Bacula® - The Network Backup Solution + + 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. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation and included + in the file LICENSE. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ /* * * Bacula scheduler @@ -9,20 +36,6 @@ * * Version $Id$ */ -/* - Copyright (C) 2000-2006 Kern Sibbald - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as amended with additional clauses defined in the - file LICENSE in the main source directory. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - the file LICENSE for additional details. - - */ #include "bacula.h" #include "dird.h" @@ -105,6 +118,7 @@ JCR *wait_for_next_job(char *one_shot_job_to_run) return jcr; } } + /* Wait until we have something in the * next hour or so. */ @@ -162,11 +176,11 @@ again: } /* Recheck at least once per minute */ bmicrosleep((next_check_secs < twait)?next_check_secs:twait, 0); - /* Attempt to handle clock shift from/to daylight savings time + /* Attempt to handle clock shift (but not daylight savings time changes) * we allow a skew of 10 seconds before invalidating everything. */ now = time(NULL); - if (now < prev+10 || now > (prev+next_check_secs+10)) { + if (now < prev-10 || now > (prev+next_check_secs+10)) { schedules_invalidated = true; } } @@ -186,7 +200,7 @@ again: ASSERT(job); set_jcr_defaults(jcr, job); if (run->level) { - jcr->JobLevel = run->level; /* override run level */ + jcr->set_JobLevel(run->level); /* override run level */ } if (run->pool) { jcr->pool = run->pool; /* override pool */ @@ -205,7 +219,10 @@ again: jcr->run_diff_pool_override = true; } if (run->storage) { - set_rwstorage(jcr, run->storage); /* override storage */ + USTORE store; + store.store = run->storage; + pm_strcpy(store.store_source, _("run override")); + set_rwstorage(jcr, &store); /* override storage */ } if (run->msgs) { jcr->messages = run->msgs; /* override messages */ @@ -230,11 +247,6 @@ again: void term_scheduler() { if (jobs_to_run) { - job_item *je; - /* Release all queued job entries to be run */ - foreach_dlist(je, jobs_to_run) { - free(je); - } delete jobs_to_run; } } @@ -268,6 +280,9 @@ static void find_runs() wom = mday / 7; woy = tm_woy(now); /* get week of year */ + Dmsg7(dbglvl, "now = %x: h=%d m=%d md=%d wd=%d wom=%d woy=%d\n", + now, hour, month, mday, wday, wom, woy); + /* * Compute values for next hour from now. * We do this to be sure we don't miss a job while @@ -283,6 +298,9 @@ static void find_runs() nh_wom = nh_mday / 7; nh_woy = tm_woy(now); /* get week of year */ + Dmsg7(dbglvl, "nh = %x: h=%d m=%d md=%d wd=%d wom=%d woy=%d\n", + next_hour, nh_hour, nh_month, nh_mday, nh_wday, nh_wom, nh_woy); + /* Loop through all jobs */ LockRes(); foreach_res(job, R_JOB) { @@ -335,23 +353,19 @@ static void find_runs() Dmsg3(dbglvl, "run@%p: run_now=%d run_nh=%d\n", run, run_now, run_nh); - /* find time (time_t) job is to be run */ - (void)localtime_r(&now, &tm); /* reset tm structure */ - tm.tm_min = run->minute; /* set run minute */ - tm.tm_sec = 0; /* zero secs */ - if (run_now) { - runtime = mktime(&tm); - add_job(job, run, now, runtime); - } - /* If job is to be run in the next hour schedule it */ - if (run_nh) { - /* Set correct values */ - tm.tm_hour = nh_hour; - tm.tm_mday = nh_mday + 1; /* fixup because we biased for tests above */ - tm.tm_mon = nh_month; - tm.tm_year = nh_year; - runtime = mktime(&tm); - add_job(job, run, now, runtime); + if (run_now || run_nh) { + /* find time (time_t) job is to be run */ + (void)localtime_r(&now, &tm); /* reset tm structure */ + tm.tm_min = run->minute; /* set run minute */ + tm.tm_sec = 0; /* zero secs */ + runtime = mktime(&tm); + if (run_now) { + add_job(job, run, now, runtime); + } + /* If job is to be run in the next hour schedule it */ + if (run_nh) { + add_job(job, run, now, runtime + 3600); + } } } } @@ -369,19 +383,15 @@ static void add_job(JOB *job, RUN *run, time_t now, time_t runtime) */ if (((runtime - run->last_run) < 61) || ((runtime+59) < now)) { #ifdef SCHED_DEBUG - char dt[50], dt1[50], dt2[50]; - bstrftime_nc(dt, sizeof(dt), runtime); - bstrftime_nc(dt1, sizeof(dt1), run->last_run); - bstrftime_nc(dt2, sizeof(dt2), now); - Dmsg7(000, "Drop: Job=\"%s\" run=%s(%x). last_run=%s(%x). now=%s(%x)\n", job->hdr.name, - dt, runtime, dt1, run->last_run, dt2, now); + Dmsg4(000, "Drop: Job=\"%s\" run=%lld. last_run=%lld. now=%lld\n", job->hdr.name, + (utime_t)runtime, (utime_t)run->last_run, (utime_t)now); fflush(stdout); #endif return; } #ifdef SCHED_DEBUG - Dmsg4(000, "Add: Job=\"%s\" run=%x last_run=%x now=%x\n", job->hdr.name, - runtime, run->last_run, now); + Dmsg4(000, "Add: Job=\"%s\" run=%lld last_run=%lld now=%lld\n", job->hdr.name, + (utime_t)runtime, (utime_t)run->last_run, (utime_t)now); #endif /* accept to run this job */ job_item *je = (job_item *)malloc(sizeof(job_item));