Index: src/dird/getmsg.c
===================================================================
--- src/dird/getmsg.c (révision 4696)
+++ src/dird/getmsg.c (copie de travail)
@@ -70,6 +70,33 @@
static char OK_msg[] = "1000 OK\n";
+
+void set_jcr_sd_job_status(JCR *jcr, int SDJobStatus)
+{
+ bool set_waittime=false;
+ Dmsg2(800, "set_jcr_sd_job_status(%s, %c)\n", jcr->Job, SDJobStatus);
+ /* if wait state is new, we keep current time for watchdog MaxWaitTime */
+ switch (SDJobStatus) {
+ case JS_WaitMedia:
+ case JS_WaitMount:
+ case JS_WaitMaxJobs:
+ set_waittime = true;
+ default:
+ break;
+ }
+
+ if (job_waiting(jcr)) {
+ set_waittime = false;
+ }
+
+ if (set_waittime) {
+ /* set it before JobStatus */
+ Dmsg0(800, "Setting wait_time\n");
+ jcr->wait_time = time(NULL);
+ }
+ jcr->SDJobStatus = SDJobStatus;
+}
+
/*
* Get a message
* Call appropriate processing routine
@@ -230,7 +257,7 @@
int JobStatus;
char Job[MAX_NAME_LENGTH];
if (sscanf(bs->msg, Job_status, &Job, &JobStatus) == 2) {
- jcr->SDJobStatus = JobStatus; /* current status */
+ set_jcr_sd_job_status(jcr,JobStatus); /* current status */
} else {
Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
}
Index: src/dird/job.c
===================================================================
--- src/dird/job.c (révision 4696)
+++ src/dird/job.c (copie de travail)
@@ -484,24 +484,25 @@
bool cancel = false;
JOB *job = jcr->job;
- if (job_canceled(jcr)) {
- return false; /* already canceled */
+ if (!job_waiting(jcr)) {
+ return false;
}
if (job->MaxWaitTime == 0 && job->FullMaxWaitTime == 0 &&
job->IncMaxWaitTime == 0 && job->DiffMaxWaitTime == 0) {
return false;
}
+ Dmsg3(20, "check maxwaittime %u - %u >= %u\n", watchdog_time, jcr->wait_time, job->MaxWaitTime);
if (jcr->JobLevel == L_FULL && job->FullMaxWaitTime != 0 &&
- (watchdog_time - jcr->start_time) >= job->FullMaxWaitTime) {
+ (watchdog_time - jcr->wait_time) >= job->FullMaxWaitTime) {
cancel = true;
} else if (jcr->JobLevel == L_DIFFERENTIAL && job->DiffMaxWaitTime != 0 &&
- (watchdog_time - jcr->start_time) >= job->DiffMaxWaitTime) {
+ (watchdog_time - jcr->wait_time) >= job->DiffMaxWaitTime) {
cancel = true;
} else if (jcr->JobLevel == L_INCREMENTAL && job->IncMaxWaitTime != 0 &&
- (watchdog_time - jcr->start_time) >= job->IncMaxWaitTime) {
+ (watchdog_time - jcr->wait_time) >= job->IncMaxWaitTime) {
cancel = true;
} else if (job->MaxWaitTime != 0 &&
- (watchdog_time - jcr->start_time) >= job->MaxWaitTime) {
+ (watchdog_time - jcr->wait_time) >= job->MaxWaitTime) {
cancel = true;
}
Index: src/dird/dird_conf.c
===================================================================
--- src/dird/dird_conf.c (révision 4696)
+++ src/dird/dird_conf.c (copie de travail)
@@ -627,6 +627,15 @@
if (res->res_job.WriteBootstrap) {
sendit(sock, _(" --> WriteBootstrap=%s\n"), NPRT(res->res_job.WriteBootstrap));
}
+ if (res->res_job.MaxRunTime) {
+ sendit(sock, _(" --> MaxRunTime=%u\n"), res->res_job.MaxRunTime);
+ }
+ if (res->res_job.MaxWaitTime) {
+ sendit(sock, _(" --> MaxWaitTime=%u\n"), res->res_job.MaxWaitTime);
+ }
+ if (res->res_job.MaxStartDelay) {
+ sendit(sock, _(" --> MaxStartDelay=%u\n"), res->res_job.MaxStartDelay);
+ }
if (res->res_job.storage) {
STORE *store;
foreach_alist(store, res->res_job.storage) {
Index: src/jcr.h
===================================================================
--- src/jcr.h (révision 4696)
+++ src/jcr.h (copie de travail)
@@ -105,6 +105,22 @@
jcr->JobStatus == JS_ErrorTerminated || \
jcr->JobStatus == JS_FatalError)
+#define job_waiting(jcr) \
+ (jcr->JobStatus == JS_WaitFD || \
+ jcr->JobStatus == JS_WaitSD || \
+ jcr->JobStatus == JS_WaitMedia || \
+ jcr->JobStatus == JS_WaitMount || \
+ jcr->JobStatus == JS_WaitStoreRes || \
+ jcr->JobStatus == JS_WaitJobRes || \
+ jcr->JobStatus == JS_WaitClientRes|| \
+ jcr->JobStatus == JS_WaitMaxJobs || \
+ jcr->JobStatus == JS_WaitPriority || \
+ jcr->SDJobStatus == JS_WaitMedia || \
+ jcr->SDJobStatus == JS_WaitMount || \
+ jcr->SDJobStatus == JS_WaitMaxJobs)
+
+
+
#define foreach_jcr(jcr) \
for (jcr=jcr_walk_start(); jcr; (jcr=jcr_walk_next(jcr)) )
@@ -166,6 +182,7 @@
time_t start_time; /* when job actually started */
time_t run_time; /* used for computing speed */
time_t end_time; /* job end time */
+ time_t wait_time; /* when job have started to wait */
POOLMEM *client_name; /* client name */
POOLMEM *RestoreBootstrap; /* Bootstrap file to restore */
POOLMEM *stime; /* start time for incremental/differential */
Index: src/lib/jcr.c
===================================================================
--- src/lib/jcr.c (révision 4696)
+++ src/lib/jcr.c (copie de travail)
@@ -546,18 +546,54 @@
void set_jcr_job_status(JCR *jcr, int JobStatus)
{
+ bool set_waittime=false;
+ Dmsg2(800, "set_jcr_job_status(%s, %c)\n", jcr->Job, JobStatus);
+ /* if wait state is new, we keep current time for watchdog MaxWaitTime */
+ switch (JobStatus) {
+ case JS_WaitFD:
+ case JS_WaitSD:
+ case JS_WaitMedia:
+ case JS_WaitMount:
+ case JS_WaitStoreRes:
+ case JS_WaitJobRes:
+ case JS_WaitClientRes:
+ case JS_WaitMaxJobs:
+ case JS_WaitPriority:
+ set_waittime = true;
+ default:
+ break;
+ }
+
+ switch (jcr->JobStatus) {
/*
* For a set of errors, ... keep the current status
* so it isn't lost. For all others, set it.
*/
- switch (jcr->JobStatus) {
case JS_ErrorTerminated:
case JS_Error:
case JS_FatalError:
case JS_Differences:
case JS_Canceled:
break;
+ /*
+ * For a set of Wait situation, keep old time.
+ */
+ case JS_WaitFD:
+ case JS_WaitSD:
+ case JS_WaitMedia:
+ case JS_WaitMount:
+ case JS_WaitStoreRes:
+ case JS_WaitJobRes:
+ case JS_WaitClientRes:
+ case JS_WaitMaxJobs:
+ case JS_WaitPriority:
+ set_waittime = false; /* keep old time */
default:
+ if (set_waittime) {
+ /* set it before JobStatus */
+ Dmsg0(800, "Setting wait_time\n");
+ jcr->wait_time = time(NULL);
+ }
jcr->JobStatus = JobStatus;
}
}
syntax highlighted by Code2HTML, v. 0.9.1