|
@@ -179,14 +179,25 @@ def _select(readers=None, writers=None, err=None, timeout=0,
|
|
try:
|
|
try:
|
|
return poll(readers, writers, err, timeout)
|
|
return poll(readers, writers, err, timeout)
|
|
except (select.error, socket.error) as exc:
|
|
except (select.error, socket.error) as exc:
|
|
- if exc.errno == errno.EINTR:
|
|
|
|
|
|
+ # Workaround for celery/celery#4513
|
|
|
|
+ try:
|
|
|
|
+ errno = exc.errno
|
|
|
|
+ except AttributeError:
|
|
|
|
+ errno = exc.args[0]
|
|
|
|
+
|
|
|
|
+ if errno == errno.EINTR:
|
|
return set(), set(), 1
|
|
return set(), set(), 1
|
|
- elif exc.errno in SELECT_BAD_FD:
|
|
|
|
|
|
+ elif errno in SELECT_BAD_FD:
|
|
for fd in readers | writers | err:
|
|
for fd in readers | writers | err:
|
|
try:
|
|
try:
|
|
select.select([fd], [], [], 0)
|
|
select.select([fd], [], [], 0)
|
|
except (select.error, socket.error) as exc:
|
|
except (select.error, socket.error) as exc:
|
|
- if getattr(exc, 'errno', None) not in SELECT_BAD_FD:
|
|
|
|
|
|
+ try:
|
|
|
|
+ errno = exc.errno
|
|
|
|
+ except AttributeError:
|
|
|
|
+ errno = exc.args[0]
|
|
|
|
+
|
|
|
|
+ if errno not in SELECT_BAD_FD:
|
|
raise
|
|
raise
|
|
readers.discard(fd)
|
|
readers.discard(fd)
|
|
writers.discard(fd)
|
|
writers.discard(fd)
|