git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3 00/25] Lockfile correctness and refactoring

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Apr 16, 2014, 19:50 UTC
Message-ID
<534EDF20.70201@alum.mit.edu>
In-Reply-To
<534D7D2E.7060100@web.de>
On 04/15/2014 08:40 PM, Torsten Bögershausen wrote:
Show 17 quoted lines
> refs.c:
> int close_ref(struct ref_lock *lock)
> {
> 	if (close_lock_file(lock->lk))
> 		return -1;
> 	lock->lock_fd = -1;
> 	return 0;
> }
> 
> When the close() fails, fd is still >= 0, even if the file is closed.
> 
> Could it be written like this ?
> 
> int close_ref(struct ref_lock *lock)
> {
> 	return close_lock_file(lock->lk);
> }

It seem to me it would be better to set lock->lock_fd to -1 regardless of whether close_lock_file() succeeds. Or maybe this field is not even needed, and instead lock->lk->fd should be used.

This is a bit beyond the scope of this patch series, but I will put it on my todo list.

Show 10 quoted lines
> =====================
> lockfile.c, line 49
>  *   - filename holds the filename of the lockfile
> 
> I think we have a strbuf here? (which is a good thing),
> should we write:
>  *   - strbuf filename holds the filename of the lockfile
> ----------
> (and at some places filename[0] is mentioned,
> should that be filename.buf[0] ?)

I think it is OK to speak of a strbuf as "holding" a filename (what else would that construct mean?

But you are correct that the comments shouldn't speak of filename[0] anymore. I will fix it.

Show 16 quoted lines
> =========================
> int commit_lock_file(struct lock_file *lk)
> {
> 	static struct strbuf result_file = STRBUF_INIT;
> 	int err;
> 
> 	if (lk->fd >= 0 && close_lock_file(lk))
> 		return -1;
> ##What happens if close() fails and close_lock_file() returns != 0?
> ##Is the lk now in a good shaped state?
> I think the file which had been open by lk->fd is in an unkown state,
> and should not be used for anything.
> When I remember it right, an error on close() can mean "the file could not
> be written and closed as expected, it can be truncated or corrupted.
> This can happen on a network file system like NFS, or probably even other FS.
> For me the failing of close() means I smell a need for a rollback.

Yes, this is a good catch. I think a rollback should definitely be done in this case. I will fix it.

In fact, I'm wondering whether it would be appropriate for close_lock_file() itself to do a rollback if close() fails. I guess I will first have to audit callers to make sure that they don't try to use lock_file::filename after a failed close_lock_file() (e.g., for generating an error message).

> Please treat my comments more than questions rather than answers,
> thanks for an interesting reading
Thanks for your helpful comments!
Michael
-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
Previous: Torsten Bögershausen
Message 32 of 32 in “Lockfile correctness and refactoring”
  1. 00/25 Lockfile correctness and refactoringMichael Haggerty, Apr 14, 2014
  2. 01/25 unable_to_lock_die(): rename function from unable_to_lock_index_die()Michael Haggerty, Apr 14, 2014
  3. 02/25 api-lockfile: expand the documentationMichael Haggerty, Apr 14, 2014
  4. 03/25 rollback_lock_file(): do not clear filename redundantlyMichael Haggerty, Apr 14, 2014
  5. 04/25 rollback_lock_file(): set fd to -1Michael Haggerty, Apr 14, 2014
  6. 05/25 lockfile: unlock file if lockfile permissions cannot be adjustedMichael Haggerty, Apr 14, 2014
  7. 06/25 hold_lock_file_for_append(): release lock on errorsMichael Haggerty, Apr 14, 2014
  8. 07/25 lock_file(): always add lock_file object to lock_file_listMichael Haggerty, Apr 14, 2014
  9. 08/25 lockfile.c: document the various states of lock_file objectsMichael Haggerty, Apr 14, 2014
  10. 09/25 cache.h: define constants LOCK_SUFFIX and LOCK_SUFFIX_LENMichael Haggerty, Apr 14, 2014
  11. 10/25 delete_ref_loose(): don't muck around in the lock_file's filenameMichael Haggerty, Apr 14, 2014
  12. 11/25 prepare_index(): declare return value to be (const char *)Michael Haggerty, Apr 14, 2014
  13. 12/25 write_packed_entry_fn(): convert cb_data into a (const int *)Michael Haggerty, Apr 14, 2014
  14. 13/25 lock_file(): exit early if lockfile cannot be openedMichael Haggerty, Apr 14, 2014
  15. 14/25 remove_lock_file(): call rollback_lock_file()Michael Haggerty, Apr 14, 2014
  16. 15/25 commit_lock_file(): inline temporary variableMichael Haggerty, Apr 14, 2014
  17. 16/25 commit_lock_file(): die() if called for unlocked lockfile objectMichael Haggerty, Apr 14, 2014
  18. Johannes SixtApr 15, 2014
  19. Michael HaggertyApr 16, 2014
  20. 17/25 lockfile: avoid transitory invalid statesMichael Haggerty, Apr 14, 2014
  21. 18/25 struct lock_file: declare some fields volatileMichael Haggerty, Apr 14, 2014
  22. Johannes SixtApr 15, 2014
  23. Michael HaggertyApr 16, 2014
  24. 19/25 try_merge_strategy(): remove redundant lock_file allocationMichael Haggerty, Apr 14, 2014
  25. 20/25 try_merge_strategy(): use a statically-allocated lock_file objectMichael Haggerty, Apr 14, 2014
  26. 21/25 commit_lock_file(): use a strbuf to manage temporary spaceMichael Haggerty, Apr 14, 2014
  27. 22/25 Change lock_file::filename into a strbufMichael Haggerty, Apr 14, 2014
  28. 23/25 resolve_symlink(): use a strbuf for internal scratch spaceMichael Haggerty, Apr 14, 2014
  29. 24/25 resolve_symlink(): take a strbuf parameterMichael Haggerty, Apr 14, 2014
  30. 25/25 trim_last_path_elm(): replace last_path_elm()Michael Haggerty, Apr 14, 2014
  31. Torsten BögershausenApr 15, 2014
  32. Michael HaggertyApr 16, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.