Skip to content

Commit 830966b

Browse files
committed
unix: don't crash listener if remote end disconnects.
In some scenarios, Ansible's worker seems to exit early, resulting in EPIPE during .recv() or .send(). Log an error and gracefully disconnect in that case.
1 parent 80a18e1 commit 830966b

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

mitogen/unix.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,22 +78,39 @@ def __init__(self, router, path=None, backlog=100):
7878
self.receive_side = mitogen.core.Side(self, self._sock.fileno())
7979
router.broker.start_receive(self)
8080

81-
def on_receive(self, broker):
82-
sock, _ = self._sock.accept()
81+
def _accept_client(self, sock):
8382
sock.setblocking(True)
84-
pid, = struct.unpack('>L', sock.recv(4))
83+
try:
84+
pid, = struct.unpack('>L', sock.recv(4))
85+
except socket.error:
86+
LOG.error('%r: failed to read remote identity: %s',
87+
self, sys.exc_info()[1])
88+
return
8589

8690
context_id = self._router.id_allocator.allocate()
8791
context = mitogen.parent.Context(self._router, context_id)
8892
stream = mitogen.core.Stream(self._router, context_id)
89-
stream.accept(sock.fileno(), sock.fileno())
9093
stream.name = u'unix_client.%d' % (pid,)
9194
stream.auth_id = mitogen.context_id
9295
stream.is_privileged = True
96+
97+
try:
98+
sock.send(struct.pack('>LLL', context_id, mitogen.context_id,
99+
os.getpid()))
100+
except socket.error:
101+
LOG.error('%r: failed to assign identity to PID %d: %s',
102+
self, pid, sys.exc_info()[1])
103+
return
104+
105+
stream.accept(sock.fileno(), sock.fileno())
93106
self._router.register(context, stream)
94-
sock.send(struct.pack('>LLL', context_id, mitogen.context_id,
95-
os.getpid()))
96-
sock.close()
107+
108+
def on_receive(self, broker):
109+
sock, _ = self._sock.accept()
110+
try:
111+
self._accept_client(sock)
112+
finally:
113+
sock.close()
97114

98115

99116
def connect(path, broker=None):

0 commit comments

Comments
 (0)