[systemd-devel] systemd freezes after rshd execution, if network connection is down

Jimmy Assarsson jimmy.assarsson at axis.com
Thu May 15 01:40:48 PDT 2014


Now I've tested it, and it fixed the problem :)

Thanks,
Jimmy

On Tue, May 13, 2014 at 11:31 PM, Zbigniew Jędrzejewski-Szmek
<zbyszek at in.waw.pl> wrote:
> On Tue, May 13, 2014 at 07:40:53PM +0200, Umut Tezduyar Lindskog wrote:
>> It is also reproducible by just loosing the carrier on the link. Maybe new
>> async close is a candidate to solve it.
>>
>> On Tuesday, April 29, 2014, Harald Hoyer <harald.hoyer at gmail.com> wrote:
>>
>> > Am 28.04.2014 13:33, schrieb Jimmy Assarsson:
>> > > Hi,
>> > >
>> > > We stumbled upon a freeze/block in systemd.
>> > > The problem occurs when a rshd (socket activated) execution is
>> > completed, the network connection is down and systemd is closing the socket.
>> > > This causes a long (60 seconds) freeze where it's not possible to
>> > communicate with systemd.
>> > > Do you have any idea on what is causing this or how we can investigate
>> > this further?
> Can you check if this patch fixes the problem:
>
> -----------------&<---------------------------------------------
> Subject: [PATCH] core: close socket fds asynchronously
>
> http://lists.freedesktop.org/archives/systemd-devel/2014-April/018928.html
> ---
>  src/core/service.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/src/core/service.c b/src/core/service.c
> index 694a265..7461ec3 100644
> --- a/src/core/service.c
> +++ b/src/core/service.c
> @@ -27,6 +27,7 @@
>  #include <linux/reboot.h>
>  #include <sys/syscall.h>
>
> +#include "async.h"
>  #include "manager.h"
>  #include "unit.h"
>  #include "service.h"
> @@ -222,7 +223,7 @@ static void service_close_socket_fd(Service *s) {
>          if (s->socket_fd < 0)
>                  return;
>
> -        s->socket_fd = safe_close(s->socket_fd);
> +        s->socket_fd = asynchronous_close(s->socket_fd);
>  }
>
>  static void service_connection_unref(Service *s) {
> @@ -2705,7 +2706,7 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
>                          log_debug_unit(u->id, "Failed to parse socket-fd value %s", value);
>                  else {
>
> -                        safe_close(s->socket_fd);
> +                        asynchronous_close(s->socket_fd);
>                          s->socket_fd = fdset_remove(fds, fd);
>                  }
>          } else if (streq(key, "main-exec-status-pid")) {
> --
> 1.9.0
> ----------------->&---------------------------------------------
>
> Thanks,
> Zbyszek


More information about the systemd-devel mailing list