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

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Thu May 15 06:30:55 PDT 2014


On Thu, May 15, 2014 at 10:40:48AM +0200, Jimmy Assarsson wrote:
> Now I've tested it, and it fixed the problem :)
Great, thanks for testing. I'll push it to master then.

Zbyszek

> 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