]> git.sur5r.net Git - bacula/bacula/commitdiff
Fix #4996 about MaxRunTime canceling the job too early
authorEric Bollengier <eric@baculasystems.com>
Tue, 25 Sep 2012 10:16:17 +0000 (12:16 +0200)
committerKern Sibbald <kern@sibbald.com>
Sat, 20 Apr 2013 12:51:02 +0000 (14:51 +0200)
bacula/src/dird/backup.c
bacula/src/dird/job.c
bacula/src/dird/migrate.c
bacula/src/dird/restore.c
bacula/src/dird/vbackup.c
bacula/src/jcr.h
bacula/src/lib/jcr.c

index 77a3845e2d9a87b83f7e9c93bbbbb06589faf8ff..65d5803d3bdb117b3fe1dd073b394ea6772e2eba 100644 (file)
@@ -418,6 +418,10 @@ bool do_backup(JCR *jcr)
       goto bail_out;
    }
 
+   /* Declare the job started to start the MaxRunTime check */
+   jcr->setJobStarted();
+
+   /* Send and run the RunBefore */
    if (!send_runscripts_commands(jcr)) {
       goto bail_out;
    }
index dae019bc7cf0552474dc2e543946319e0800ef9d..9865e373dbde249fd7c0699c2de0f5cad5aebc3b 100644 (file)
@@ -611,7 +611,7 @@ static bool job_check_maxruntime(JCR *jcr)
    JOB *job = jcr->job;
    utime_t run_time;
 
-   if (job_canceled(jcr) || jcr->JobStatus == JS_Created) {
+   if (job_canceled(jcr) || !jcr->job_started) {
       return false;
    }
    if (jcr->job->MaxRunTime == 0 && job->FullMaxRunTime == 0 &&
index 519392114562c1242ab90d61f3d6f5aabfbd5c24..c4738eada91511cf2855934f83b3d45df095a233 100644 (file)
@@ -365,6 +365,8 @@ bool do_migration(JCR *jcr)
    }
    Dmsg0(150, "Storage daemon connection OK\n");
 
+   /* Declare the job started to start the MaxRunTime check */
+   jcr->setJobStarted();
 
    /*    
     * We re-update the job start record so that the start
index 0a8945afd9f2770d3c097bb7e963bbce2ab09149..eee86be879dfaefe9cae0d53f6292582de95b71a 100644 (file)
@@ -432,6 +432,9 @@ bool restore_bootstrap(JCR *jcr)
          goto bail_out;
       }
 
+      /* Declare the job started to start the MaxRunTime check */
+      jcr->setJobStarted();
+
       /* Only pass "global" commands to the FD once */
       if (first_time) {
          first_time = false;
index f24f9d61b2ed3c8480344d6658266b4f1891b5cb..2babd36d0df387fa37c89ed6e6d1a9dd086e4a18 100644 (file)
@@ -232,6 +232,9 @@ _("This Job is not an Accurate backup so is not equivalent to a Full backup.\n")
       return false;
    }
 
+   /* Declare the job started to start the MaxRunTime check */
+   jcr->setJobStarted();
+
    /*
     * Start the job prior to starting the message thread below
     * to avoid two threads from using the BSOCK structure at
index a017d1b04d270209f10f7fa11d60dcd3efb7cfd2..0ff93ab0c36a5ea56ddc11d08ed4652b90741cad 100644 (file)
@@ -118,6 +118,7 @@ enum {
   )
 
 #define job_waiting(jcr) \
+ (jcr->job_started &&    \
   (jcr->JobStatus == JS_WaitFD       || \
    jcr->JobStatus == JS_WaitSD       || \
    jcr->JobStatus == JS_WaitMedia    || \
@@ -130,7 +131,7 @@ enum {
    jcr->SDJobStatus == JS_WaitMedia  || \
    jcr->SDJobStatus == JS_WaitMount  || \
    jcr->SDJobStatus == JS_WaitDevice || \
-   jcr->SDJobStatus == JS_WaitMaxJobs)
+   jcr->SDJobStatus == JS_WaitMaxJobs))
 
 
 
@@ -199,6 +200,7 @@ public:
    void setJobLevel(int32_t JobLevel) { m_JobLevel = JobLevel; };
    void setJobType(int32_t JobType) { m_JobType = JobType; };
    void forceJobStatus(int32_t aJobStatus) { JobStatus = aJobStatus; };
+   void setJobStarted();
    int32_t getJobType() const { return m_JobType; };
    int32_t getJobLevel() const { return m_JobLevel; };
    int32_t getJobStatus() const { return JobStatus; };
@@ -253,6 +255,7 @@ public:
    time_t end_time;                   /* job end time */
    time_t wait_time_sum;              /* cumulative wait time since job start */
    time_t wait_time;                  /* timestamp when job have started to wait */
+   time_t job_started_time;           /* Time when the MaxRunTime start to count */
    POOLMEM *client_name;              /* client name */
    POOLMEM *JobIds;                   /* User entered string of JobIds */
    POOLMEM *RestoreBootstrap;         /* Bootstrap file to restore */
@@ -276,6 +279,7 @@ public:
    bool accurate;                     /* true if job is accurate */
    bool HasBase;                      /* True if job use base jobs */
    bool rerunning;                    /* rerunning an incomplete job */
+   bool job_started;                  /* Set when the job is actually started */
 
    void *Python_job;                  /* Python Job Object */
    void *Python_events;               /* Python Events Object */
index d895ba13ccfb982e6eaf14bc7ae7fc2709c4d0fd..53679c4c83f7100787be7f51ed3b52820248afa4 100644 (file)
@@ -892,6 +892,12 @@ bool JCR::sendJobStatus(int newJobStatus)
    return true; 
 }
 
+void JCR::setJobStarted()
+{
+   JCR *jcr = this;
+   jcr->job_started = true;
+   jcr->job_started_time = time(NULL);
+}
 
 void JCR::setJobStatus(int newJobStatus)
 {