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

[PATCH v2 6/9] Documentation: add Packfile URIs design doc

From
JTJonathan Tan <jonathantanmy@google.com>
Date
Jun 10, 2020, 20:57 UTC
Message-ID
<6344c225897de1a2d8aa86d610e9eaf1c6ec82b4.1591821067.git.jonathantanmy@google.com>
In-Reply-To
<cover.1591821067.git.jonathantanmy@google.com>
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
---
 Documentation/technical/packfile-uri.txt | 78 ++++++++++++++++++++++++
 Documentation/technical/protocol-v2.txt  | 32 +++++++++-
 2 files changed, 109 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/technical/packfile-uri.txt
diff --git a/Documentation/technical/packfile-uri.txt b/Documentation/technical/packfile-uri.txt
new file mode 100644
index 0000000000..318713abc3
--- /dev/null
+++ b/Documentation/technical/packfile-uri.txt
@@ -0,0 +1,78 @@
+Packfile URIs
+=============
+
+This feature allows servers to serve part of their packfile response as URIs.
+This allows server designs that improve scalability in bandwidth and CPU usage
+(for example, by serving some data through a CDN), and (in the future) provides
+some measure of resumability to clients.
+
+This feature is available only in protocol version 2.
+
+Protocol
+--------
+
+The server advertises the `packfile-uris` capability.
+
+If the client then communicates which protocols (HTTPS, etc.) it supports with
+a `packfile-uris` argument, the server MAY send a `packfile-uris` section
+directly before the `packfile` section (right after `wanted-refs` if it is
+sent) containing URIs of any of the given protocols. The URIs point to
+packfiles that use only features that the client has declared that it supports
+(e.g. ofs-delta and thin-pack). See protocol-v2.txt for the documentation of
+this section.
+
+Clients should then download and index all the given URIs (in addition to
+downloading and indexing the packfile given in the `packfile` section of the
+response) before performing the connectivity check.
+
+Server design
+-------------
+
+The server can be trivially made compatible with the proposed protocol by
+having it advertise `packfile-uris`, tolerating the client sending
+`packfile-uris`, and never sending any `packfile-uris` section. But we should
+include some sort of non-trivial implementation in the Minimum Viable Product,
+at least so that we can test the client.
+
+This is the implementation: a feature, marked experimental, that allows the
+server to be configured by one or more `uploadpack.blobPackfileUri=<sha1>
+<uri>` entries. Whenever the list of objects to be sent is assembled, all such
+blobs are excluded, replaced with URIs. The client will download those URIs,
+expecting them to each point to packfiles containing single blobs.
+
+Client design
+-------------
+
+The client has a config variable `fetch.uriprotocols` that determines which
+protocols the end user is willing to use. By default, this is empty.
+
+When the client downloads the given URIs, it should store them with "keep"
+files, just like it does with the packfile in the `packfile` section. These
+additional "keep" files can only be removed after the refs have been updated -
+just like the "keep" file for the packfile in the `packfile` section.
+
+The division of work (initial fetch + additional URIs) introduces convenient
+points for resumption of an interrupted clone - such resumption can be done
+after the Minimum Viable Product (see "Future work").
+
+Future work
+-----------
+
+The protocol design allows some evolution of the server and client without any
+need for protocol changes, so only a small-scoped design is included here to
+form the MVP. For example, the following can be done:
+
+ * On the server, more sophisticated means of excluding objects (e.g. by
+   specifying a commit to represent that commit and all objects that it
+   references).
+ * On the client, resumption of clone. If a clone is interrupted, information
+   could be recorded in the repository's config and a "clone-resume" command
+   can resume the clone in progress. (Resumption of subsequent fetches is more
+   difficult because that must deal with the user wanting to use the repository
+   even after the fetch was interrupted.)
+
+There are some possible features that will require a change in protocol:
+
+ * Additional HTTP headers (e.g. authentication)
+ * Byte range support
+ * Different file formats referenced by URIs (e.g. raw object)
diff --git a/Documentation/technical/protocol-v2.txt b/Documentation/technical/protocol-v2.txt
index 995f07481e..f9f4e4ddd0 100644
--- a/Documentation/technical/protocol-v2.txt
+++ b/Documentation/technical/protocol-v2.txt
@@ -323,13 +323,26 @@ included in the client's request:
 	indicating its sideband (1, 2, or 3), and the server may send "0005\2"
 	(a PKT-LINE of sideband 2 with no payload) as a keepalive packet.
 
+If the 'packfile-uris' feature is advertised, the following argument
+can be included in the client's request as well as the potential
+addition of the 'packfile-uris' section in the server's response as
+explained below.
+
+    packfile-uris <comma-separated list of protocols>
+	Indicates to the server that the client is willing to receive
+	URIs of any of the given protocols in place of objects in the
+	sent packfile. Before performing the connectivity check, the
+	client should download from all given URIs. Currently, the
+	protocols supported are "http" and "https".
+
 The response of `fetch` is broken into a number of sections separated by
 delimiter packets (0001), with each section beginning with its section
 header. Most sections are sent only when the packfile is sent.
 
     output = acknowledgements flush-pkt |
 	     [acknowledgments delim-pkt] [shallow-info delim-pkt]
-	     [wanted-refs delim-pkt] packfile flush-pkt
+	     [wanted-refs delim-pkt] [packfile-uris delim-pkt]
+	     packfile flush-pkt
 
     acknowledgments = PKT-LINE("acknowledgments" LF)
 		      (nak | *ack)
@@ -347,6 +360,9 @@ header. Most sections are sent only when the packfile is sent.
 		  *PKT-LINE(wanted-ref LF)
     wanted-ref = obj-id SP refname
 
+    packfile-uris = PKT-LINE("packfile-uris" LF) *packfile-uri
+    packfile-uri = PKT-LINE(40*(HEXDIGIT) SP *%x20-ff LF)
+
     packfile = PKT-LINE("packfile" LF)
 	       *PKT-LINE(%x01-03 *%x00-ff)
 
@@ -418,6 +434,20 @@ header. Most sections are sent only when the packfile is sent.
 	* The server MUST NOT send any refs which were not requested
 	  using 'want-ref' lines.
 
+    packfile-uris section
+	* This section is only included if the client sent
+	  'packfile-uris' and the server has at least one such URI to
+	  send.
+
+	* Always begins with the section header "packfile-uris".
+
+	* For each URI the server sends, it sends a hash of the pack's
+	  contents (as output by git index-pack) followed by the URI.
+
+	* The hashes are 40 hex characters long. When Git upgrades to a new
+	  hash algorithm, this might need to be updated. (It should match
+	  whatever index-pack outputs after "pack\t" or "keep\t".
+
     packfile section
 	* This section is only included if the client has sent 'want'
 	  lines in its request and either requested that no more
-- 
2.27.0.278.ge193c7cf3a9-goog
Previous: Junio C HamanoNext: Junio C Hamano
Message 35 of 44 in “CDN offloading update”
  1. 0/8 CDN offloading updateJonathan Tan, May 29, 2020
  2. 1/8 http: use --stdin when getting dumb HTTP packJonathan Tan, May 29, 2020
  3. Junio C HamanoMay 29, 2020
  4. Jonathan TanJun 1, 2020
  5. 2/8 http: improve documentation of http_pack_requestJonathan Tan, May 29, 2020
  6. 4/8 Documentation: order protocol v2 sectionsJonathan Tan, May 29, 2020
  7. Junio C HamanoMay 29, 2020
  8. Jonathan TanJun 1, 2020
  9. 3/8 http-fetch: support fetching packfiles by URLJonathan Tan, May 29, 2020
  10. Junio C HamanoMay 29, 2020
  11. Jonathan TanJun 1, 2020
  12. 5/8 Documentation: add Packfile URIs design docJonathan Tan, May 29, 2020
  13. Junio C HamanoMay 30, 2020
  14. Junio C HamanoMay 30, 2020
  15. Jonathan TanJun 1, 2020
  16. Jonathan TanJun 1, 2020
  17. Jonathan TanJun 10, 2020
  18. Junio C HamanoJun 10, 2020
  19. Jonathan TanJun 10, 2020
  20. 6/8 upload-pack: refactor reading of pack-objects outJonathan Tan, May 29, 2020
  21. 8/8 upload-pack: send part of packfile response as uriJonathan Tan, May 29, 2020
  22. Junio C HamanoMay 31, 2020
  23. Junio C HamanoMay 31, 2020
  24. Jonathan TanJun 1, 2020
  25. Jonathan NiederJun 1, 2020
  26. 7/8 fetch-pack: support more than one pack lockfileJonathan Tan, May 29, 2020
  27. 0/9 CDN offloading updateJonathan Tan, Jun 10, 2020
  28. 1/9 http: use --stdin when indexing dumb HTTP packJonathan Tan, Jun 10, 2020
  29. Junio C HamanoJun 11, 2020
  30. 2/9 http: refactor finish_http_pack_request()Jonathan Tan, Jun 10, 2020
  31. 3/9 http-fetch: refactor into functionJonathan Tan, Jun 10, 2020
  32. 5/9 Documentation: order protocol v2 sectionsJonathan Tan, Jun 10, 2020
  33. 4/9 http-fetch: support fetching packfiles by URLJonathan Tan, Jun 10, 2020
  34. Junio C HamanoJun 11, 2020
  35. 6/9 Documentation: add Packfile URIs design docJonathan Tan, Jun 10, 2020
  36. Junio C HamanoJun 11, 2020
  37. Ævar Arnfjörð BjarmasonNov 25, 2020
  38. Jonathan TanNov 25, 2020
  39. Ævar Arnfjörð BjarmasonDec 1, 2020
  40. 7/9 upload-pack: refactor reading of pack-objects outJonathan Tan, Jun 10, 2020
  41. 8/9 fetch-pack: support more than one pack lockfileJonathan Tan, Jun 10, 2020
  42. Junio C HamanoJun 11, 2020
  43. 9/9 upload-pack: send part of packfile response as uriJonathan Tan, Jun 10, 2020
  44. Junio C HamanoJun 10, 2020

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.