summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartinAltmayer <martin.altmayer@web.de>2018-07-31 14:06:12 (GMT)
committerYury Selivanov <yury@magic.io>2018-07-31 14:06:12 (GMT)
commit944451cd8d3e897138f4b43569de13cd081ee251 (patch)
tree07230ba80372c8efb6da78ac994934ad73167291
parent9c18b1ae527346bc178250ad1ca07bffdacde5dd (diff)
downloadcpython-944451cd8d3e897138f4b43569de13cd081ee251.zip
cpython-944451cd8d3e897138f4b43569de13cd081ee251.tar.gz
cpython-944451cd8d3e897138f4b43569de13cd081ee251.tar.bz2
bpo-34263 Cap timeout submitted to epoll/select etc. to one day. (GH-8532)
-rw-r--r--Doc/library/asyncio-eventloop.rst4
-rw-r--r--Lib/asyncio/base_events.py5
-rw-r--r--Misc/NEWS.d/next/Library/2018-07-28-17-00-36.bpo-34263.zUfRsu.rst2
3 files changed, 6 insertions, 5 deletions
diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst
index cf7b6d8..5b3d29d 100644
--- a/Doc/library/asyncio-eventloop.rst
+++ b/Doc/library/asyncio-eventloop.rst
@@ -173,10 +173,6 @@ Which clock is used depends on the (platform-specific) event loop
implementation; ideally it is a monotonic clock. This will generally be
a different clock than :func:`time.time`.
-.. note::
-
- Timeouts (relative *delay* or absolute *when*) should not exceed one day.
-
.. method:: AbstractEventLoop.call_later(delay, callback, *args, context=None)
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
index 75989a7..78fe2a7 100644
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -63,6 +63,9 @@ _FATAL_ERROR_IGNORE = (BrokenPipeError,
_HAS_IPv6 = hasattr(socket, 'AF_INET6')
+# Maximum timeout passed to select to avoid OS limitations
+MAXIMUM_SELECT_TIMEOUT = 24 * 3600
+
def _format_handle(handle):
cb = handle._callback
@@ -1708,7 +1711,7 @@ class BaseEventLoop(events.AbstractEventLoop):
elif self._scheduled:
# Compute the desired timeout.
when = self._scheduled[0]._when
- timeout = max(0, when - self.time())
+ timeout = min(max(0, when - self.time()), MAXIMUM_SELECT_TIMEOUT)
if self._debug and timeout != 0:
t0 = self.time()
diff --git a/Misc/NEWS.d/next/Library/2018-07-28-17-00-36.bpo-34263.zUfRsu.rst b/Misc/NEWS.d/next/Library/2018-07-28-17-00-36.bpo-34263.zUfRsu.rst
new file mode 100644
index 0000000..799463b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-07-28-17-00-36.bpo-34263.zUfRsu.rst
@@ -0,0 +1,2 @@
+asyncio's event loop will not pass timeouts longer than one day to
+epoll/select etc.