/*
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.
jcr->JobId, jcr->Job, jcr->jr.JobType, jcr->jr.JobLevel);
generate_daemon_event(jcr, "JobStart");
+ new_plugins(jcr); /* instantiate plugins for this jcr */
+ generate_plugin_event(jcr, bEventJobStart);
if (job_canceled(jcr)) {
goto bail_out;
case JT_BACKUP:
if (!do_backup_init(jcr)) {
backup_cleanup(jcr, JS_ErrorTerminated);
+ goto bail_out;
}
break;
case JT_VERIFY:
if (!do_verify_init(jcr)) {
verify_cleanup(jcr, JS_ErrorTerminated);
+ goto bail_out;
}
break;
case JT_RESTORE:
if (!do_restore_init(jcr)) {
restore_cleanup(jcr, JS_ErrorTerminated);
+ goto bail_out;
}
break;
case JT_ADMIN:
if (!do_admin_init(jcr)) {
admin_cleanup(jcr, JS_ErrorTerminated);
+ goto bail_out;
}
break;
case JT_COPY:
case JT_MIGRATE:
if (!do_migration_init(jcr)) {
migration_cleanup(jcr, JS_ErrorTerminated);
+ goto bail_out;
}
break;
default:
Pmsg1(0, _("Unimplemented job type: %d\n"), jcr->get_JobType());
set_jcr_job_status(jcr, JS_ErrorTerminated);
- break;
+ goto bail_out;
}
generate_job_event(jcr, "JobInit");
+ generate_plugin_event(jcr, bEventJobInit);
Dsm_check(1);
return true;
Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
}
generate_job_event(jcr, "JobRun");
+ generate_plugin_event(jcr, bEventJobRun);
switch (jcr->get_JobType()) {
case JT_BACKUP:
}
generate_daemon_event(jcr, "JobEnd");
+ generate_plugin_event(jcr, bEventJobEnd);
Dmsg1(50, "======== End Job stat=%c ==========\n", jcr->JobStatus);
sm_check(__FILE__, __LINE__, true);
return NULL;
foreach_jcr(jcr) {
bool cancel = false;
- if (jcr->JobId == 0 || job_canceled(jcr)) {
+ if (jcr->JobId == 0 || job_canceled(jcr) || jcr->no_maxtime) {
Dmsg2(800, "Skipping JCR=%p Job=%s\n", jcr, jcr->Job);
continue;
}
{
bool cancel = false;
JOB *job = jcr->job;
+ utime_t current=0;
if (!job_waiting(jcr)) {
return false;
}
- Dmsg3(200, "check maxwaittime %u - %u >= %u\n", watchdog_time, jcr->wait_time, job->MaxWaitTime);
+
+ if (jcr->wait_time) {
+ current = watchdog_time - jcr->wait_time;
+ }
+
+ Dmsg2(200, "check maxwaittime %u >= %u\n",
+ current + jcr->wait_time_sum, job->MaxWaitTime);
if (job->MaxWaitTime != 0 &&
- (watchdog_time - jcr->wait_time) >= job->MaxWaitTime) {
+ (current + jcr->wait_time_sum) >= job->MaxWaitTime) {
cancel = true;
}
{
bool cancel = false;
JOB *job = jcr->job;
+ utime_t run_time;
if (job_canceled(jcr) || jcr->JobStatus == JS_Created) {
return false;
job->IncMaxRunTime == 0 && job->DiffMaxRunTime == 0) {
return false;
}
- Dmsg6(200, "check_maxruntime %u - %u >= %u|%u|%u|%u\n\n",
- watchdog_time, jcr->start_time, job->MaxRunTime, job->FullMaxRunTime,
+ run_time = watchdog_time - jcr->start_time;
+ Dmsg7(200, "check_maxruntime %llu-%u=%llu >= %llu|%llu|%llu|%llu\n",
+ watchdog_time, jcr->start_time, run_time, job->MaxRunTime, job->FullMaxRunTime,
job->IncMaxRunTime, job->DiffMaxRunTime);
if (jcr->get_JobLevel() == L_FULL && job->FullMaxRunTime != 0 &&
- (watchdog_time - jcr->start_time) >= job->FullMaxRunTime) {
+ run_time >= job->FullMaxRunTime) {
+ Dmsg0(200, "check_maxwaittime: FullMaxcancel\n");
cancel = true;
} else if (jcr->get_JobLevel() == L_DIFFERENTIAL && job->DiffMaxRunTime != 0 &&
- (watchdog_time - jcr->start_time) >= job->DiffMaxRunTime) {
+ run_time >= job->DiffMaxRunTime) {
+ Dmsg0(200, "check_maxwaittime: DiffMaxcancel\n");
cancel = true;
} else if (jcr->get_JobLevel() == L_INCREMENTAL && job->IncMaxRunTime != 0 &&
- (watchdog_time - jcr->start_time) >= job->IncMaxRunTime) {
+ run_time >= job->IncMaxRunTime) {
+ Dmsg0(200, "check_maxwaittime: IncMaxcancel\n");
cancel = true;
- } else if ((watchdog_time - jcr->start_time) >= job->MaxRunTime) {
+ } else if (job->MaxRunTime > 0 && run_time >= job->MaxRunTime) {
+ Dmsg0(200, "check_maxwaittime: Maxcancel\n");
cancel = true;
}
}
if (!job->AllowHigherDuplicates) {
foreach_jcr(djcr) {
- char ec1[50];
+ if (jcr == djcr || djcr->JobId == 0) {
+ continue; /* do not cancel this job or consoles */
+ }
if (strcmp(job->name(), djcr->job->name()) == 0) {
bool cancel_queued = false;
if (job->DuplicateJobProximity > 0) {
}
}
/* Cancel */
- if (!(job->CancelQueuedDuplicates || job->CancelRunningDuplicates)) {
- /* Zap current job */
- Jmsg(jcr, M_FATAL, 0, _("Duplicate job not allowed. JobId=%s\n"),
- edit_uint64(djcr->JobId, ec1));
- return false;
- }
/* If CancelQueuedDuplicates is set do so only if job is queued */
if (job->CancelQueuedDuplicates) {
switch (djcr->JobStatus) {
}
if (cancel_queued || job->CancelRunningDuplicates) {
UAContext *ua = new_ua_context(djcr);
- Jmsg(jcr, M_INFO, 0, _("Cancelling duplicate JobId=%s.\n"),
- edit_uint64(djcr->JobId, ec1));
+ Jmsg(jcr, M_INFO, 0, _("Cancelling duplicate JobId=%d.\n"), djcr->JobId);
ua->jcr = djcr;
cancel_job(ua, djcr);
free_ua_context(ua);
- Dmsg2(800, "Have cancelled JCR %p Job=%d\n", djcr, djcr->JobId);
+ Dmsg2(800, "Have cancelled JCR %p JobId=%d\n", djcr, djcr->JobId);
+ } else {
+ /* Zap current job */
+ Jmsg(jcr, M_FATAL, 0, _("JobId %d already running. Duplicate job not allowed.\n"),
+ djcr->JobId);
}
+ break; /* did our work, get out */
}
}
endeach_jcr(djcr);
jcr->jr.JobStatus = jcr->JobStatus;
jcr->jr.JobFiles = jcr->JobFiles;
jcr->jr.JobBytes = jcr->JobBytes;
+ jcr->jr.ReadBytes = jcr->ReadBytes;
jcr->jr.VolSessionId = jcr->VolSessionId;
jcr->jr.VolSessionTime = jcr->VolSessionTime;
- jcr->jr.JobErrors = jcr->Errors;
+ jcr->jr.JobErrors = jcr->JobErrors;
if (!db_update_job_end_record(jcr, jcr->db, &jcr->jr)) {
Jmsg(jcr, M_WARNING, 0, _("Error updating job record. %s"),
db_strerror(jcr->db));
len = strlen(dt) + 5; /* dt + .%02d EOS */
bstrncpy(name, base_name, sizeof(name));
name[sizeof(name)-len] = 0; /* truncate if too long */
- bsnprintf(jcr->Job, sizeof(jcr->Job), "%s.%s.%02d", name, dt, seq); /* add date & time */
+ bsnprintf(jcr->Job, sizeof(jcr->Job), "%s.%s_%02d", name, dt, seq); /* add date & time */
/* Convert spaces into underscores */
for (p=jcr->Job; *p; p++) {
if (*p == ' ') {
if (jcr->JobId != 0)
write_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
+ free_plugins(jcr); /* release instantiated plugins */
+
Dmsg0(200, "End dird free_jcr\n");
}
parse_ua_args(ua); /* parse command */
int stat = run_cmd(ua, ua->cmd);
if (stat == 0) {
- Jmsg(jcr, M_ERROR, 0, _("Could not start clone job.\n"));
+ Jmsg(jcr, M_ERROR, 0, _("Could not start clone job: \"%s\".\n"),
+ ua->cmd);
} else {
Jmsg(jcr, M_INFO, 0, _("Clone JobId %d started.\n"), stat);
}
/*
* Given: a JobId in jcr->previous_jr.JobId,
* this subroutine writes a bsr file to restore that job.
+ * Returns: -1 on error
+ * number of files if OK
*/
-bool create_restore_bootstrap_file(JCR *jcr)
+int create_restore_bootstrap_file(JCR *jcr)
{
RESTORE_CTX rx;
UAContext *ua;
+ int files;
+
memset(&rx, 0, sizeof(rx));
rx.bsr = new_bsr();
rx.JobIds = (char *)"";
rx.bsr->JobId = jcr->previous_jr.JobId;
ua = new_ua_context(jcr);
- complete_bsr(ua, rx.bsr);
+ if (!complete_bsr(ua, rx.bsr)) {
+ files = -1;
+ goto bail_out;
+ }
rx.bsr->fi = new_findex();
rx.bsr->fi->findex = 1;
rx.bsr->fi->findex2 = jcr->previous_jr.JobFiles;
jcr->ExpectedFiles = write_bsr_file(ua, rx);
if (jcr->ExpectedFiles == 0) {
- free_ua_context(ua);
- free_bsr(rx.bsr);
- return false;
+ files = 0;
+ goto bail_out;
}
free_ua_context(ua);
free_bsr(rx.bsr);
jcr->needs_sd = true;
- return true;
+ return jcr->ExpectedFiles;
+
+bail_out:
+ free_ua_context(ua);
+ free_bsr(rx.bsr);
+ return files;
}
/* TODO: redirect command ouput to job log */
-bool run_console_command(JCR *jcr, const char *cmd){
+bool run_console_command(JCR *jcr, const char *cmd)
+{
UAContext *ua;
bool ok;
JCR *ljcr = new_control_jcr("-RunScript-", JT_CONSOLE);