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();
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;
}
generate_job_event(jcr, "JobInit");
- generate_plugin_event(jcr, bEventJobInit);
+ generate_plugin_event(jcr, bDirEventJobInit);
Dsm_check(100);
return true;
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 */
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:
}
generate_daemon_event(jcr, "JobEnd");
- generate_plugin_event(jcr, bEventJobEnd);
+ generate_plugin_event(jcr, bDirEventJobEnd);
Dmsg1(50, "======== End Job stat=%c ==========\n", jcr->JobStatus);
Dsm_check(100);
return NULL;
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;
}
* 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;
}
{
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.
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) {
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:
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);
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);
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;
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)
{
/*
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 */