mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-25 22:30:22 -07:00
Fix the local and ssh plugins for a cornercase retrying a syscall
The bundled selectors library which is used by the local and ssh connection plugins had a bug which caused a traceback in a cornercase. If selectors were in use and a syscall was interrupted, selectors would attempt to restart the syscall after the interrupt was processed. if the attempt determined that the timeout for running the syscall had already expired, the code attempted to raise OSError. The raise was using a Python3-ism and needed to be ported to work on Python2. Fixes #41630
This commit is contained in:
parent
1fb0e11b56
commit
e2e44f846c
3 changed files with 24 additions and 8 deletions
|
@ -137,7 +137,7 @@ else:
|
|||
if expires is not None:
|
||||
current_time = monotonic()
|
||||
if current_time > expires:
|
||||
raise OSError(errno=errno.ETIMEDOUT)
|
||||
raise OSError(errno.ETIMEDOUT)
|
||||
if recalc_timeout:
|
||||
if "timeout" in kwargs:
|
||||
kwargs["timeout"] = expires - current_time
|
||||
|
@ -342,7 +342,7 @@ if hasattr(select, "select"):
|
|||
timeout = None if timeout is None else max(timeout, 0.0)
|
||||
ready = []
|
||||
r, w, _ = _syscall_wrapper(self._select, True, self._readers,
|
||||
self._writers, timeout)
|
||||
self._writers, timeout=timeout)
|
||||
r = set(r)
|
||||
w = set(w)
|
||||
for fd in r | w:
|
||||
|
@ -563,14 +563,14 @@ if hasattr(select, "kqueue"):
|
|||
select.KQ_FILTER_READ,
|
||||
select.KQ_EV_ADD)
|
||||
|
||||
_syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0)
|
||||
_syscall_wrapper(self._wrap_control, False, [kevent], 0, 0)
|
||||
|
||||
if events & EVENT_WRITE:
|
||||
kevent = select.kevent(key.fd,
|
||||
select.KQ_FILTER_WRITE,
|
||||
select.KQ_EV_ADD)
|
||||
|
||||
_syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0)
|
||||
_syscall_wrapper(self._wrap_control, False, [kevent], 0, 0)
|
||||
|
||||
return key
|
||||
|
||||
|
@ -581,7 +581,7 @@ if hasattr(select, "kqueue"):
|
|||
select.KQ_FILTER_READ,
|
||||
select.KQ_EV_DELETE)
|
||||
try:
|
||||
_syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0)
|
||||
_syscall_wrapper(self._wrap_control, False, [kevent], 0, 0)
|
||||
except SelectorError:
|
||||
pass
|
||||
if key.events & EVENT_WRITE:
|
||||
|
@ -589,7 +589,7 @@ if hasattr(select, "kqueue"):
|
|||
select.KQ_FILTER_WRITE,
|
||||
select.KQ_EV_DELETE)
|
||||
try:
|
||||
_syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0)
|
||||
_syscall_wrapper(self._wrap_control, False, [kevent], 0, 0)
|
||||
except SelectorError:
|
||||
pass
|
||||
|
||||
|
@ -602,8 +602,8 @@ if hasattr(select, "kqueue"):
|
|||
max_events = len(self._fd_to_key) * 2
|
||||
ready_fds = {}
|
||||
|
||||
kevent_list = _syscall_wrapper(self._kqueue.control, True,
|
||||
None, max_events, timeout)
|
||||
kevent_list = _syscall_wrapper(self._wrap_control, True,
|
||||
None, max_events, timeout=timeout)
|
||||
|
||||
for kevent in kevent_list:
|
||||
fd = kevent.ident
|
||||
|
@ -628,6 +628,9 @@ if hasattr(select, "kqueue"):
|
|||
self._kqueue.close()
|
||||
super(KqueueSelector, self).close()
|
||||
|
||||
def _wrap_control(self, changelist, max_events, timeout):
|
||||
return self._kqueue.control(changelist, max_events, timeout)
|
||||
|
||||
__all__.append('KqueueSelector')
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue