Issue21463
Created on 2014-05-09 15:09 by erik.bray, last changed 2022-04-11 14:58 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| urllib-request-ftpcache-error.patch | erik.bray, 2014-05-09 15:09 | review | ||
| urllib-request-ftpcache-test.patch | shiinee, 2014-06-07 19:43 | review | ||
| urllib-request-ftpcache-test.patch | shiinee, 2014-06-07 22:01 | review | ||
| Messages (10) | |||
|---|---|---|---|
| msg218170 - (view) | Author: Erik Bray (erik.bray) * | Date: 2014-05-09 15:09 | |
This is probably a pretty rare corner case, but a coworker reported this to me while testing code that does open several ftp connections to different files. |
|||
| msg218188 - (view) | Author: Éric Araujo (eric.araujo) * | Date: 2014-05-09 17:38 | |
Thanks for the report and patch. Would you mind adding a unit test? (Note that the “crash” type is for segfaults, not Python exceptions.) |
|||
| msg218189 - (view) | Author: Erik Bray (erik.bray) * | Date: 2014-05-09 17:57 | |
Ah, didn't know that about "crash". I wanted to add a test but hesitated only because that code is not well tested to begin with (perhaps, hence, this going unnoticed for so long). But I guess it could be done by mocking the ftpwrapper class. |
|||
| msg219912 - (view) | Author: Jessica McKellar (jesstess) * | Date: 2014-06-07 04:25 | |
I want to state explicitly what the error is for some new contributors who might pick this up at a sprint this weekend:
The issue is that you can't change a dictionary while iterating over it:
>>> d = {"a": "b"}
>>> for elt in d.keys():
... del d[elt]
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
In Python 2, d.keys() produced a copy of the list of keys, and we delete items from the dictionary while iterating over that copy, which is safe. In Python 3, d.keys() produces a view object* instead, and mutating the dictionary while iterating over it is unsafe and raises an error.
The patch makes a copy of the keys before iterating over it so that it is safe in Python 3.
* https://docs.python.org/3/library/stdtypes.html#dict-views
|
|||
| msg219966 - (view) | Author: Skyler Leigh Amador (shiinee) | Date: 2014-06-07 19:43 | |
I've made a test for this patch with a very minimal mock ftpwrapper. We can see it fails on dictionary size change without Erik's fix: ====================================================================== ERROR: test_ftp_cache_pruning (test.test_urllib.urlopen_HttpTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/skyler/cpython/Lib/test/test_urllib.py", line 336, in test_ftp_cache_pruning urlopen('ftp://localhost') File "/home/skyler/cpython/Lib/test/test_urllib.py", line 45, in urlopen return opener.open(url) File "/home/skyler/cpython/Lib/urllib/request.py", line 1631, in open return getattr(self, name)(url) File "/home/skyler/cpython/Lib/urllib/request.py", line 1914, in open_ftp for k in self.ftpcache.keys(): RuntimeError: dictionary changed size during iteration |
|||
| msg219972 - (view) | Author: Benjamin Peterson (benjamin.peterson) * | Date: 2014-06-07 20:37 | |
(I left some comments on Rietveld.) |
|||
| msg219986 - (view) | Author: Skyler Leigh Amador (shiinee) | Date: 2014-06-07 22:01 | |
Addressed review comments |
|||
| msg219988 - (view) | Author: Roundup Robot (python-dev) | Date: 2014-06-07 22:09 | |
New changeset b8f9ae84d211 by Benjamin Peterson in branch '3.4': in ftp cache pruning, avoid changing the size of a dict while iterating over it (closes #21463) http://hg.python.org/cpython/rev/b8f9ae84d211 New changeset 6f70a18313e5 by Benjamin Peterson in branch 'default': merge 3.4 (#21463) http://hg.python.org/cpython/rev/6f70a18313e5 |
|||
| msg220101 - (view) | Author: Erik Bray (erik.bray) * | Date: 2014-06-09 15:31 | |
Thanks Skyler for finishing the job. I got busy/distracted. |
|||
| msg220530 - (view) | Author: Skyler Leigh Amador (shiinee) | Date: 2014-06-14 04:22 | |
You're welcome, happy to help :) On Mon, Jun 9, 2014 at 8:31 AM, Erik Bray <report@bugs.python.org> wrote: > > Erik Bray added the comment: > > Thanks Skyler for finishing the job. I got busy/distracted. > > ---------- > > _______________________________________ > Python tracker <report@bugs.python.org> > <http://bugs.python.org/issue21463> > _______________________________________ > |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022-04-11 14:58:03 | admin | set | github: 65662 |
| 2014-06-14 04:22:49 | shiinee | set | messages: + msg220530 |
| 2014-06-09 15:31:09 | erik.bray | set | messages: + msg220101 |
| 2014-06-07 22:09:42 | python-dev | set | status: open -> closed nosy:
+ python-dev resolution: fixed |
| 2014-06-07 22:01:01 | shiinee | set | files:
+ urllib-request-ftpcache-test.patch messages: + msg219986 |
| 2014-06-07 20:37:42 | benjamin.peterson | set | nosy:
+ benjamin.peterson messages: + msg219972 |
| 2014-06-07 19:43:38 | shiinee | set | files:
+ urllib-request-ftpcache-test.patch nosy: + shiinee messages: + msg219966 |
| 2014-06-07 04:25:00 | jesstess | set | nosy:
+ jesstess messages: + msg219912 |
| 2014-05-09 17:57:12 | erik.bray | set | messages: + msg218189 |
| 2014-05-09 17:38:40 | eric.araujo | set | versions:
+ Python 2.7, Python 3.4, Python 3.5 nosy: + eric.araujo messages: + msg218188 type: crash -> behavior |
| 2014-05-09 15:16:57 | berker.peksag | set | nosy:
+ orsenthil |
| 2014-05-09 15:09:08 | erik.bray | create | |