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

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Tue May 13 14:31:49 PDT 2014


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