Repository navigation
socket.timeout with will cause api client to become unuseable #563
Copy link
Copy link
Closed
Labels
🚨This issue needs some love.This issue needs some love.priority: p2Moderately-important priority. Fix may not be included in next release.Moderately-important priority. Fix may not be included in next release.status: will not fixInvalid (untrue/unsound/erroneous), inconsistent with product, not on roadmap.Invalid (untrue/unsound/erroneous), inconsistent with product, not on roadmap.type: bugError or flaw in code with unintended results or allowing sub-optimal usage patterns.Error or flaw in code with unintended results or allowing sub-optimal usage patterns.
Description
We recently ran into a socket.timeout issue using the google api client, and noticed that then all our requests would fail in the same way. I later find that connections are cached here: https://github.com/httplib2/httplib2/blob/master/python3/httplib2/__init__.py#L1759
however there is no code to remove cached connections that are bad. This is a major oversight.
Here's the callstack we hit:
batch_entry.batch.execute(http=http, num_retries=num_retries)
File "/pyenv/lib/python3.6/site-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
return wrapped(*args, **kwargs)
File "/pyenv/lib/python3.6/site-packages/googleapiclient/http.py", line 1465, in execute
self._execute(http, self._order, self._requests, num_retries)
File "/pyenv/lib/python3.6/site-packages/googleapiclient/http.py", line 1394, in _execute
body=body, headers=headers)
File "/pyenv/lib/python3.6/site-packages/googleapiclient/http.py", line 185, in _retry_request
raise exception
File "/pyenv/lib/python3.6/site-packages/googleapiclient/http.py", line 165, in _retry_request
resp, content = http.request(uri, method, *args, **kwargs)
File "/pyenv/lib/python3.6/site-packages/oauth2client/transport.py", line 175, in new_request
redirections, connection_type)
File "/pyenv/lib/python3.6/site-packages/oauth2client/transport.py", line 282, in request
connection_type=connection_type)
File "/pyenv/lib/python3.6/site-packages/httplib2/__init__.py", line 1514, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File "/pyenv/lib/python3.6/site-packages/httplib2/__init__.py", line 1264, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File "/pyenv/lib/python3.6/site-packages/httplib2/__init__.py", line 1217, in _conn_request
response = conn.getresponse()
File "/usr/local/lib/python3.6/http/client.py", line 1331, in getresponse
response.begin()
File "/usr/local/lib/python3.6/http/client.py", line 297, in begin
version, status, reason = self._read_status()
File "/usr/local/lib/python3.6/http/client.py", line 258, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "/usr/local/lib/python3.6/socket.py", line 586, in readinto
return self._sock.recv_into(b)
File "/usr/local/lib/python3.6/ssl.py", line 1009, in recv_into
return self.read(nbytes, buffer)
File "/usr/local/lib/python3.6/ssl.py", line 871, in read
return self._sslobj.read(len, buffer)
File "/usr/local/lib/python3.6/ssl.py", line 631, in read
v = self._sslobj.read(len, buffer)
socket.timeout: The read operation timed out
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
🚨This issue needs some love.This issue needs some love.priority: p2Moderately-important priority. Fix may not be included in next release.Moderately-important priority. Fix may not be included in next release.status: will not fixInvalid (untrue/unsound/erroneous), inconsistent with product, not on roadmap.Invalid (untrue/unsound/erroneous), inconsistent with product, not on roadmap.type: bugError or flaw in code with unintended results or allowing sub-optimal usage patterns.Error or flaw in code with unintended results or allowing sub-optimal usage patterns.
Activity
thehesiod commentedon Aug 23, 2018
looks like this should do something similar to what's being done in the cloud-sdk retry code: http://testcompany.info/google-cloud-sdk/lib/third_party/apitools/base/py/http_wrapper.py
thehesiod commentedon Aug 23, 2018
note: a separate callstack happens via
discovery.buildthehesiod commentedon Aug 23, 2018
I think a better solution would be for httplib2 to handle most of these cases, like socket.*. Higher level errors can be handled by the google client
thehesiod commentedon Aug 23, 2018
see: httplib2/httplib2#18
busunkim96 commentedon Dec 6, 2018
This has been resolved as of httplib2 v0.12.0.
thehesiod commentedon Dec 6, 2018
actually no, it's post 0.12.0 (806de52a2939d95800e43b1ab96be45a33b882d1 vs 806de52a2939d95800e43b1ab96be45a33b882d1 for 0.12.0), supposedly 12.1. This should be re-opened
mvrozanti commentedon Dec 6, 2018
Can confirm.
Checked to see if credentials were expired but it's fine. Not sure why this is happening
Requirement already up-to-date: httplib2 in /home/nexor/.local/lib/python3.6/site-packages (0.12.0)6 remaining items
mvrozanti commentedon Dec 7, 2018
Anyone got any quickfix in the meantime? I don't seem to be able to get past authentication, ever. But the same script was working a couple days ago. quickstart.py sample also stopped working.
mvrozanti commentedon Dec 11, 2018
Magically started working again
busunkim96 commentedon Jun 10, 2019
v0.12.1 of httplib2 has been released and contains the update to clear dead connections.
echan00 commentedon Oct 7, 2019
#480
topoleov commentedon Dec 7, 2019
httplib2 v.0.14.0 error still happen
busunkim96 commentedon Dec 9, 2019
@soogly If you're experiencing this issue please open a new issue with more details on what's happening. Repository maintainers have a harder time keeping track of responses to closed issues.
Thanks!
Vmarkelov commentedon Feb 25, 2020
Hello, this error is happening multiple times a day.
The read operation timed out
Traceback (most recent call last):
File "", line 197, in
File "", line 34, in get_results
File "/usr/local/lib/python3.8/site-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
return wrapped(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/googleapiclient/http.py", line 849, in execute
resp, content = _retry_request(
File "/usr/local/lib/python3.8/site-packages/googleapiclient/http.py", line 184, in _retry_request
raise exception
File "/usr/local/lib/python3.8/site-packages/googleapiclient/http.py", line 165, in _retry_request
resp, content = http.request(uri, method, *args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/oauth2client/transport.py", line 173, in new_request
resp, content = request(orig_request_method, uri, method, body,
File "/usr/local/lib/python3.8/site-packages/oauth2client/transport.py", line 280, in request
return http_callable(uri, method=method, body=body, headers=headers,
File "/usr/local/lib/python3.8/site-packages/httplib2/init.py", line 1982, in request
(response, content) = self._request(
File "/usr/local/lib/python3.8/site-packages/httplib2/init.py", line 1650, in _request
(response, content) = self._conn_request(
File "/usr/local/lib/python3.8/site-packages/httplib2/init.py", line 1589, in _conn_request
response = conn.getresponse()
File "/usr/local/lib/python3.8/http/client.py", line 1322, in getresponse
response.begin()
File "/usr/local/lib/python3.8/http/client.py", line 303, in begin
version, status, reason = self._read_status()
File "/usr/local/lib/python3.8/http/client.py", line 264, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "/usr/local/lib/python3.8/socket.py", line 669, in readinto
return self._sock.recv_into(b)
File "/usr/local/lib/python3.8/ssl.py", line 1241, in recv_into
return self.read(nbytes, buffer)
File "/usr/local/lib/python3.8/ssl.py", line 1099, in read
return self._sslobj.read(len, buffer)
socket.timeout: The read operation timed out
Script failed.
Any suggestions how to get rid of it
Thanks
busunkim96 commentedon Feb 25, 2020
Please reference #709 to track socket timeout issues.
nulld commentedon Dec 3, 2020
After hours of hacking api code, found the solution.
Make note the order -
socket.setdefaulttimeout(timeoutInSec)needs to be before any import ofgoogleapiclient.No magic happens instead ;)