This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2011年03月15日 22:57 by brett.cannon, last changed 2022年04月11日 14:57 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| 11562.patch | mcjeff, 2011年03月17日 18:30 | review | ||
| unfakehttp.diff | nadeem.vawda, 2011年03月19日 17:00 | Fix failures in test_urllib2_localnet, test_urllib2net and test_urllibnet. | review | |
| Messages (13) | |||
|---|---|---|---|
| msg131059 - (view) | Author: Brett Cannon (brett.cannon) * (Python committer) | Date: 2011年03月15日 22:57 | |
test.test_urllibnet.urlopenNetworkTests.test_getcode() is leaving a socket open. My guess is that the error condition being triggered is somehow leaving the socket open but I can't find where. |
|||
| msg131224 - (view) | Author: Jeff McNeil (mcjeff) * | Date: 2011年03月17日 05:48 | |
So, I've been meaning to get more into contributing back to Python and I found this one somewhat interesting. As it turns out, even the following simple script raises the same warning: [jeff@martian cpython]$ ./python -c 'import urllib.request; urllib.request.urlretrieve("http://www.python.org")' /home/jeff/cpython/Lib/socket.py:340: ResourceWarning: unclosed <socket.socket object, fd=3, family=2, type=1, proto=6> self._sock = None [64388 refs] [jeff@martian cpython]$ The close method of Socket.SocketIO simply sets the underlying socket object to None, which causes that warning. Explicitly calling the close method on the underlying socket clears that up (and it's protected by that reference counter). The _decref_socketios just drops the internal ref count and never actually closes -- it won't unless self.__closed is True. So, when self._sock is set to None, that error bubbles up. As SocketIO is the foundation used in socket.makefile, I think just adding that close call ought to be correct. I can do the simple patch if you agree. |
|||
| msg131225 - (view) | Author: Senthil Kumaran (orsenthil) * (Python committer) | Date: 2011年03月17日 05:58 | |
Yes, go ahead with the patch. |
|||
| msg131277 - (view) | Author: Jeff McNeil (mcjeff) * | Date: 2011年03月17日 18:30 | |
So, it turned out to be more complicated than that. The HTTPConnection object returns an HTTPResponse, but never closes the underlying socket after calling makesock. Since persistent connections aren't supported, nothing actually closes the socket itself, it's just set to None. Explicitly calling a close turns out not to be correct either. I went down the same path as AbstractHTTPHandler and added a Connection: close header. That ensures that the remote host will close the underlying connection (more importantly, setting the HTTP Response object's will_close to True). That ensures HTTPConnection performs in a "fire and forget" mode, causing everything to close out as it should. I contemplated changing urlretrieve to use build_opener as urlopen does, but I figure that would have been done by now if it was a trivial operation. I'd be happy to take a whack at it if it's just a matter of getting around to it. |
|||
| msg131311 - (view) | Author: Senthil Kumaran (orsenthil) * (Python committer) | Date: 2011年03月18日 02:30 | |
On Thu, Mar 17, 2011 at 06:30:51PM +0000, Jeff McNeil wrote: > I went down the same path as AbstractHTTPHandler and added a Connection: close header. This is fine for the moment, tough I wish that the TODO pending in urllib.request with HTTP1.1 persistent connection be removed soon and will require changes it other places too. > I contemplated changing urlretrieve to use build_opener as urlopen There is bug opened for this. All that would be required is output behavior of urlretrieve remain same, the implementation details (using build_opener or using urlopen itself!) may not be relevant and I think, it can be implemented using urlopen instead going through the handlers and OpenerDirector, BTW, urlretrive is a convenience function of some sort. |
|||
| msg131312 - (view) | Author: Jeff McNeil (mcjeff) * | Date: 2011年03月18日 02:42 | |
Sounds good. I'll look at doing that, too. |
|||
| msg131337 - (view) | Author: Nadeem Vawda (nadeem.vawda) * (Python committer) | Date: 2011年03月18日 16:45 | |
issue10883 is related; test_urllib2net also leaves sockets open in several places. |
|||
| msg131402 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2011年03月19日 09:47 | |
New changeset edc3d3b07435 by Senthil Kumaran in branch '3.2': Closes issue11563 - test_urllibnet ResourceWarning. Patch by Jeff McNeil. http://hg.python.org/cpython/rev/edc3d3b07435 New changeset dfceb98767c0 by Senthil Kumaran in branch 'default': Closes issue11563 test_urllibnet is triggering a ResourceWarning. Patch by Jeff McNeil. http://hg.python.org/cpython/rev/dfceb98767c0 |
|||
| msg131404 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年03月19日 10:20 | |
@Senthil Kumaran: Because your patch touchs not only the test, can you document your change in Misc/NEWS? Sending a new HTTP header should be documented. Is there an issue to support persistent connections in AbstractHTTPHandler.do_open()? |
|||
| msg131429 - (view) | Author: Nadeem Vawda (nadeem.vawda) * (Python committer) | Date: 2011年03月19日 17:00 | |
urlopen_HttpTests.test_willclose() fails to call unfakehttp(), which breaks subsequent runs of test_urllib2_localnet, test_urllib2net and test_urllibnet. Fix attached. |
|||
| msg131458 - (view) | Author: Senthil Kumaran (orsenthil) * (Python committer) | Date: 2011年03月19日 23:02 | |
Victor - Issue9740 and Issue3566 talks about the need to have persistent connection. 3.3 would be a good target to have this feature in. Shall add the NEWS entry. Nadeem Vawda - Thanks for your patch. I committed the fix as part of another bug (Issue3566). I shall mention the credits in an update to the log. thanks. |
|||
| msg131466 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2011年03月20日 01:27 | |
New changeset 53c8f2bd0316 by Senthil Kumaran in branch '3.2': Add NEWS for Issue #11563. http://hg.python.org/cpython/rev/53c8f2bd0316 |
|||
| msg205204 - (view) | Author: Martin Panter (martin.panter) * (Python committer) | Date: 2013年12月04日 07:43 | |
I think the fix for this bug only works if it gets the server to respond with a "Connection: close" header itself. I opened Issue 19524 because I was seeing keep-alive responses using chunked encoding that still trigger a socket leak. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:14 | admin | set | github: 55772 |
| 2013年12月04日 07:43:46 | martin.panter | set | nosy:
+ martin.panter messages: + msg205204 |
| 2011年03月20日 01:27:38 | python-dev | set | nosy:
brett.cannon, orsenthil, vstinner, nadeem.vawda, mcjeff, python-dev messages: + msg131466 |
| 2011年03月19日 23:02:36 | orsenthil | set | nosy:
brett.cannon, orsenthil, vstinner, nadeem.vawda, mcjeff, python-dev messages: + msg131458 |
| 2011年03月19日 23:02:06 | orsenthil | set | nosy:
brett.cannon, orsenthil, vstinner, nadeem.vawda, mcjeff, python-dev messages: - msg131456 |
| 2011年03月19日 23:01:25 | orsenthil | set | nosy:
brett.cannon, orsenthil, vstinner, nadeem.vawda, mcjeff, python-dev messages: + msg131456 |
| 2011年03月19日 17:00:20 | nadeem.vawda | set | files:
+ unfakehttp.diff nosy: brett.cannon, orsenthil, vstinner, nadeem.vawda, mcjeff, python-dev messages: + msg131429 |
| 2011年03月19日 10:20:27 | vstinner | set | nosy:
brett.cannon, orsenthil, vstinner, nadeem.vawda, mcjeff, python-dev messages: + msg131404 |
| 2011年03月19日 09:47:39 | python-dev | set | status: open -> closed nosy: + python-dev messages: + msg131402 resolution: fixed stage: needs patch -> resolved |
| 2011年03月18日 16:45:00 | nadeem.vawda | set | nosy:
+ vstinner, nadeem.vawda messages: + msg131337 |
| 2011年03月18日 02:42:19 | mcjeff | set | nosy:
brett.cannon, orsenthil, mcjeff messages: + msg131312 versions: + Python 3.3 |
| 2011年03月18日 02:30:11 | orsenthil | set | nosy:
brett.cannon, orsenthil, mcjeff messages: + msg131311 |
| 2011年03月17日 18:30:47 | mcjeff | set | files:
+ 11562.patch messages: + msg131277 keywords: + patch nosy: brett.cannon, orsenthil, mcjeff |
| 2011年03月17日 05:58:18 | orsenthil | set | nosy:
+ orsenthil messages: + msg131225 |
| 2011年03月17日 05:48:05 | mcjeff | set | nosy:
brett.cannon, mcjeff messages: + msg131224 |
| 2011年03月17日 04:18:28 | mcjeff | set | nosy:
+ mcjeff |
| 2011年03月15日 22:57:35 | brett.cannon | create | |