Public bug reported:

While testing the portmap daemon's recent changes in Ubuntu which cause
statd to properly follow it on stop/start, I tried to restart portmap,
only to find that it was not in fact restarted.

This happens with any job that has a pre-stop. The reason is that in
job_restart(), the code does this:


    job_change_goal (job, JOB_STOP);
    job_change_goal (job, JOB_START);

job_change_goal will return as soon as the *first* state change has been
completed. If there is no pre-stop, that is the change from JOB_RUNNING
to JOB_KILLED, which does dutifully kill the main process.

However, if there is a pre-stop, the pre-stop is run, but then
job_change_state returns to job_change_goal, which then returns to
job_restart, which then changes the goal back to start, which makes the
new job_next_state() one that will bypass the change to JOB_KILLED.

This was found on upstart v0.6.7-3 in Ubuntu, but also exists in the
code in the current trunk.

TEST CASE

1. create job file /etc/init/test-restart-prestop.conf  with this content:
# test-restart-prestop

pre-stop exec /bin/true

exec /bin/sleep 3600
2. run "start test-restart-prestop" -- record pid of job
3. immediately run "restart test-restart-prestop" -- if bug is present, pid 
remains the same when it should be a new pid.

** Affects: upstart
     Importance: Undecided
         Status: New

** Affects: upstart (Ubuntu)
     Importance: Undecided
         Status: New

** Also affects: upstart (Ubuntu)
   Importance: Undecided
       Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/703800

Title:
  restart command fails to restart main process when pre-stop stanza
  exists

-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to