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

Re: [PATCH] diff: restrict when prefetching occurs

From
Derrick Stolee <stolee@gmail.com>
Date
Mar 31, 2020, 17:48 UTC
Message-ID
<d1995983-c5b2-8d44-3949-10286b3f7c0e@gmail.com>
In-Reply-To
<20200331165058.53637-1-jonathantanmy@google.com>
On 3/31/2020 12:50 PM, Jonathan Tan wrote:
Show 27 quoted lines
>> This conflicts with [3], so please keep that in mind.
>>
>> Maybe [3] should be adjusted to assume this patch, because that change
>> is mostly about disabling the batch download when no renames are required.
>> As Peff said [2] the full rename detection trigger is "overly broad".
>>
>> However, the changed-path Bloom filters are an excellent test for this
>> patch, as computing them in a partial clone will trigger downloading all
>> blobs without [3].
>>
>> [3] https://lore.kernel.org/git/55824cda89c1dca7756c8c2d831d6e115f4a9ddb.1585528298.git.gitgitgadget@gmail.com/T/#u
>>
>>> [1] https://lore.kernel.org/git/20200128213508.31661-1-jonathantanmy@google.com/
>>> [2] https://lore.kernel.org/git/20200130055136.GA2184413@coredump.intra.peff.net/
> 
> Thanks for the pointer. Yes, I think that [3] should be adjusted to
> assume this patch.
> 
>>> +		for (i = 0; i < rename_dst_nr; i++) {
>>> +			if (rename_dst[i].pair)
>>> +				continue; /* already found exact match */
>>> +			add_if_missing(options->repo, &to_fetch, rename_dst[i].two);
>>
>> Could this be reversed instead to avoid the "continue"?
> 
> Hmm...I prefer the "return early" approach, but can change it if others
> prefer to avoid the "continue" here.

The "return early" approach is great and makes sense unless there is only one line of code happening in the other case. Not sure if there is any potential that the non-continue case grows in size or not.

Doesn't hurt that much to have the "return early" approach, as you wrote it.

Show 26 quoted lines
>> 	if (!rename_dst[i].pair)
>> 		add_if_missing(options->repo, &to_fetch, rename_dst[i].two);
>>
>>> +		}
>>> +		for (i = 0; i < rename_src_nr; i++)
>>> +			add_if_missing(options->repo, &to_fetch, rename_src[i].p->one);
>>
>> Does this not have the equivalent "rename_src[i].pair" logic for exact
>> matches?
> 
> Thanks for the catch. There's no "pair" in rename_src[i], but the
> equivalent is "if (skip_unmodified &&
> diff_unmodified_pair(rename_src[i].p))", which you can see in the "for"
> loop later in the function. I've added this.
> 
>>> +		if (to_fetch.nr)
>>> +			promisor_remote_get_direct(options->repo,
>>> +						   to_fetch.oid, to_fetch.nr);
>>
>> Perhaps promisor_remote_get_direct() could have the check for
>> nr == 0 to exit early instead of putting that upon all the
>> callers?
> 
> The 2nd param is a pointer to an array, and I think it would be strange
> to pass a pointer to a 0-size region of memory anywhere, so I'll leave
> it as it is.

Well, I would assume that to_fetch.oid is either NULL or is alloc'd larger than to_fetch.nr when there are no added objects.

This is now the fourth location where we if (to_fetch.nr) promisor_remote_get_direct() so we have already violated the rule of three.

My preference would be to insert a patch before this that halts the promisor_remote_get_direct() call on an nr of 0 and deletes the "if (nr)" conditions from the three existing callers. Then this patch could use the logic without ever adding the "if (nr)".

Thanks, -Stolee

Previous: Jonathan TanNext: Junio C Hamano
Message 4 of 26 in “diff: restrict when prefetching occurs”
  1. diff: restrict when prefetching occursJonathan Tan, Mar 31, 2020
  2. Derrick StoleeMar 31, 2020
  3. Jonathan TanMar 31, 2020
  4. Derrick StoleeMar 31, 2020
  5. Junio C HamanoMar 31, 2020
  6. Junio C HamanoMar 31, 2020
  7. 0/2 Restrict when prefetcing occursJonathan Tan, Apr 2, 2020
  8. 1/2 promisor-remote: accept 0 as oid_nr in functionJonathan Tan, Apr 2, 2020
  9. Junio C HamanoApr 2, 2020
  10. Jonathan TanApr 2, 2020
  11. 2/2 diff: restrict when prefetching occursJonathan Tan, Apr 2, 2020
  12. Junio C HamanoApr 2, 2020
  13. Jonathan TanApr 2, 2020
  14. Junio C HamanoApr 2, 2020
  15. Junio C HamanoApr 2, 2020
  16. Jonathan TanApr 3, 2020
  17. Junio C HamanoApr 3, 2020
  18. Junio C HamanoApr 2, 2020
  19. Derrick StoleeApr 6, 2020
  20. Garima SinghApr 6, 2020
  21. 0/4 Restrict when prefetcing occursJonathan Tan, Apr 7, 2020
  22. 1/4 promisor-remote: accept 0 as oid_nr in functionJonathan Tan, Apr 7, 2020
  23. 2/4 diff: make diff_populate_filespec_options structJonathan Tan, Apr 7, 2020
  24. Junio C HamanoApr 7, 2020
  25. 3/4 diff: refactor object readJonathan Tan, Apr 7, 2020
  26. 4/4 diff: restrict when prefetching occursJonathan Tan, Apr 7, 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.