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

Re: [PATCH v5 35/40] Add Documentation/technical/external-odb.txt

From
JTJonathan Tan <jonathantanmy@google.com>
Date
Aug 25, 2017, 21:23 UTC
Message-ID
<20170825142300.01b15d6b@twelve2.svl.corp.google.com>
In-Reply-To
<CAP8UFD1oONnj93UKf=nBzgOQtY2E+ZVvoLGDNGLsZVobfiN90Q@mail.gmail.com>

On Fri, 25 Aug 2017 08:14:08 +0200 Christian Couder <christian.couder@gmail.com> wrote:

> As Git is used by more and more by people having different needs, I
> think it is not realistic to expect that we can optimize its object
> storage for all these different needs. So a better strategy is to just
> let them store objects in external stores.
[snip]
Show 9 quoted lines
> About these many use cases, I gave the "really big binary files"
> example which is why Git LFS exists (and which GitLab is interested in
> better solving), and the "really big number of files that are fetched
> only as needed" example which Microsoft is interested in solving. I
> could also imagine that some people have both big text files and big
> binary files in which case the "core.bigfilethreshold" might not work
> well, or that some people already have blobs in some different stores
> (like HTTP servers, Docker registries, artifact stores, ...) and want
> to fetch them from there as much as possible. 

Thanks for explaining the use cases - this makes sense, especially the last one which motivates the different modes for the "get" command (return raw bytes vs populating the Git repository with loose/packed objects).

> And then letting people
> use different stores can make clones or fetches restartable which
> would solve another problem people have long been complaining about...

This is unrelated to the rest of my e-mail, but out of curiosity, how would a different store make clones or fetches restartable? Do you mean that Git would invoke a "fetch" command through the ODB protocol instead of using its own native protocol?

Show 16 quoted lines
> >> +Furthermore many improvements that are dependent on specific setups
> >> +could be implemented in the way Git objects are managed if it was
> >> +possible to customize how the Git objects are handled. For example a
> >> +restartable clone using the bundle mechanism has often been requested,
> >> +but implementing that would go against the current strict rules under
> >> +which the Git objects are currently handled.
> >
> > So in this example, you would use todays git-clone to obtain a small version
> > of the repo and then obtain other objects later?
> 
> The problem with explaining how it would work is that the
> --initial-refspec option is added to git clone later in the patch
> series. And there could be changes in the later part of the patch
> series. So I don't want to promise or explain too much here.
> But maybe I could add another patch to better explain that at the end
> of the series.

Such an explanation, in whatever form (patch or e-mail) would be great, because I'm not sure of the interaction between fetches and the connectivity check.

The approach I have taken in my own patches [1] is to (1) declare that if a lazy remote supplies an object, it promises to have everything referred to by that object, and (2) we thus only need to check the objects not from the lazy remote. Translated to the ODB world, (1) is possible in the Microsoft case and is trivial in all the cases where the ODB provides only blobs (since blobs don't refer to any other object), and for (2), a "list" command should suffice.

One constraint is that we do not want to obtain (from the remote) or store a separate list of what it has, to avoid the overhead. (I saw the --initial-refspec approach - that would not work if we want to avoid the overhead.)

For fetches, we remember the objects obtained from that specific remote by adding a special file, name to be determined (I used ".imported" in [1]). (The same method is used to note objects lazily downloaded.) The repack command understands the difference between these two types of objects (patches for this are in progress).

I'm not sure if this can be translated to the ODB world. The ODB can declare a special capability that fetch sends to the server in order to inform the server that it can exclude certain objects, and fetch can inform the ODB of the packfiles that it has written, but I'm not sure how the ODB can "remember" what it has. The ODB could mark such packs with ".managed" to note that it is managed by that ODB, so Git shoudn't touch it, but this means (for example) that Git can't GC them (and it seems also quite contradictory for an ODB to manage Git packfiles).

[1] https://public-inbox.org/git/20170804145113.5ceafafa@twelve2.svl.corp.google.com/
Previous: Christian CouderNext: Christian Couder
Message 35 of 73 in “Add initial experimental external ODB support”
  1. 00/40 Add initial experimental external ODB supportChristian Couder, Aug 3, 2017
  2. 03/40 t0021/rot13-filter: improve 'if .. elsif .. else' styleChristian Couder, Aug 3, 2017
  3. 04/40 Add Git/Packet.pm from parts of t0021/rot13-filter.plChristian Couder, Aug 3, 2017
  4. Junio C HamanoAug 3, 2017
  5. Christian CouderAug 4, 2017
  6. 07/40 Git/Packet.pm: add packet_initialize()Christian Couder, Aug 3, 2017
  7. 09/40 sha1_file: prepare for external odbsChristian Couder, Aug 3, 2017
  8. 11/40 odb-helper: add odb_helper_init() to send 'init' instructionChristian Couder, Aug 3, 2017
  9. Lars SchneiderSep 10, 2017
  10. Christian CouderSep 14, 2017
  11. 14/40 external-odb: accept only blobs for nowChristian Couder, Aug 3, 2017
  12. Junio C HamanoAug 3, 2017
  13. Christian CouderSep 14, 2017
  14. 12/40 t0400: add 'put_raw_obj' instruction to odb-helper scriptChristian Couder, Aug 3, 2017
  15. Lars SchneiderSep 10, 2017
  16. Christian CouderSep 14, 2017
  17. 20/40 lib-httpd: add list.shChristian Couder, Aug 3, 2017
  18. 13/40 external odb: add 'put_raw_obj' supportChristian Couder, Aug 3, 2017
  19. Junio C HamanoAug 3, 2017
  20. Christian CouderSep 14, 2017
  21. 22/40 odb-helper: add odb_helper_get_raw_object()Christian Couder, Aug 3, 2017
  22. 19/40 lib-httpd: add upload.shChristian Couder, Aug 3, 2017
  23. Junio C HamanoAug 3, 2017
  24. Christian CouderSep 14, 2017
  25. 21/40 lib-httpd: add apache-e-odb.confChristian Couder, Aug 3, 2017
  26. 29/40 Add t0460 to test passing git objectsChristian Couder, Aug 3, 2017
  27. 28/40 Add t0450 to test 'get_direct' mechanismChristian Couder, Aug 3, 2017
  28. 33/40 Add t0480 to test "have" capability and raw objectsChristian Couder, Aug 3, 2017
  29. 34/40 external-odb: use 'odb=magic' attribute to mark odb blobsChristian Couder, Aug 3, 2017
  30. 37/40 clone: add --initial-refspec optionChristian Couder, Aug 3, 2017
  31. 36/40 clone: add 'initial' param to write_remote_refs()Christian Couder, Aug 3, 2017
  32. 35/40 Add Documentation/technical/external-odb.txtChristian Couder, Aug 3, 2017
  33. Stefan BellerAug 3, 2017
  34. Christian CouderAug 25, 2017
  35. Jonathan TanAug 25, 2017
  36. Christian CouderAug 29, 2017
  37. Ben PeartAug 28, 2017
  38. Christian CouderAug 29, 2017
  39. Ben PeartAug 30, 2017
  40. Christian CouderAug 30, 2017
  41. 30/40 odb-helper: add put_object_process()Christian Couder, Aug 3, 2017
  42. 32/40 odb-helper: add have_object_process()Christian Couder, Aug 3, 2017
  43. 38/40 clone: disable external odb before initial cloneChristian Couder, Aug 3, 2017
  44. 39/40 Add tests for 'clone --initial-refspec'Christian Couder, Aug 3, 2017
  45. 40/40 Add t0430 to test cloning using bundlesChristian Couder, Aug 3, 2017
  46. 31/40 Add t0470 to test passing raw objectsChristian Couder, Aug 3, 2017
  47. 27/40 odb-helper: add init_object_process()Christian Couder, Aug 3, 2017
  48. 23/40 pack-objects: don't pack objects in external odbsChristian Couder, Aug 3, 2017
  49. 26/40 odb-helper: add 'script_mode' to 'struct odb_helper'Christian Couder, Aug 3, 2017
  50. 24/40 Add t0420 to test transfer to HTTP external odbChristian Couder, Aug 3, 2017
  51. 25/40 external-odb: add 'get_direct' supportChristian Couder, Aug 3, 2017
  52. Junio C HamanoAug 3, 2017
  53. Christian CouderSep 14, 2017
  54. Jonathan TanSep 14, 2017
  55. Christian CouderSep 15, 2017
  56. Jonathan TanSep 15, 2017
  57. 15/40 t0400: add test for external odb write supportChristian Couder, Aug 3, 2017
  58. 17/40 Add t0410 to test external ODB transferChristian Couder, Aug 3, 2017
  59. 18/40 lib-httpd: pass config file to start_httpd()Christian Couder, Aug 3, 2017
  60. 16/40 Add GIT_NO_EXTERNAL_ODB env variableChristian Couder, Aug 3, 2017
  61. 10/40 Add initial external odb supportChristian Couder, Aug 3, 2017
  62. Junio C HamanoAug 3, 2017
  63. Jeff KingAug 3, 2017
  64. Christian CouderSep 14, 2017
  65. 08/40 Git/Packet.pm: add capability functionsChristian Couder, Aug 3, 2017
  66. Junio C HamanoAug 3, 2017
  67. Christian CouderAug 4, 2017
  68. 01/40 builtin/clone: get rid of 'value' strbufChristian Couder, Aug 3, 2017
  69. 05/40 t0021/rot13-filter: use Git/Packet.pmChristian Couder, Aug 3, 2017
  70. 06/40 Git/Packet.pm: improve error messageChristian Couder, Aug 3, 2017
  71. 02/40 t0021/rot13-filter: refactor packet reading functionsChristian Couder, Aug 3, 2017
  72. Lars SchneiderSep 10, 2017
  73. Christian CouderSep 14, 2017

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.