You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I don't have a test case or suggested fix (yet), but documenting that this exists:
Poetry (unlike pip) uses cachecontrol's FileCache with no modifications.
If there is already a cached response, and two different processes (or threads too, probably) revalidate at the same time getting a 304, the first one goes through _cache_set and the second one can find no body (returning a response with empty body because _secure_open_writedeletes before creating).
Potential ideas:
Check for None body, and try harder (maybe .get(locked=True). Pro: simple, targeted change that only affects the rare case, Con: api change, deletion can still race
Stop using bespoke mkstemp that has a race, use os.replace. Pro: less code, file isn't missing during the set, Con: commit history doesn't make it obvious why this exists, seems defensive against problems in world-writable cache dirs or maybe a windows issue?
The text was updated successfully, but these errors were encountered:
Stop using bespoke mkstemp that has a race, use os.replace. Pro: less code, file isn't missing during the set, Con: commit history doesn't make it obvious why this exists, seems defensive against problems in world-writable cache dirs or maybe a windows issue?
This seems like a clean approach to me. I don't have any additional insight to add on why we don't already use os.replace, except that it might be because os.replace wasn't added until 3.3 and the older os.rename doesn't have the same consistent POSIX-esque semantics on Windows (whereas os.replace does).
As explained in psf#332, there was previously a small window of time where the
file is deleted before its new contents get written. Because reads don't
happen with the lock held, this resulted in an empty-body cache hit when it
shouldn't.
thatch
added a commit
to thatch/cachecontrol
that referenced
this issue
May 8, 2024
As explained in psf#332, there was previously a small window of time where the
file is deleted before its new contents get written. Because reads don't
happen with the lock held, this resulted in an empty-body cache hit when it
shouldn't.
Fixespsf#332
I don't have a test case or suggested fix (yet), but documenting that this exists:
FileCache
with no modifications._cache_set
and the second one can find no body (returning a response with empty body because_secure_open_write
deletes before creating).Potential ideas:
.get(locked=True)
. Pro: simple, targeted change that only affects the rare case, Con: api change, deletion can still raceSeparateBodyFileCache
)mkstemp
that has a race, useos.replace
. Pro: less code, file isn't missing during the set, Con: commit history doesn't make it obvious why this exists, seems defensive against problems in world-writable cache dirs or maybe a windows issue?The text was updated successfully, but these errors were encountered: