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

Re: [PATCH v2 0/5] Create commit-graph file format v2

From
Derrick Stolee <stolee@gmail.com>
Date
Apr 26, 2019, 12:06 UTC
Message-ID
<0a8fb6ec-d35c-45d7-3442-0e8298efca4b@gmail.com>
In-Reply-To
<878svxrwsh.fsf@evledraar.gmail.com>
On 4/26/2019 4:33 AM, Ævar Arnfjörð Bjarmason wrote:
Show 5 quoted lines
> 
> On Fri, Apr 26 2019, Junio C Hamano wrote:
>>
>> Thanks always for your careful review and thoughtful comments, by
>> the way.
I agree that these comments are extremely helpful.
Show 17 quoted lines
>>> Now as noted in my series we now on 'master' downgrade that to a warning
>>> (along with the rest of the errors):
>>>
>>>     $ ~/g/git/git --exec-path=$PWD status
>>>     error: commit-graph version 2 does not match version 1
>>>     On branch master
>>>     [...]
>>>
>>> ...and this series sets the default version for all new graphs to v2.>>>> The phrasing seems odd.  It is unclear, even to me who is vaguely
>> familiar with the word "commit-graph" and is aware of the fact that
>> the file format is being updated, what
>>
>>     "commit-graph version 2 does not match version 1"
> 
> Yeah it should really say:
> 
>     "commit-graph is of version 2, our maximum supported version is 1"

I agree this phrasing is better. Please see the patch I just submitted [1] to try and improve these messages.

[1] https://public-inbox.org/git/pull.181.git.gitgitgadget@gmail.com/
 
Show 8 quoted lines
> Hindsight is 20/20, but more generally I wonder if we should have these
> format versions match that of the git version (unlikely to change it
> twice in the same release...) which would allow us to say things like:
> 
>     "commit-graph needs v2.22.0 or later, we have the version written by v2.18.0..v2.21.0"
> 
> But of course dealing with those larger integers in the code/gaps is
> also messy :)

There are a couple issues with using the version numbers, from my perspective:

1. We don't do that anywhere else, like the index file.
2. The microsoft/git fork takes certain performance changes faster
   than core git, and frequently ships versions between major version
   updates. Our 2.17 had the commit-graph, for instance. It's also
   possible that we'd take commit-graph v2 earlier than the core Git
   major release.
 
Show 8 quoted lines
>> wants to say.  Do I have version #2 on disk and the running binary
>> only understands version #1?  Or do I have version #1 on disk and
>> the binary expected version #2?  How would I get out of this
>> situation?  Is it sufficient to do "rm -f .git/info/commit-graph*"
>> and is it safe?
> 
> Yeah. An rm of .git/info/commit-graph is safe, so is "-c
> core.commitGraph=false" as a workaround.

That is true. I'm not sure the error message is the right place to describe the workaround.

Show 17 quoted lines
> I'd say "let's improve the error", but that ship has sailed, and we can
> do better than an error here, no matter how it's phrased...
> 
>>> I think this is *way* too aggressive of an upgrade path. If these
>>> patches go into v2.22.0 then git clients on all older versions that grok
>>> the commit graph (IIRC v2.18 and above) will have their git completely
>>> broken if they're in a mixed-git-version environmen.>
> I should note that "all older versions..." here is those that have
> core.commitGraph=true set. More details in 43d3561805 ("commit-graph
> write: don't die if the existing graph is corrupt", 2019-03-25).
> 
>>> Is it really so important to move to v2 right away that we need to risk
>>> those breakages? I think even with my ab/commit-graph-fixes it's still
>>> too annoying (I was mostly trying to fix other stuff...). If only we
>>> could detect "we should make a new graph now" ....
>>
>> True.
You are right, this is too aggressive and I should have known better. I'll
update in the next version to keep a default to v1. Not only do we have this
downgrade risk, there is no actual benefit in this series alone. This only
sets up the ability for other features.
 
Show 43 quoted lines
> Having slept on my earlier
> https://public-inbox.org/git/87a7gdspo4.fsf@evledraar.gmail.com/ I think
> I see a better way to deal with this than my earlier suggestion that we
> perform some version flip-flop dance on the single "commit-graph" file:
> 
> How about just writing .git/objects/info/commit-graph-v2, and for the
> upcoming plan when where they'll be split have some dir/prefix there
> where we include the version?
> 
> That means that:
> 
>  1. If there's an existing v1 "commit-graph" file we don't write a v2 at
>     that path in v2.22, although we might have some "write v1 (as well
>     as v2?) for old client compat" config where we opt-in to do that.
> 
>  2. By default in v2.22 we read/write a "commit-graph-v2" file,
>     preferring it over the v1 "commit-graph", falling back on earlier
>     versions if it's not there (until gc --auto kicks in on v2.22 and
>     makes a v2 graph).
> 
>  3. If you have concurrent v2.21 and v2.22 clients accessing the repo
>     you might end up generating one commit-graph or the other depending
>     on who happens to trigger "gc --auto".
> 
>     Hopefully that's a non-issue since an out-of-date graph isn't
>     usually a big deal, and client versions mostly march forward. But
>     v2.22 could also learn some "incremental gc" where it says "my v2 is
>     older, v1 client must have refreshed it, I'll refresh mine/both".
> 
>  4. v2.22 and newer versions will have some code in git-gc where we'll
>     eventually readdir() .git/objects/info and remove graphs that are
>     too old per some new config (say
>     "gc.pruneOlderCommitGraphVersions=180 days").
> 
> This means that:
> 
>  A. GOOD: Now and going forward we can fearlessly create new versions of
>     the graph without worrying/testing how older clients deal with it.
> 
>  B. BAD: We are going to eat ~2x the disk space for commit-graphs while
>     such transitions are underway. I think that's fine. They're
>     relatively small compared to .git/objects, and we'll eventually "gc"
>     the old ones.

We could also write 'commit-graph-v2' and delete 'commit-graph' and if someone downgrades they would just have a performance issue, not a failure.

Show 12 quoted lines
>  C. BAD: Different versions of git might perform wildly differently (new
>     version slower) since their respective preferred graph versions
>     might have a very different/up-to-date number of commits v.s. what's
>     in the packs.
> 
> I think "A" outweighs "B" && "C" in this case. It's "just" a caching
> data structure, and git works without it. So we can be a lot looser than
> say updating the index/pack format.
> 
> Worst case things slow down but still work, and as noted in #3 above if
> we care it can be mitigated (but I don't, I think we can safely assume
> "client versions march forward").

While I agree that this downgrade path can be a problem, I don't like the idea of adding a version in the filename. The whole point of having a versioned file format is so we can make these changes without changing the filename.

Is it sufficient to remove the auto-upgrade path, at least for a few major versions? And I can learn from past mistakes and change the response to the other version information in the v2 file (reach index version, hash version, unused value in 8th byte) and instead make them non-fatal warnings.

Thanks, -Stolee

Previous: Ævar Arnfjörð BjarmasonNext: Ævar Arnfjörð Bjarmason
Message 31 of 89 in “Create commit-graph file format v2”
  1. 0/6 Create commit-graph file format v2Derrick Stolee via GitGitGadget, Jan 23, 2019
  2. 1/6 commit-graph: return with errors during writeDerrick Stolee via GitGitGadget, Jan 23, 2019
  3. 2/6 commit-graph: collapse parameters into flagsDerrick Stolee via GitGitGadget, Jan 23, 2019
  4. 5/6 commit-graph: implement file format version 2Derrick Stolee via GitGitGadget, Jan 23, 2019
  5. Jonathan TanJan 23, 2019
  6. Ævar Arnfjörð BjarmasonJan 24, 2019
  7. Derrick StoleeJan 24, 2019
  8. Ævar Arnfjörð BjarmasonMar 21, 2019
  9. 4/6 commit-graph: add --version=<n> optionDerrick Stolee via GitGitGadget, Jan 23, 2019
  10. Ævar Arnfjörð BjarmasonJan 24, 2019
  11. 6/6 commit-graph: test verifying a corrupt v2 headerDerrick Stolee via GitGitGadget, Jan 23, 2019
  12. Jonathan TanJan 23, 2019
  13. 3/6 commit-graph: create new version flagsDerrick Stolee via GitGitGadget, Jan 23, 2019
  14. Junio C HamanoJan 24, 2019
  15. Junio C HamanoJan 24, 2019
  16. Derrick StoleeJan 25, 2019
  17. 0/5 Create commit-graph file format v2Derrick Stolee via GitGitGadget, Apr 24, 2019
  18. 1/5 commit-graph: return with errors during writeDerrick Stolee via GitGitGadget, Apr 24, 2019
  19. 2/5 commit-graph: collapse parameters into flagsDerrick Stolee via GitGitGadget, Apr 24, 2019
  20. Junio C HamanoApr 25, 2019
  21. 3/5 commit-graph: create new version flagsDerrick Stolee via GitGitGadget, Apr 24, 2019
  22. Junio C HamanoApr 25, 2019
  23. Derrick StoleeApr 25, 2019
  24. Ævar Arnfjörð BjarmasonApr 25, 2019
  25. Junio C HamanoApr 26, 2019
  26. 4/5 commit-graph: add --version=<n> optionDerrick Stolee via GitGitGadget, Apr 24, 2019
  27. 5/5 commit-graph: implement file format version 2Derrick Stolee via GitGitGadget, Apr 24, 2019
  28. Ævar Arnfjörð BjarmasonApr 25, 2019
  29. Junio C HamanoApr 26, 2019
  30. Ævar Arnfjörð BjarmasonApr 26, 2019
  31. Derrick StoleeApr 26, 2019
  32. Ævar Arnfjörð BjarmasonApr 26, 2019
  33. Ævar Arnfjörð BjarmasonApr 27, 2019
  34. 0/6 Create commit-graph file format v2Derrick Stolee via GitGitGadget, May 1, 2019
  35. 1/6 commit-graph: return with errors during writeDerrick Stolee via GitGitGadget, May 1, 2019
  36. Ævar Arnfjörð BjarmasonMay 1, 2019
  37. 2/6 commit-graph: collapse parameters into flagsDerrick Stolee via GitGitGadget, May 1, 2019
  38. 3/6 commit-graph: create new version parameterDerrick Stolee via GitGitGadget, May 1, 2019
  39. 5/6 commit-graph: implement file format version 2Derrick Stolee via GitGitGadget, May 1, 2019
  40. Ævar Arnfjörð BjarmasonMay 1, 2019
  41. Derrick StoleeMay 1, 2019
  42. 4/6 commit-graph: add --version=<n> optionDerrick Stolee via GitGitGadget, May 1, 2019
  43. 6/6 commit-graph: remove Future Work sectionDerrick Stolee via GitGitGadget, May 1, 2019
  44. Ævar Arnfjörð BjarmasonMay 1, 2019
  45. Derrick StoleeMay 1, 2019
  46. Ævar Arnfjörð BjarmasonMay 1, 2019
  47. Derrick StoleeMay 2, 2019
  48. Ævar Arnfjörð BjarmasonMay 2, 2019
  49. Derrick StoleeMay 3, 2019
  50. Ævar Arnfjörð BjarmasonMay 3, 2019
  51. Christian CouderMay 6, 2019
  52. Derrick StoleeMay 6, 2019
  53. SZEDER GáborMay 3, 2019
  54. Derrick StoleeMay 3, 2019
  55. 00/11 Commit-graph write refactor (was: Create commit-graph file format v2)Derrick Stolee via GitGitGadget, May 9, 2019
  56. 01/11 commit-graph: fix the_repository referenceDerrick Stolee via GitGitGadget, May 9, 2019
  57. Junio C HamanoMay 13, 2019
  58. 02/11 commit-graph: return with errors during writeDerrick Stolee via GitGitGadget, May 9, 2019
  59. Junio C HamanoMay 13, 2019
  60. Derrick StoleeMay 13, 2019
  61. Derrick StoleeMay 13, 2019
  62. 04/11 commit-graph: remove Future Work sectionDerrick Stolee via GitGitGadget, May 9, 2019
  63. 03/11 commit-graph: collapse parameters into flagsDerrick Stolee via GitGitGadget, May 9, 2019
  64. Junio C HamanoMay 13, 2019
  65. Derrick StoleeMay 13, 2019
  66. 08/11 commit-graph: extract fill_oids_from_all_packs()Derrick Stolee via GitGitGadget, May 9, 2019
  67. 06/11 commit-graph: extract fill_oids_from_packs()Derrick Stolee via GitGitGadget, May 9, 2019
  68. Junio C HamanoMay 13, 2019
  69. 05/11 commit-graph: create write_commit_graph_contextDerrick Stolee via GitGitGadget, May 9, 2019
  70. 10/11 commit-graph: extract copy_oids_to_commits()Derrick Stolee via GitGitGadget, May 9, 2019
  71. 11/11 commit-graph: extract write_commit_graph_file()Derrick Stolee via GitGitGadget, May 9, 2019
  72. Junio C HamanoMay 13, 2019
  73. 09/11 commit-graph: extract count_distinct_commits()Derrick Stolee via GitGitGadget, May 9, 2019
  74. 07/11 commit-graph: extract fill_oids_from_commit_hex()Derrick Stolee via GitGitGadget, May 9, 2019
  75. Josh SteadmonMay 9, 2019
  76. 00/11 Commit-graph write refactor (was: Create commit-graph file format v2)Derrick Stolee via GitGitGadget, Jun 12, 2019
  77. 01/11 commit-graph: fix the_repository referenceDerrick Stolee via GitGitGadget, Jun 12, 2019
  78. 03/11 commit-graph: collapse parameters into flagsDerrick Stolee via GitGitGadget, Jun 12, 2019
  79. 02/11 commit-graph: return with errors during writeDerrick Stolee via GitGitGadget, Jun 12, 2019
  80. SZEDER GáborJun 29, 2019
  81. Derrick StoleeJul 1, 2019
  82. 04/11 commit-graph: remove Future Work sectionDerrick Stolee via GitGitGadget, Jun 12, 2019
  83. 05/11 commit-graph: create write_commit_graph_contextDerrick Stolee via GitGitGadget, Jun 12, 2019
  84. 08/11 commit-graph: extract fill_oids_from_all_packs()Derrick Stolee via GitGitGadget, Jun 12, 2019
  85. 06/11 commit-graph: extract fill_oids_from_packs()Derrick Stolee via GitGitGadget, Jun 12, 2019
  86. 10/11 commit-graph: extract copy_oids_to_commits()Derrick Stolee via GitGitGadget, Jun 12, 2019
  87. 07/11 commit-graph: extract fill_oids_from_commit_hex()Derrick Stolee via GitGitGadget, Jun 12, 2019
  88. 11/11 commit-graph: extract write_commit_graph_file()Derrick Stolee via GitGitGadget, Jun 12, 2019
  89. 09/11 commit-graph: extract count_distinct_commits()Derrick Stolee via GitGitGadget, Jun 12, 2019

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.