Retry sock.recv() when it raises EINTR

This commit is contained in:
INADA Naoki
2015-05-11 18:34:24 +09:00
parent 767c47ec30
commit 15e2bce474

View File

@@ -69,7 +69,7 @@ Best Practices:
__author__ = "Charles Gordon" __author__ = "Charles Gordon"
import errno
import socket import socket
import six import six
@@ -1056,7 +1056,7 @@ def _readline(sock, buf):
chunks.append(buf) chunks.append(buf)
last_char = buf[-1:] last_char = buf[-1:]
buf = sock.recv(RECV_SIZE) buf = _recv(sock, RECV_SIZE)
if not buf: if not buf:
raise MemcacheUnexpectedCloseError() raise MemcacheUnexpectedCloseError()
@@ -1087,7 +1087,7 @@ def _readvalue(sock, buf, size):
if buf: if buf:
rlen -= len(buf) rlen -= len(buf)
chunks.append(buf) chunks.append(buf)
buf = sock.recv(RECV_SIZE) buf = _recv(sock, RECV_SIZE)
if not buf: if not buf:
raise MemcacheUnexpectedCloseError() raise MemcacheUnexpectedCloseError()
@@ -1104,3 +1104,13 @@ def _readvalue(sock, buf, size):
chunks.append(buf[:rlen - 2]) chunks.append(buf[:rlen - 2])
return buf[rlen:], b''.join(chunks) return buf[rlen:], b''.join(chunks)
def _recv(sock, size):
"""sock.recv() with retry on EINTR"""
while True:
try:
return sock.recv(size)
except IOError as e:
if e.errno != errno.EINTR:
raise