On Sat, Dec 26, 2020 at 07:39:42PM -0500, Michael Smith wrote:
> I love context managers when they're alone, but I dislike stacking
> them. It is less clear how we can ensure the fsync happens exactly
> between flush and close with a context manager than a keyword argument
> to open. That is, if open is the only context manager, everything is
> great. But if is up to users to stack context managers including open
> and some fsync, I think correct ordering will be a problem.
Indeed. I started playing with this idea, and even though I
intellectually know that you can't sync a closed file (fsync needs to
know the file descriptor ID) I keep wanting to write:
with sync():
with open(...) as f:
...
I dunno, maybe it's just me, and I'm sure that if I get a sensible
exception on that I would soon learn to write it as:
with open(...) as f:
with sync(f):
...
But what concerns me more is what happens in more complex cases, for
example with two or more files being written:
with open(..., 'w') as f:
with open(..., 'w') as g:
with sync(g):
with sync(f):
...
Aside from the deeper nesting, its not at all obvious to me whether the
syncs need to be in the same or opposite order to the opens, or if it
even matters. And what if people insert code around the sync?
with open(...) as f:
# code writing to the file here is probably safe
with sync(f):
...
# but code writing to the file here is not
If I have to remember all these fiddly little rules for the order of
context managers and what can go where, I'd rather than stick to syncing
manually:
with open(...) as f:
write stuff
sync
even though I have no idea of the pros and cons of fdatasync versus
fsync and will probably just forget and use os.sync.
Even though I don't usually like functions with a million arguments,
open is an exception. I'm +1 on adding a keyword-only "sync=False"
parameter to open:
- if the file is opened in read-only mode, has no effect;
- if the file is opened for writing, guarantees that fdatasync or fsync
will be called after flush and before closing.
(I'm not entirely sure fdatasync is better than fsync, it's only
available on non-OS-X Unixes and I don't know why I would want to
update the file data but not the metadata.)
--
Steve
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/FCITSUEHTFWK2ZYYUOE2WF64DVXHCSY3/
Code of Conduct: http://python.org/psf/codeofconduct/