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

Re: [PATCH v8 4/4] cache-tree: Write updated cache-tree after commit

From
Duy Nguyen <pclouds@gmail.com>
Date
Jul 16, 2014, 10:18 UTC
Message-ID
<CACsJy8BsoYP40K7vFoZhgXvy32vkHjhwCMYLFM6ishXcVXdzAA@mail.gmail.com>
In-Reply-To
<xmqqbnsqwoxz.fsf@gitster.dls.corp.google.com>
On Tue, Jul 15, 2014 at 11:45 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 15 quoted lines
> What is the real point of "writing into *.lock and renaming"?  It
> serves two purposes: (1) everybody adheres to that convention---if
> we managed to take the lock "index.lock", nobody else will compete
> and interfere with us until we rename it to "index". (2) in the
> meantime, others can still read the old contents in the original
> "index".
>
> With "take lock", "write to a temporary", "commit by rename or
> rollback by delete", we can have the usual transactional semantics.
> While we are working on it, nobody is allowed to muck with the same
> file, because everybody pays attention to *.lock.  People will not
> see what we are doing until we release the lock because we are not
> writing into the primary file.  And people can see what we did in
> its entirety once we are done because we close and rename to commit
> our changes atomically.
True.
Show 13 quoted lines
> Think what CLOSE_LOCK adds to that and you would appreciate its
> usefulness and at the same time realize its limitation.  By allowing
> us to flush what we wrote to the disk without releasing the lock, we
> can give others (e.g. subprograms we spawn) controlled access to the
> new contents we prepared before we commit the result to the outside
> world.  The access is controlled because we are in control when we
> tell these others to peek into or update the temporary file "*.lock".
>
> The original implementaiton of CLOSE_LOCK is limited in that you can
> do so only once; you take a lock, you do your thing, you close, you
> let (one or more) others see it, and you commit (or rollback).  You
> cannot do another of your thing once you close with the original
> implementation because there was no way to reopen.

This is probably where our opinions differ. Yes, if you are sure nobody else is looking at the lock file any more, then you can do whatever you want. And because this is a .lock file, nobody is supposed to look at it unless you tell them too (in contrast $GIT_DIR/index can be read at any time). The format of the index makes it impossible to just edit one byte and be done with it. You always write a full new file. By sticking to transaction-style update, you need no extra code, and you have a back up file as a side effect.

Show 25 quoted lines
> What do you gain by your proposal to lock "index.lock" file?  We
> know we already have "index.lock", so nobody should be competing on
> mucking with its contents with us and we gain nothing by writing
> into index.lock.lock and renaming it to index.lock.  We are in total
> control of the lifetime of index.lock, when we spawn subprograms on
> it to let them write to it, when we ourselves write to it, when we
> spawn subprograms on it to let them read from it, all under the lock
> we have on the "index", i.e. "index.lock".
>
> The only thing use of another temporary file (that does not have to
> be a lock on "index.lock", by the way, because we have total control
> over when and who updates the file while we hold the "index.lock")
> would give you is that it allows you to make the success of the "do
> another of your thing" step optional.  While holding the lock, you
> close and let "add -i" work on it, and after it returns, instead of
> reopening, you write into yet another "index.lock.lock", expecting
> that it might fail and when it fails you can roll it back, leaving
> the contents "add -i" left in "index.lock" intact.  If you do not
> use the extra temporary file, you start from "index.lock" left by
> "add -i", write the updated index into "index.lock" and if you fail
> to write, you have to roll back the entire "index"---you lose the
> option to use the index left by "add -i" without repopulated
> cache-tree.  But in the index update context, I do not think such a
> complexity is not necessary.  If something fails, we should fail and
> roll back the entire "index".

I probably look at the problem from a wrong angle. To me the result of "commit -p" is precious. I'm not a big user of "commit -p" myself as I prefer "add -p" but it's the same: it'd be frustrating if after you have carefully added your chunks, the program aborts and you have to start over. And not just a few chunks. Think of reviewing .po files and approve strings by the means of adding them to the index. Perhaps because _I_ as a developer see this cache-tree update step optional and react to it unnecessarily. Ordinary users won't see any difference. And perhaps a better way to save the result of "commit/add -p" is some sort of index log, not be over-protective at this "interactive commit" code block.

I don't feel strongly either way. So your call.
-- 
Duy
Previous: Junio C HamanoNext: Junio C Hamano
Message 16 of 28 in “cache-tree: Create/update cache-tree on checkout”
  1. 1/4 cache-tree: Create/update cache-tree on checkoutDavid Turner, Jul 12, 2014
  2. 2/4 test-dump-cache-tree: invalid trees are not errorsDavid Turner, Jul 12, 2014
  3. 3/4 cache-tree: subdirectory testsDavid Turner, Jul 12, 2014
  4. 4/4 cache-tree: Write updated cache-tree after commitDavid Turner, Jul 12, 2014
  5. Duy NguyenJul 13, 2014
  6. Junio C HamanoJul 14, 2014
  7. Ramsay JonesJul 14, 2014
  8. Junio C HamanoJul 14, 2014
  9. Ramsay JonesJul 14, 2014
  10. Junio C HamanoJul 14, 2014
  11. David TurnerJul 14, 2014
  12. Duy NguyenJul 15, 2014
  13. Junio C HamanoJul 15, 2014
  14. Duy NguyenJul 15, 2014
  15. Junio C HamanoJul 15, 2014
  16. Duy NguyenJul 16, 2014
  17. Junio C HamanoJul 16, 2014
  18. Junio C HamanoJul 14, 2014
  19. lockfile: allow reopening a closed but still locked fileJunio C Hamano, Jul 14, 2014
  20. John KeepingAug 31, 2014
  21. David TurnerSep 1, 2014
  22. John KeepingSep 1, 2014
  23. Junio C HamanoSep 2, 2014
  24. Junio C HamanoSep 2, 2014
  25. cache-tree: propagate invalidation up when puntingJunio C Hamano, Sep 2, 2014
  26. cache-tree: do not try to use an invalidated subtree info to build a treeJunio C Hamano, Sep 2, 2014
  27. David TurnerSep 3, 2014
  28. Eric SunshineSep 3, 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.