X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fjob.c;h=768b6cf1cfe34924ffca573c9ec4b50c18fd29ce;hb=b7d55c258d091d7be881e0fb413c10accd1dd5d6;hp=fd6055cebaff8e7d9e50862a48e57b7bd1715f5b;hpb=b5db61d8cb9075592caf167e8b23fe5f6be125e8;p=bacula%2Fbacula diff --git a/bacula/src/dird/job.c b/bacula/src/dird/job.c index fd6055ceba..768b6cf1cf 100644 --- a/bacula/src/dird/job.c +++ b/bacula/src/dird/job.c @@ -42,7 +42,7 @@ static void job_monitor_watchdog(watchdog_t *self); static void job_monitor_destructor(watchdog_t *self); static bool job_check_maxwaittime(JCR *jcr); static bool job_check_maxruntime(JCR *jcr); -static bool job_check_maxschedruntime(JCR *jcr); +static bool job_check_maxrunschedtime(JCR *jcr); /* Imported subroutines */ extern void term_scheduler(); @@ -104,7 +104,7 @@ bool setup_job(JCR *jcr) int errstat; jcr->lock(); - sm_check(__FILE__, __LINE__, true); + Dsm_check(100); init_msg(jcr, jcr->messages); /* Initialize termination condition variable */ @@ -124,11 +124,11 @@ bool setup_job(JCR *jcr) * Open database */ Dmsg0(100, "Open database\n"); - jcr->db=db_init(jcr, jcr->catalog->db_driver, jcr->catalog->db_name, - jcr->catalog->db_user, - jcr->catalog->db_password, jcr->catalog->db_address, - jcr->catalog->db_port, jcr->catalog->db_socket, - jcr->catalog->mult_db_connections); + jcr->db = db_init_database(jcr, jcr->catalog->db_driver, jcr->catalog->db_name, + jcr->catalog->db_user, jcr->catalog->db_password, + jcr->catalog->db_address, jcr->catalog->db_port, + jcr->catalog->db_socket, jcr->catalog->mult_db_connections, + jcr->catalog->disable_batch_insert); if (!jcr->db || !db_open_database(jcr, jcr->db)) { Jmsg(jcr, M_FATAL, 0, _("Could not open database \"%s\".\n"), jcr->catalog->db_name); @@ -172,7 +172,7 @@ bool setup_job(JCR *jcr) generate_daemon_event(jcr, "JobStart"); new_plugins(jcr); /* instantiate plugins for this jcr */ - generate_plugin_event(jcr, bEventJobStart); + generate_plugin_event(jcr, bDirEventJobStart); if (job_canceled(jcr)) { goto bail_out; @@ -233,8 +233,8 @@ bool setup_job(JCR *jcr) } generate_job_event(jcr, "JobInit"); - generate_plugin_event(jcr, bEventJobInit); - Dsm_check(1); + generate_plugin_event(jcr, bDirEventJobInit); + Dsm_check(100); return true; bail_out: @@ -259,7 +259,7 @@ static void *job_thread(void *arg) JCR *jcr = (JCR *)arg; pthread_detach(pthread_self()); - Dsm_check(1); + Dsm_check(100); Dmsg0(200, "=====Start Job=========\n"); jcr->setJobStatus(JS_Running); /* this will be set only if no error */ @@ -272,9 +272,9 @@ static void *job_thread(void *arg) Jmsg(jcr, M_FATAL, 0, _("Job canceled because max start delay time exceeded.\n")); } - if (job_check_maxschedruntime(jcr)) { + if (job_check_maxrunschedtime(jcr)) { jcr->setJobStatus(JS_Canceled); - Jmsg(jcr, M_FATAL, 0, _("Job canceled because max sched run time exceeded.\n")); + Jmsg(jcr, M_FATAL, 0, _("Job canceled because max run sched time exceeded.\n")); } /* TODO : check if it is used somewhere */ @@ -306,7 +306,7 @@ static void *job_thread(void *arg) Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); } generate_job_event(jcr, "JobRun"); - generate_plugin_event(jcr, bEventJobRun); + generate_plugin_event(jcr, bDirEventJobRun); switch (jcr->getJobType()) { case JT_BACKUP: @@ -358,9 +358,9 @@ static void *job_thread(void *arg) } generate_daemon_event(jcr, "JobEnd"); - generate_plugin_event(jcr, bEventJobEnd); + generate_plugin_event(jcr, bDirEventJobEnd); Dmsg1(50, "======== End Job stat=%c ==========\n", jcr->JobStatus); - sm_check(__FILE__, __LINE__, true); + Dsm_check(100); return NULL; } @@ -531,7 +531,7 @@ static void job_monitor_watchdog(watchdog_t *self) control_jcr = (JCR *)self->data; - Dsm_check(1); + Dsm_check(100); Dmsg1(800, "job_monitor_watchdog %p called\n", self); foreach_jcr(jcr) { @@ -553,9 +553,9 @@ static void job_monitor_watchdog(watchdog_t *self) Qmsg(jcr, M_FATAL, 0, _("Max run time exceeded. Job canceled.\n")); cancel = true; /* check MaxRunSchedTime */ - } else if (job_check_maxschedruntime(jcr)) { + } else if (job_check_maxrunschedtime(jcr)) { jcr->setJobStatus(JS_Canceled); - Qmsg(jcr, M_FATAL, 0, _("Max sched run time exceeded. Job canceled.\n")); + Qmsg(jcr, M_FATAL, 0, _("Max run sched time exceeded. Job canceled.\n")); cancel = true; } @@ -647,14 +647,14 @@ static bool job_check_maxruntime(JCR *jcr) * Check if MaxRunSchedTime has expired and if the job can be * canceled. */ -static bool job_check_maxschedruntime(JCR *jcr) +static bool job_check_maxrunschedtime(JCR *jcr) { - if (jcr->job->MaxRunSchedTime == 0 || job_canceled(jcr)) { + if (jcr->MaxRunSchedTime == 0 || job_canceled(jcr)) { return false; } - if ((watchdog_time - jcr->sched_time) < jcr->job->MaxRunSchedTime) { + if ((watchdog_time - jcr->sched_time) < jcr->MaxRunSchedTime) { Dmsg3(200, "Job %p (%s) with MaxRunSchedTime %d not expired\n", - jcr, jcr->Job, jcr->job->MaxRunSchedTime); + jcr, jcr->Job, jcr->MaxRunSchedTime); return false; } @@ -696,11 +696,19 @@ bool allow_duplicate_job(JCR *jcr) { JOB *job = jcr->job; JCR *djcr; /* possible duplicate job */ + bool cancel_dup = false; + bool cancel_me = false; - if (job->AllowDuplicateJobs) { + /* + * See if AllowDuplicateJobs is set or + * if duplicate checking is disabled for this job. + */ + if (job->AllowDuplicateJobs || jcr->IgnoreDuplicateJobChecking) { return true; } + Dmsg0(800, "Enter allow_duplicate_job\n"); + /* * After this point, we do not want to allow any duplicate * job to run. @@ -710,9 +718,16 @@ bool allow_duplicate_job(JCR *jcr) if (jcr == djcr || djcr->JobId == 0) { continue; /* do not cancel this job or consoles */ } + + /* + * See if this Job has the IgnoreDuplicateJobChecking flag set, ignore it + * for any checking against other jobs. + */ + if (djcr->IgnoreDuplicateJobChecking) { + continue; + } + if (strcmp(job->name(), djcr->job->name()) == 0) { - bool cancel_dup = false; - bool cancel_me = false; if (job->DuplicateJobProximity > 0) { utime_t now = (utime_t)time(NULL); if ((now - djcr->start_time) > job->DuplicateJobProximity) { @@ -751,9 +766,12 @@ bool allow_duplicate_job(JCR *jcr) djcr->JobId); break; /* get out of foreach_jcr */ } - } - /* Cancel one of the two jobs (me or dup) */ - /* If CancelQueuedDuplicates is set do so only if job is queued */ + } + + /* + * Cancel one of the two jobs (me or dup) + * If CancelQueuedDuplicates is set do so only if job is queued. + */ if (job->CancelQueuedDuplicates) { switch (djcr->JobStatus) { case JS_Created: @@ -769,8 +787,11 @@ bool allow_duplicate_job(JCR *jcr) break; } } + if (cancel_dup || job->CancelRunningDuplicates) { - /* Zap the duplicated job djcr */ + /* + * Zap the duplicated job djcr + */ UAContext *ua = new_ua_context(jcr); Jmsg(jcr, M_INFO, 0, _("Cancelling duplicate JobId=%d.\n"), djcr->JobId); cancel_job(ua, djcr); @@ -779,7 +800,9 @@ bool allow_duplicate_job(JCR *jcr) free_ua_context(ua); Dmsg2(800, "Cancel dup %p JobId=%d\n", djcr, djcr->JobId); } else { - /* Zap current job */ + /* + * Zap current job + */ Jmsg(jcr, M_FATAL, 0, _("JobId %d already running. Duplicate job not allowed.\n"), djcr->JobId); Dmsg2(800, "Cancel me %p JobId=%d\n", jcr, jcr->JobId); @@ -1114,15 +1137,15 @@ void get_job_storage(USTORE *store, JOB *job, RUN *run) void set_jcr_defaults(JCR *jcr, JOB *job) { jcr->job = job; - jcr->set_JobType(job->JobType); + jcr->setJobType(job->JobType); jcr->JobStatus = JS_Created; switch (jcr->getJobType()) { case JT_ADMIN: - jcr->set_JobLevel(L_NONE); + jcr->setJobLevel(L_NONE); break; default: - jcr->set_JobLevel(job->JobLevel); + jcr->setJobLevel(job->JobLevel); break; } @@ -1163,11 +1186,13 @@ void set_jcr_defaults(JCR *jcr, JOB *job) pm_strcpy(jcr->catalog_source, _("Client resource")); } jcr->fileset = job->fileset; + jcr->accurate = job->accurate; jcr->messages = job->messages; jcr->spool_data = job->spool_data; jcr->spool_size = job->spool_size; jcr->write_part_after_job = job->write_part_after_job; - jcr->accurate = job->accurate; + jcr->IgnoreDuplicateJobChecking = job->IgnoreDuplicateJobChecking; + jcr->MaxRunSchedTime = job->MaxRunSchedTime; if (jcr->RestoreBootstrap) { free(jcr->RestoreBootstrap); jcr->RestoreBootstrap = NULL; @@ -1182,17 +1207,17 @@ void set_jcr_defaults(JCR *jcr, JOB *job) if (jcr->getJobLevel() == 0) { switch (jcr->getJobType()) { case JT_VERIFY: - jcr->set_JobLevel(L_VERIFY_CATALOG); + jcr->setJobLevel(L_VERIFY_CATALOG); break; case JT_BACKUP: - jcr->set_JobLevel(L_INCREMENTAL); + jcr->setJobLevel(L_INCREMENTAL); break; case JT_RESTORE: case JT_ADMIN: - jcr->set_JobLevel(L_NONE); + jcr->setJobLevel(L_NONE); break; default: - jcr->set_JobLevel(L_FULL); + jcr->setJobLevel(L_FULL); break; } } @@ -1356,14 +1381,6 @@ void free_wstorage(JCR *jcr) jcr->wstore = NULL; } -char *job_code_callback_clones(JCR *jcr, const char* param) -{ - if (param[0] == 'p') { - return jcr->pool->name(); - } - return NULL; -} - void create_clones(JCR *jcr) { /* @@ -1377,7 +1394,7 @@ void create_clones(JCR *jcr) UAContext *ua = new_ua_context(jcr); ua->batch = true; foreach_alist(runcmd, job->run_cmds) { - cmd = edit_job_codes(jcr, cmd, runcmd, "", job_code_callback_clones); + cmd = edit_job_codes(jcr, cmd, runcmd, "", job_code_callback_director); Mmsg(ua->cmd, "run %s cloned=yes", cmd); Dmsg1(900, "=============== Clone cmd=%s\n", ua->cmd); parse_ua_args(ua); /* parse command */