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

Re: [PATCH 04/10] upload-pack: add partial (sparse) fetch

From
Jeff King <peff@peff.net>
Date
Mar 9, 2017, 07:48 UTC
Message-ID
<20170309074849.ktl5vqbzkiwwwbob@sigill.intra.peff.net>
In-Reply-To
<1488994685-37403-5-git-send-email-jeffhost@microsoft.com>
On Wed, Mar 08, 2017 at 05:37:59PM +0000, Jeff Hostetler wrote:
Show 19 quoted lines
> diff --git a/Documentation/technical/pack-protocol.txt b/Documentation/technical/pack-protocol.txt
> index c59ac99..0032729 100644
> --- a/Documentation/technical/pack-protocol.txt
> +++ b/Documentation/technical/pack-protocol.txt
> @@ -212,6 +212,7 @@ out of what the server said it could do with the first 'want' line.
>    upload-request    =  want-list
>  		       *shallow-line
>  		       *1depth-request
> +		       *partial
>  		       flush-pkt
>  
>    want-list         =  first-want
> @@ -223,10 +224,15 @@ out of what the server said it could do with the first 'want' line.
>  		       PKT-LINE("deepen-since" SP timestamp) /
>  		       PKT-LINE("deepen-not" SP ref)
>  
> +  partial           =  PKT-LINE("partial-by-size" SP magnitude) /
> +		       PKT-LINE("partial-special)  
> +

I probably would have added this as a capability coming back from the client, since it only makes sense to send once (the same way we ask for other features like include-tag or ofs-delta). I guess it's six of one, half a dozen of the other, though.

I notice that you require the client to request the "partial" capability _and_ to send these commands. I'm not sure what the client capability response is helping. The server has said "I can do this" and the client either asks for it or not.

Show 10 quoted lines
> +		if (skip_prefix(line, "partial-by-size ", &arg)) {
> +			unsigned long s;
> +			if (!client_requested_partial_capability)
> +				die("git upload-pack: 'partial-by-size' option requires 'partial' capability");
> +			if (!git_parse_ulong(arg, &s))
> +				die("git upload-pack: invalid partial-by-size value: %s", line);
> +			strbuf_addstr(&partial_by_size, "--partial-by-size=");
> +			strbuf_addstr(&partial_by_size, arg);
> +			have_partial_by_size = 1;
> +			continue;

So we parse it here for validation, but then pass the original string on to be parsed again by pack-objects. I think I'd rather see us use the result of our parse here, just to avoid any bugs where the parsing isn't identical (and there is such a bug currently due to the signed/unsigned thing I mentioned).

I also wonder whether the magnitude suffixes are worth exposing across the wire. Anybody touching the list of units in git_parse_ulong() would probably be surprised that the protocol is dependent on them (not that I expect us to really take any away, but it just seems like an unnecessary protocol complication).

-Peff
Previous: Jeff HostetlerNext: Jeff Hostetler
Message 15 of 31 in “RFC Partial Clone and Fetch”
  1. 00/10 RFC Partial Clone and FetchJeff Hostetler, Mar 8, 2017
  2. 02/10 pack-objects: add --partial-by-size=n --partial-specialJeff Hostetler, Mar 8, 2017
  3. Junio C HamanoMar 8, 2017
  4. Jeff HostetlerMar 8, 2017
  5. Jeff KingMar 9, 2017
  6. Brandon WilliamsMar 10, 2017
  7. Jeff KingMar 10, 2017
  8. Junio C HamanoMar 10, 2017
  9. Jeff KingMar 10, 2017
  10. Jeff KingMar 9, 2017
  11. Jeff HostetlerMar 9, 2017
  12. 07/10 index-pack: add --allow-partial option to relax blob existence checksJeff Hostetler, Mar 8, 2017
  13. 05/10 fetch-pack: add partial-by-size and partial-specialJeff Hostetler, Mar 8, 2017
  14. 04/10 upload-pack: add partial (sparse) fetchJeff Hostetler, Mar 8, 2017
  15. Jeff KingMar 9, 2017
  16. Jeff HostetlerMar 9, 2017
  17. Jeff KingMar 9, 2017
  18. 06/10 rev-list: add --allow-partial option to relax connectivity checksJeff Hostetler, Mar 8, 2017
  19. Junio C HamanoMar 8, 2017
  20. Jeff HostetlerMar 8, 2017
  21. Jeff KingMar 9, 2017
  22. Jeff HostetlerMar 9, 2017
  23. 03/10 pack-objects: test for --partial-by-size --partial-specialJeff Hostetler, Mar 8, 2017
  24. Jeff KingMar 9, 2017
  25. Johannes SixtMar 9, 2017
  26. 08/10 fetch: add partial-by-size and partial-special argumentsJeff Hostetler, Mar 8, 2017
  27. 01/10 pack-objects: eat CR in addition to LF after fgets.Jeff Hostetler, Mar 8, 2017
  28. Jeff KingMar 9, 2017
  29. Jeff HostetlerMar 9, 2017
  30. 09/10 clone: add partial-by-size and partial-special argumentsJeff Hostetler, Mar 8, 2017
  31. 10/10 ls-partial: created command to list missing blobsJeff Hostetler, Mar 8, 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.