Opened 6 years ago

Closed 6 years ago

Last modified 7 months ago

#16108 closed Bug (fixed)

File removal race condition in FileSystemStorage

Reported by: Aymeric Augustin Owned by: nobody
Component: File uploads/storage Version: 1.3
Severity: Normal Keywords: FileSystemStorage file deletion race condition
Cc: piethon@… Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

#16082 describes a race condition in directory creation. It was fixed, however, the same race condition still exists in the file removal code, a few lines below.

While this bug is unlikely to show up in production, it's probably worth fixing in the same way, for the sake of consistency and robustness.

Attached patch proposes a fix similar to r16280. Also, it improves slightly the test case added at that revision.

Attachments (1)

django-file-storage-remove-race.patch (3.9 KB) - added by Aymeric Augustin 6 years ago.

Download all attachments as: .zip

Change History (10)

Changed 6 years ago by Aymeric Augustin

comment:1 Changed 6 years ago by Jannis Leidel

Triage Stage: UnreviewedReady for checkin

comment:2 Changed 6 years ago by Piet Delport

Keywords: FileSystemStorage file deletion race condition added

Looks good! Thank you. :)

comment:3 Changed 6 years ago by Jannis Leidel

Resolution: fixed
Status: newclosed

In [16287]:

Fixed #16108 -- Fixed another race condition in the FileSystemStorage backend with regard to deleting a file. Refs #16082, too. Thanks, Aymeric Augustin.

comment:4 Changed 5 years ago by Mark Lavin

UI/UX: unset

I know this is fixed in trunk but for what it's worth I have seen this multiple times in production this week. We are using django-compressor for our CSS and JS which delete files in get_available_name https://github.com/jezdez/django_compressor/blob/develop/compressor/storage.py#L36. When new CSS/JS is deployed there is a race to create the new cached files and this error appears.

comment:5 Changed 5 years ago by Jannis Leidel

Thanks for reporting that, would you mind to opening a ticket in the django_compressor issue tracker, too?

comment:6 Changed 5 years ago by Piet Delport

Can this (and #16082) be included for 1.3.2?

(Is there process to follow to request this, for release management?)

comment:7 Changed 5 years ago by Mark Lavin

comment:8 Changed 5 years ago by daniel@…

+1 for getting this into 1.3.2. I've also seen this in production with django_compressor.

comment:9 Changed 7 months ago by Matt C

Cc: piethon@… added

Why is the:

    if os.path.exists(name):

...line needed?

That line tells me that an exception should not be raised if the file does not exist and yet in the except clause, an exception is raised if the file was deleted before this thread could do it.

Why the mixed messages and why can't we just have this:

try:
    os.remove(name)
except OSError:
    pass

?

Note: See TracTickets for help on using tickets.
Back to Top