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

Re: [PATCH v4 00/32] Lockfile correctness and refactoring

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Sep 12, 2014, 11:28 UTC
Message-ID
<5412D8CB.4000809@alum.mit.edu>
In-Reply-To
<20140910191159.GA23655@peff.net>
On 09/10/2014 09:11 PM, Jeff King wrote:
Show 40 quoted lines
> On Wed, Sep 10, 2014 at 09:51:03AM -0700, Junio C Hamano wrote:
> 
>> Jeff King <peff@peff.net> writes:
>>
>>> Yes, we don't let normal fetchers see these repos. They're only for
>>> holding shared objects and the ref tips to keep them reachable.
>>
>> Are these individual refs have relations to the real world after
>> they are created?  To ask it another way, let's say that a branch in
>> a repository, which is using this as a shared object store, caused
>> one of these refs to be created; now the origin repository rewinds
>> or deletes that branch---do you do anything to the ref in the shared
>> object store at that point?
> 
> Yes, we fetch from them before doing any maintenance in the shared
> repository (like running repack). That's how objects migrate into the
> shared repository, as well.
> 
>> I am wondering if it makes sense to maintain a single ref that
>> reaches all the commits in this shared object store repository,
>> instead of keeping these millions of refs.  When you need to make
>> more objects kept and reachable, create an octopus with the current
>> tip and tips of all these refs that causes you to wish making these
>> "more objects kept and reachable".  Obviously that won't work well
>> if the reason why your current scheme uses refs is because you
>> adjust individual refs to prune some objects---hence the first
>> question in this message.
> 
> Exactly. You could do this if you threw away and re-made the octopus
> after each fetch (and then threw away the individual branches that went
> into it). For that matter, if all you really want are the tips for
> reachability, you can basically run "for-each-ref | sort -u"; most of
> these refs are tags that are duplicated between each fork.
> 
> However, having the individual tips does make some things easier. If I
> only keep unique tips and I drop a tip from fork A, I would then need to
> check every other fork to see if any other fork has the same tip. OTOH,
> that means visiting N packed-refs files, each with (let's say) 3000
> refs. As opposed to dealing with a packed-refs file with N*3000 refs. So
> it's really not that different.

I think it would make more sense to have one octopus per fork, rather than one octopus for all of the forks. The octopus for a fork could be discarded and re-created every time that fork changed, without having to worry about which of the old tips is still reachable from another fork. In fact, if you happen to know that a particular update to a fork is pure fast-forward, you could update the fork octopus by merging the changed tips into the old fork octopus without having to re-knit all of the unchanged tips together again.

The shared repository would need one reference per fork--still much better than a reference for every reference in every fork. If even that is too many references, you could knit the fork octopuses into an overall octopus for all forks. But then updating that octopus for a change to a fork would become more difficult, because you would have to read the octopuses for the N-1 unchanged forks from the old octopus and knit those together with the new octopus for the modified fork.

But all this imagineering doesn't mitigate the other reasons you list below for not wanting to guarantee reachability using this trick.

Show 7 quoted lines
> We also use the individual ref tips for packing. They factor into the
> bitmap selection, and we have some patches (which I've been meaning to
> upstream for a while now) to make delta selections in the shared-object
> repository that will have a high chance of reuse in clones of individual
> forks. And it's useful to query them for various reasons (e.g., "who is
> referencing this object?").
> [...]
Michael
-- 
Michael Haggerty
mhagger@alum.mit.edu
Previous: Jeff KingNext: Michael Haggerty
Message 63 of 66 in “Lockfile correctness and refactoring”
  1. 00/32 Lockfile correctness and refactoringMichael Haggerty, Sep 6, 2014
  2. 01/32 unable_to_lock_die(): rename function from unable_to_lock_index_die()Michael Haggerty, Sep 6, 2014
  3. 02/32 api-lockfile: expand the documentationMichael Haggerty, Sep 6, 2014
  4. Junio C HamanoSep 9, 2014
  5. 03/32 rollback_lock_file(): do not clear filename redundantlyMichael Haggerty, Sep 6, 2014
  6. Ronnie SahlbergSep 11, 2014
  7. 04/32 rollback_lock_file(): exit early if lock is not activeMichael Haggerty, Sep 6, 2014
  8. Ronnie SahlbergSep 11, 2014
  9. 05/32 rollback_lock_file(): set fd to -1Michael Haggerty, Sep 6, 2014
  10. 06/32 lockfile: unlock file if lockfile permissions cannot be adjustedMichael Haggerty, Sep 6, 2014
  11. Junio C HamanoSep 9, 2014
  12. Michael HaggertySep 12, 2014
  13. 07/32 hold_lock_file_for_append(): release lock on errorsMichael Haggerty, Sep 6, 2014
  14. Junio C HamanoSep 9, 2014
  15. Michael HaggertySep 12, 2014
  16. 08/32 lock_file(): always add lock_file object to lock_file_listMichael Haggerty, Sep 6, 2014
  17. 09/32 lockfile.c: document the various states of lock_file objectsMichael Haggerty, Sep 6, 2014
  18. Ronnie SahlbergSep 11, 2014
  19. 10/32 cache.h: define constants LOCK_SUFFIX and LOCK_SUFFIX_LENMichael Haggerty, Sep 6, 2014
  20. Ronnie SahlbergSep 11, 2014
  21. Michael HaggertySep 12, 2014
  22. Ronnie SahlbergSep 11, 2014
  23. Michael HaggertySep 12, 2014
  24. Ronnie SahlbergSep 12, 2014
  25. 11/32 delete_ref_loose(): don't muck around in the lock_file's filenameMichael Haggerty, Sep 6, 2014
  26. Johannes SixtSep 13, 2014
  27. Michael HaggertySep 14, 2014
  28. Michael HaggertySep 14, 2014
  29. Johannes SixtSep 14, 2014
  30. 12/32 prepare_index(): declare return value to be (const char *)Michael Haggerty, Sep 6, 2014
  31. 13/32 write_packed_entry_fn(): convert cb_data into a (const int *)Michael Haggerty, Sep 6, 2014
  32. Ronnie SahlbergSep 11, 2014
  33. 14/32 lock_file(): exit early if lockfile cannot be openedMichael Haggerty, Sep 6, 2014
  34. Ronnie SahlbergSep 11, 2014
  35. 15/32 remove_lock_file(): call rollback_lock_file()Michael Haggerty, Sep 6, 2014
  36. 16/32 commit_lock_file(): inline temporary variableMichael Haggerty, Sep 6, 2014
  37. 17/32 commit_lock_file(): die() if called for unlocked lockfile objectMichael Haggerty, Sep 6, 2014
  38. 18/32 commit_lock_file(): if close fails, roll backMichael Haggerty, Sep 6, 2014
  39. 19/32 commit_lock_file(): rollback lock file on failure to renameMichael Haggerty, Sep 6, 2014
  40. Jeff KingSep 10, 2014
  41. Duy NguyenSep 10, 2014
  42. 20/32 api-lockfile: document edge casesMichael Haggerty, Sep 6, 2014
  43. 21/32 dump_marks(): remove a redundant call to rollback_lock_file()Michael Haggerty, Sep 6, 2014
  44. 22/32 git_config_set_multivar_in_file(): avoid call to rollback_lock_file()Michael Haggerty, Sep 6, 2014
  45. 23/32 lockfile: avoid transitory invalid statesMichael Haggerty, Sep 6, 2014
  46. 24/32 struct lock_file: declare some fields volatileMichael Haggerty, Sep 6, 2014
  47. 25/32 try_merge_strategy(): remove redundant lock_file allocationMichael Haggerty, Sep 6, 2014
  48. 26/32 try_merge_strategy(): use a statically-allocated lock_file objectMichael Haggerty, Sep 6, 2014
  49. 27/32 commit_lock_file(): use a strbuf to manage temporary spaceMichael Haggerty, Sep 6, 2014
  50. 28/32 Change lock_file::filename into a strbufMichael Haggerty, Sep 6, 2014
  51. 29/32 resolve_symlink(): use a strbuf for internal scratch spaceMichael Haggerty, Sep 6, 2014
  52. 30/32 resolve_symlink(): take a strbuf parameterMichael Haggerty, Sep 6, 2014
  53. 31/32 trim_last_path_elm(): replace last_path_elm()Michael Haggerty, Sep 6, 2014
  54. 32/32 Extract a function commit_lock_file_to()Michael Haggerty, Sep 6, 2014
  55. Torsten BögershausenSep 7, 2014
  56. Michael HaggertySep 12, 2014
  57. Junio C HamanoSep 8, 2014
  58. Jeff KingSep 10, 2014
  59. Duy NguyenSep 10, 2014
  60. Jeff KingSep 10, 2014
  61. Junio C HamanoSep 10, 2014
  62. Jeff KingSep 10, 2014
  63. Michael HaggertySep 12, 2014
  64. Michael HaggertySep 12, 2014
  65. Michael HaggertySep 12, 2014
  66. Jeff KingSep 13, 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.