-
Notifications
You must be signed in to change notification settings - Fork 69
Potential Race Condition Fix - OS Rename & Chmod - PermissionError #115
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -54,6 +54,7 @@ | |
| import tempfile | ||
| import os | ||
| import sys | ||
| import time | ||
|
|
||
|
|
||
| __all__ = ('LooseObjectDB', ) | ||
|
|
@@ -205,7 +206,7 @@ def store(self, istream): | |
| # END assure target stream is closed | ||
| except: | ||
| if tmp_path: | ||
| os.remove(tmp_path) | ||
| remove(tmp_path) | ||
| raise | ||
| # END assure tmpfile removal on error | ||
|
|
||
|
|
@@ -228,9 +229,22 @@ def store(self, istream): | |
| rename(tmp_path, obj_path) | ||
| # end rename only if needed | ||
|
|
||
| # make sure its readable for all ! It started out as rw-- tmp file | ||
| # but needs to be rwrr | ||
| chmod(obj_path, self.new_objects_mode) | ||
| # Ensure rename is actually done and file is stable | ||
| # Retry up to 14 times - exponential wait & retry in ms. | ||
| # The total maximum wait time is 1000ms, which should be vastly enough for the | ||
| # OS to return and commit the file to disk. | ||
| for exp_backoff_ms in [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 181]: | ||
|
Comment on lines
+232
to
+236
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These timings seem reasonable, but I believe this is quadratic backoff rather than exponential backoff. (In exponential backoff, delays are a fixed base, often 2, raised to the power of a number that increases by one with each attempt. Here, the number that increases by one with each attempt is the base, raised to a fixed power of 2.) I mention this only in case true exponential backoff is intended or required.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That is very true! Since I copied these values from A PR would definitely be welcome that fixes the name in
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've opened GitoxideLabs/gitoxide#1815 to fix that in |
||
| with suppress(PermissionError): | ||
| # make sure its readable for all ! It started out as rw-- tmp file | ||
| # but needs to be rwrr | ||
| chmod(obj_path, self.new_objects_mode) | ||
| break | ||
| time.sleep(exp_backoff_ms / 1000.0) | ||
| else: | ||
| raise PermissionError( | ||
| "Impossible to apply `chmod` to file {}".format(obj_path) | ||
| ) | ||
|
|
||
| # END handle dry_run | ||
|
|
||
| istream.binsha = hex_to_bin(hexsha) | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.