/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2011 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
+ modify it under the terms of version three of the GNU Affero General Public
License as published by the Free Software Foundation and included
in the file LICENSE.
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
+ You should have received a copy of the GNU Affero 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.
*
* Kern Sibbald, MM
*
- * Version $Id$
- *
*/
#include "bacula.h"
extern bool do_mac(JCR *jcr);
/* Requests from the Director daemon */
+/* Added in 3.1.4 14Sep09 KES */
static char jobcmd[] = "JobId=%d job=%127s job_name=%127s client_name=%127s "
"type=%d level=%d FileSet=%127s NoAttr=%d SpoolAttr=%d FileSetMD5=%127s "
- "SpoolData=%d WritePartAfterJob=%d PreferMountedVols=%d SpoolSize=%s\n";
-static char oldjobcmd[] = "JobId=%d job=%127s job_name=%127s client_name=%127s "
- "type=%d level=%d FileSet=%127s NoAttr=%d SpoolAttr=%d FileSetMD5=%127s "
- "SpoolData=%d WritePartAfterJob=%d PreferMountedVols=%d\n";
-
-
+ "SpoolData=%d WritePartAfterJob=%d PreferMountedVols=%d SpoolSize=%s "
+ "rerunning=%d VolSessionId=%d VolSessionTime=%d\n";
/* Responses sent to Director daemon */
static char OKjob[] = "3000 OK Job SDid=%u SDtime=%u Authorization=%s\n";
static char BAD_job[] = "3915 Bad Job command. stat=%d CMD: %s\n";
-//static char OK_query[] = "3001 OK query\n";
-//static char NO_query[] = "3918 Query failed\n";
-//static char BAD_query[] = "3917 Bad query command: %s\n";
/*
* Director requests us to start a job
*/
bool job_cmd(JCR *jcr)
{
- int JobId;
+ int32_t JobId;
char auth_key[100];
char spool_size[30];
char seed[100];
BSOCK *dir = jcr->dir_bsock;
POOL_MEM job_name, client_name, job, fileset_name, fileset_md5;
- int JobType, level, spool_attributes, no_attributes, spool_data;
- int write_part_after_job, PreferMountedVols;
+ int32_t JobType, level, spool_attributes, no_attributes, spool_data;
+ int32_t write_part_after_job, PreferMountedVols;
int stat;
JCR *ojcr;
client_name.c_str(),
&JobType, &level, fileset_name.c_str(), &no_attributes,
&spool_attributes, fileset_md5.c_str(), &spool_data,
- &write_part_after_job, &PreferMountedVols, spool_size);
- if (stat != 14) {
- /* Try old version */
- stat = sscanf(dir->msg, oldjobcmd, &JobId, job.c_str(), job_name.c_str(),
- client_name.c_str(),
- &JobType, &level, fileset_name.c_str(), &no_attributes,
- &spool_attributes, fileset_md5.c_str(), &spool_data,
- &write_part_after_job, &PreferMountedVols);
- if (stat != 13) {
- pm_strcpy(jcr->errmsg, dir->msg);
- dir->fsend(BAD_job, stat, jcr->errmsg);
- Dmsg1(100, ">dird: %s", dir->msg);
- set_jcr_job_status(jcr, JS_ErrorTerminated);
- return false;
- }
+ &write_part_after_job, &PreferMountedVols, spool_size,
+ &jcr->rerunning, &jcr->VolSessionId, &jcr->VolSessionTime);
+ if (stat != 17) {
+ pm_strcpy(jcr->errmsg, dir->msg);
+ dir->fsend(BAD_job, stat, jcr->errmsg);
+ Dmsg1(100, ">dird: %s", dir->msg);
+ jcr->setJobStatus(JS_ErrorTerminated);
+ return false;
}
+ Dmsg3(100, "==== rerunning=%d VolSesId=%d VolSesTime=%d\n", jcr->rerunning,
+ jcr->VolSessionId, jcr->VolSessionTime);
/*
* Since this job could be rescheduled, we
* check to see if we have it already. If so
*/
ojcr = get_jcr_by_full_name(job.c_str());
if (ojcr && !ojcr->authenticated) {
- Dmsg2(100, "Found ojcr=0x%x Job %s\n", (unsigned)(long)ojcr, job.c_str());
+ Dmsg2(100, "Found ojcr=0x%x Job %s\n", (unsigned)(intptr_t)ojcr, job.c_str());
free_jcr(ojcr);
}
jcr->JobId = JobId;
- jcr->VolSessionId = newVolSessionId();
- jcr->VolSessionTime = VolSessionTime;
+ Dmsg2(800, "Start JobId=%d %p\n", JobId, jcr);
+ /*
+ * If job rescheduled because previous was incomplete,
+ * the Resched flag is set and VolSessionId and VolSessionTime
+ * are given to us (same as restarted job).
+ */
+ if (!jcr->rerunning) {
+ jcr->VolSessionId = newVolSessionId();
+ jcr->VolSessionTime = VolSessionTime;
+ }
bstrncpy(jcr->Job, job, sizeof(jcr->Job));
unbash_spaces(job_name);
jcr->job_name = get_pool_memory(PM_NAME);
unbash_spaces(fileset_name);
jcr->fileset_name = get_pool_memory(PM_NAME);
pm_strcpy(jcr->fileset_name, fileset_name);
- jcr->set_JobType(JobType);
- jcr->set_JobLevel(level);
+ jcr->setJobType(JobType);
+ jcr->setJobLevel(level);
jcr->no_attributes = no_attributes;
jcr->spool_attributes = spool_attributes;
jcr->spool_data = spool_data;
pm_strcpy(jcr->fileset_md5, fileset_md5);
jcr->PreferMountedVols = PreferMountedVols;
+
jcr->authenticated = false;
- jcr->need_fd = true;
/*
* Pass back an authorization key for the File daemon
Dmsg2(50, ">dird jid=%u: %s", (uint32_t)jcr->JobId, dir->msg);
jcr->sd_auth_key = bstrdup(auth_key);
memset(auth_key, 0, sizeof(auth_key));
+ new_plugins(jcr); /* instantiate the plugins */
generate_daemon_event(jcr, "JobStart");
+ generate_plugin_event(jcr, bsdEventJobStart, (void *)"JobStart");
return true;
}
struct timespec timeout;
int errstat = 0;
- Dsm_check(1);
+ Dsm_check(200);
Dmsg1(200, "Run_cmd: %s\n", jcr->dir_bsock->msg);
/* If we do not need the FD, we are doing a migrate, copy, or virtual
* backup.
*/
- if (!jcr->need_fd) {
+ if (jcr->no_client_used()) {
do_mac(jcr);
return false;
}
- set_jcr_job_status(jcr, JS_WaitFD); /* wait for FD to connect */
- dir_send_job_status(jcr);
+ jcr->sendJobStatus(JS_WaitFD); /* wait for FD to connect */
gettimeofday(&tv, &tz);
timeout.tv_nsec = tv.tv_usec * 1000;
Dmsg3(50, "%s waiting %d sec for FD to contact SD key=%s\n",
jcr->Job, (int)(timeout.tv_sec-time(NULL)), jcr->sd_auth_key);
+ Dmsg2(800, "Wait FD for jid=%d %p\n", jcr->JobId, jcr);
/*
* Wait for the File daemon to contact us to start the Job,
if (errstat == ETIMEDOUT || errstat == EINVAL || errstat == EPERM) {
break;
}
+ Dmsg1(800, "=== Auth cond errstat=%d\n", errstat);
}
Dmsg3(50, "Auth=%d canceled=%d errstat=%d\n", jcr->authenticated,
job_canceled(jcr), errstat);
V(mutex);
+ Dmsg2(800, "Auth fail or cancel for jid=%d %p\n", jcr->JobId, jcr);
memset(jcr->sd_auth_key, 0, strlen(jcr->sd_auth_key));
if (jcr->authenticated && !job_canceled(jcr)) {
- Dmsg1(50, "Running job %s\n", jcr->Job);
+ Dmsg2(800, "Running jid=%d %p\n", jcr->JobId, jcr);
run_job(jcr); /* Run the job */
}
+ Dmsg2(800, "Done jid=%d %p\n", jcr->JobId, jcr);
return false;
}
}
if (!jcr->authenticated) {
- set_jcr_job_status(jcr, JS_ErrorTerminated);
+ jcr->setJobStatus(JS_ErrorTerminated);
}
pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */
free_jcr(jcr);
*/
void stored_free_jcr(JCR *jcr)
{
- Dmsg1(900, "stored_free_jcr JobId=%u\n", jcr->JobId);
+ Dmsg2(800, "End Job JobId=%u %p\n", jcr->JobId, jcr);
+ if (jcr->dir_bsock) {
+ Dmsg2(800, "Send terminate jid=%d %p\n", jcr->JobId, jcr);
+ jcr->dir_bsock->signal(BNET_EOD);
+ jcr->dir_bsock->signal(BNET_TERMINATE);
+ }
if (jcr->file_bsock) {
jcr->file_bsock->close();
jcr->file_bsock = NULL;
delete jcr->write_store;
jcr->write_store = NULL;
}
- Dsm_check(1);
+ Dsm_check(200);
if (jcr->JobId != 0)
write_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));