[systemd-devel] [PATCH] Fix timeout when stopping Type=notify service

Andrey Borzenkov arvidjaar at gmail.com
Fri Sep 20 23:10:13 PDT 2013


В Fri, 20 Sep 2013 22:53:52 +0200
Olivier Brunel <jjk at jjacky.com> пишет:

> Since 41efeaec a call to service_unwatch_main_pid() is done from
> service_set_main_pid(), which is called upon receiving message MAINPID=
> 
> This had the side effect of not watching pid anymore, and would result in a
> useless timeout when stopping the service, as the unit wouldn't be identified
> from the pid, so not marked stopped which would result in systemd thinking this
> was a timeout.

I confirm that this fixed timeout stopping user manager during shutdown
I observed on openSUSE 13.1 Beta1:
https://bugzilla.novell.com/show_bug.cgi?id=841544 

> ---
> I'm not exactly familiar with systemd's internals, so this might not be the
> correct way to fix this, please correct me if it isn't.
> 
>  src/core/service.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/src/core/service.c b/src/core/service.c
> index 246a86e..1dccdff 100644
> --- a/src/core/service.c
> +++ b/src/core/service.c
> @@ -3388,9 +3388,17 @@ static void service_notify_message(Unit *u, pid_t pid, char **tags) {
>                          log_warning_unit(u->id,
>                                           "Failed to parse notification message %s", e);
>                  else {
> +                        int r;
> +
>                          log_debug_unit(u->id,
>                                         "%s: got %s", u->id, e);
>                          service_set_main_pid(s, pid);

You probably should sanity check return status and proceed with
unit_watch_pid only if it succeeded. It is not clear what should be
done if it failed - it means service returned bogus value in
notification message, in which case the only logical step is to stop
it as it cannot be trusted anymore? 

> +                        r = unit_watch_pid(u, pid);
> +                        if (r < 0)
> +                                /* FIXME: we need to do something here */
> +                                log_warning_unit(u->id,
> +                                                 "Failed to watch PID %lu from service %s",
> +                                                 (unsigned long) pid, u->id);
>                  }
>          }
>  



More information about the systemd-devel mailing list