Petr Horáček has posted comments on this change.

Change subject: utils: atomic file write
......................................................................


Patch Set 11: Verified+1

(12 comments)

Passed utilsTests.py

https://gerrit.ovirt.org/#/c/61482/8/lib/vdsm/utils.py
File lib/vdsm/utils.py:

Line 932:     return rget(dict.get(keys[0]), keys[1:], default)
Line 933: 
Line 934: 
Line 935: @contextmanager
Line 936: def atomic_file_write(filename, flag):
> call it - atomic_file_write_context. and if its only write, remove the flag
Write methods are available in 'w', 'a' and '+' flags. We should keep the flag 
argument.
Line 937:     """Atomically write into a file.
Line 938: 
Line 939:     Usage:
Line 940: 


Line 932:     return rget(dict.get(keys[0]), keys[1:], default)
Line 933: 
Line 934: 
Line 935: @contextmanager
Line 936: def atomic_file_write(filename, flag):
> As I see it, it's like asking to specify the type name in the variable (or 
I think it is obvious from its usage. Plus none of our context manager 
functions has _context in it.
Line 937:     """Atomically write into a file.
Line 938: 
Line 939:     Usage:
Line 940: 


Line 942:             f.write('shrubbery')
Line 943:             # there are no changes on foo.txt yet
Line 944:         # now it is changed
Line 945:     """
Line 946:     fd, tmp_filename = tempfile.mkstemp(
> path is a file name and not a path, at least if I follow the usage comment
Done
Line 947:         dir=os.path.dirname(os.path.abspath(filename)),
Line 948:         prefix=os.path.basename(filename) + '.',
Line 949:         suffix='.tmp')
Line 950:     os.close(fd)


Line 946:     fd, tmp_filename = tempfile.mkstemp(
Line 947:         dir=os.path.dirname(os.path.abspath(filename)),
Line 948:         prefix=os.path.basename(filename) + '.',
Line 949:         suffix='.tmp')
Line 950:     os.close(fd)
> you should use the full path I guess, or call it filename. its confusing
I renamed it to 'file'. Python 3 uses the same for open() 
https://docs.python.org/3.5/library/functions.html#open
Line 951:     try:
Line 952:         if os.path.exists(filename):
Line 953:             shutil.copyfile(filename, tmp_filename)
Line 954:         with open(tmp_filename, flag) as f:


Line 953:             shutil.copyfile(filename, tmp_filename)
Line 954:         with open(tmp_filename, flag) as f:
Line 955:             yield f
Line 956:     except:
Line 957:         rmFile(tmp_filename)
> use rmFile, or handle exceptions
Done
Line 958:         raise
Line 959:     else:


Line 956:     except:
Line 957:         rmFile(tmp_filename)
Line 958:         raise
Line 959:     else:
Line 960:         os.rename(tmp_filename, filename)
> tempfile.NamedTemporaryFile(dir=os.path.dirname(file_path))
Done


Line 957:         rmFile(tmp_filename)
Line 958:         raise
Line 959:     else:
Line 960:         os.rename(tmp_filename, filename)
Line 961
> you don't need this helper, it got no use - do it directly in the function
Done


https://gerrit.ovirt.org/#/c/61482/9/lib/vdsm/utils.py
File lib/vdsm/utils.py:

Line 932:     return rget(dict.get(keys[0]), keys[1:], default)
Line 933: 
Line 934: 
Line 935: @contextmanager
Line 936: def atomic_file_write(filename, flag):
> file is a saved word.. better to use file_name. 
In the following patch I use 'r+' to read and edit file inside one with block.

Changed to filename.
Line 937:     """Atomically write into a file.
Line 938: 
Line 939:     Usage:
Line 940: 


Line 933: 
Line 934: 
Line 935: @contextmanager
Line 936: def atomic_file_write(filename, flag):
Line 937:     """Atomically write into a file.
> I don't know why in rget above the doc string is in that format, but please
I'm following https://www.python.org/dev/peps/pep-0257/#multi-line-docstrings
Line 938: 
Line 939:     Usage:
Line 940: 
Line 941:         with atomic_write('foo.txt', 'w') as f:


PS9, Line 942: b
> bb
Thanks!


Line 942:             f.write('shrubbery')
Line 943:             # there are no changes on foo.txt yet
Line 944:         # now it is changed
Line 945:     """
Line 946:     fd, tmp_filename = tempfile.mkstemp(
> you can't ignore the fd. you need to close it
Done
Line 947:         dir=os.path.dirname(os.path.abspath(filename)),
Line 948:         prefix=os.path.basename(filename) + '.',
Line 949:         suffix='.tmp')
Line 950:     os.close(fd)


PS9, Line 957: tmp_file
> copyfile is NOT atomic. you must use os.rename() which is promised by POSIX
Done


-- 
To view, visit https://gerrit.ovirt.org/61482
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: Icbb5a2d3ac439a334db2c9075376f219c356762c
Gerrit-PatchSet: 11
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Petr Horáček <phora...@redhat.com>
Gerrit-Reviewer: Dan Kenigsberg <dan...@redhat.com>
Gerrit-Reviewer: Edward Haas <edwa...@redhat.com>
Gerrit-Reviewer: Jenkins CI
Gerrit-Reviewer: Petr Horáček <phora...@redhat.com>
Gerrit-Reviewer: Yaniv Bronhaim <ybron...@redhat.com>
Gerrit-Reviewer: gerrit-hooks <automat...@ovirt.org>
Gerrit-HasComments: Yes
_______________________________________________
vdsm-patches mailing list
vdsm-patches@lists.fedorahosted.org
https://lists.fedorahosted.org/admin/lists/vdsm-patches@lists.fedorahosted.org

Reply via email to