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

Re: [PATCH v1 06/10] packfile: packed_object_info avoids packed_to_object_type

From
Patrick Steinhardt <ps@pks.im>
Date
Jul 24, 2024, 08:36 UTC
Message-ID
<ZqC89ArZWgaZWY7a@tanuki>
In-Reply-To
<20240715003519.2671385-7-e@80x24.org>
On Mon, Jul 15, 2024 at 12:35:15AM +0000, Eric Wong wrote:
Show 20 quoted lines
> For calls the delta base cache, packed_to_object_type calls
> can be omitted.  This prepares us to bypass content_limit for
> non-blob types in the following commit.
> 
> Signed-off-by: Eric Wong <e@80x24.org>
> ---
>  packfile.c | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/packfile.c b/packfile.c
> index b2660e14f9..c2ba6ab203 100644
> --- a/packfile.c
> +++ b/packfile.c
> @@ -1522,7 +1522,7 @@ int packed_object_info(struct repository *r, struct packed_git *p,
>  {
>  	struct pack_window *w_curs = NULL;
>  	off_t curpos = obj_offset;
> -	enum object_type type;
> +	enum object_type type, final_type = OBJ_BAD;
>  	struct delta_base_cache_entry *ent;

I think it might help this patch to move `type` to the scopes where it's used to demonstrate that all code paths set `final_type` as expected.

Show 36 quoted lines
>  	/*
> @@ -1534,7 +1534,7 @@ int packed_object_info(struct repository *r, struct packed_git *p,
>  	ent = get_delta_base_cache_entry(p, obj_offset);
>  	if (ent) {
>  		oi->whence = OI_DBCACHED;
> -		type = ent->type;
> +		final_type = type = ent->type;
>  		if (oi->sizep)
>  			*oi->sizep = ent->size;
>  		if (oi->contentp) {
> @@ -1552,6 +1552,7 @@ int packed_object_info(struct repository *r, struct packed_git *p,
>  	} else if (oi->contentp && !oi->content_limit) {
>  		*oi->contentp = unpack_entry(r, p, obj_offset, &type,
>  						oi->sizep);
> +		final_type = type;
>  		if (!*oi->contentp)
>  			type = OBJ_BAD;
>  	} else {
> @@ -1581,6 +1582,7 @@ int packed_object_info(struct repository *r, struct packed_git *p,
>  			if (oi->sizep && *oi->sizep <= oi->content_limit) {
>  				*oi->contentp = unpack_entry(r, p, obj_offset,
>  							&type, oi->sizep);
> +				final_type = type;
>  				if (!*oi->contentp)
>  					type = OBJ_BAD;
>  			} else {
> @@ -1602,17 +1604,17 @@ int packed_object_info(struct repository *r, struct packed_git *p,
>  	}
>  
>  	if (oi->typep || oi->type_name) {
> -		enum object_type ptot;
> -		ptot = packed_to_object_type(r, p, obj_offset,
> -					     type, &w_curs, curpos);
> +		if (final_type < 0)
> +			final_type = packed_to_object_type(r, p, obj_offset,
> +						     type, &w_curs, curpos);

So this is the actual change we're interested in, right? Instead of unconditionally calling `packed_to_object_type()`, we skip that call in case we know that we have already figured out the correct object type.

Wouldn't it be easier to manage this with a single `type` variable, only, and then conditionally call `packed_to_object_type()` only in the cases where `type != OBJ_OFS_DELTA && type != OBJ_REF_DELTA`? Not sure whether that would be all that useful though given that the function already knows to exit without doing anything in case the type is already properly resolved. So maybe the next patch will enlighten me.

Patrick
Show 15 quoted lines
>  		if (oi->typep)
> -			*oi->typep = ptot;
> +			*oi->typep = final_type;
>  		if (oi->type_name) {
> -			const char *tn = type_name(ptot);
> +			const char *tn = type_name(final_type);
>  			if (tn)
>  				strbuf_addstr(oi->type_name, tn);
>  		}
> -		if (ptot < 0) {
> +		if (final_type < 0) {
>  			type = OBJ_BAD;
>  			goto out;
>  		}
> 
Previous: Eric WongNext: Eric Wong
Message 17 of 51 in “cat-file speedups”
  1. 00/10 cat-file speedupsEric Wong, Jul 15, 2024
  2. 01/10 packfile: move sizep computationEric Wong, Jul 15, 2024
  3. Patrick SteinhardtJul 24, 2024
  4. 02/10 packfile: allow content-limit for cat-fileEric Wong, Jul 15, 2024
  5. Patrick SteinhardtJul 24, 2024
  6. Eric WongJul 26, 2024
  7. 03/10 packfile: fix off-by-one in content_limit comparisonEric Wong, Jul 15, 2024
  8. Patrick SteinhardtJul 24, 2024
  9. Eric WongJul 26, 2024
  10. 04/10 packfile: inline cache_or_unpack_entryEric Wong, Jul 15, 2024
  11. 05/10 cat-file: use delta_base_cache entries directlyEric Wong, Jul 15, 2024
  12. Patrick SteinhardtJul 24, 2024
  13. Eric WongJul 26, 2024
  14. assert vs BUG [was: [PATCH v1 05/10] cat-file: use delta_base_cache entries directly]Eric Wong, Aug 18, 2024
  15. Junio C HamanoAug 19, 2024
  16. 06/10 packfile: packed_object_info avoids packed_to_object_typeEric Wong, Jul 15, 2024
  17. Patrick SteinhardtJul 24, 2024
  18. Eric WongJul 26, 2024
  19. 07/10 object_info: content_limit only applies to blobsEric Wong, Jul 15, 2024
  20. 08/10 cat-file: batch-command uses content_limitEric Wong, Jul 15, 2024
  21. 09/10 cat-file: batch_write: use size_t for lengthEric Wong, Jul 15, 2024
  22. 10/10 cat-file: use writev(2) if availableEric Wong, Jul 15, 2024
  23. Patrick SteinhardtJul 24, 2024
  24. 00/10 cat-file speedupsEric Wong, Aug 23, 2024
  25. 01/10 packfile: move sizep computationEric Wong, Aug 23, 2024
  26. Taylor BlauSep 17, 2024
  27. 02/10 packfile: allow content-limit for cat-fileEric Wong, Aug 23, 2024
  28. Junio C HamanoAug 26, 2024
  29. Eric WongAug 27, 2024
  30. Taylor BlauSep 17, 2024
  31. Junio C HamanoSep 17, 2024
  32. 03/10 packfile: fix off-by-one in content_limit comparisonEric Wong, Aug 23, 2024
  33. Junio C HamanoAug 26, 2024
  34. Taylor BlauSep 17, 2024
  35. 04/10 packfile: inline cache_or_unpack_entryEric Wong, Aug 23, 2024
  36. Junio C HamanoAug 26, 2024
  37. Eric WongOct 6, 2024
  38. 05/10 cat-file: use delta_base_cache entries directlyEric Wong, Aug 23, 2024
  39. Junio C HamanoAug 26, 2024
  40. Junio C HamanoAug 26, 2024
  41. 06/10 packfile: packed_object_info avoids packed_to_object_typeEric Wong, Aug 23, 2024
  42. Junio C HamanoAug 26, 2024
  43. 07/10 object_info: content_limit only applies to blobsEric Wong, Aug 23, 2024
  44. Junio C HamanoAug 26, 2024
  45. 08/10 cat-file: batch-command uses content_limitEric Wong, Aug 23, 2024
  46. Junio C HamanoAug 26, 2024
  47. 09/10 cat-file: batch_write: use size_t for lengthEric Wong, Aug 23, 2024
  48. Junio C HamanoAug 27, 2024
  49. 10/10 cat-file: use writev(2) if availableEric Wong, Aug 23, 2024
  50. Junio C HamanoAug 27, 2024
  51. Junio C HamanoAug 27, 2024

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.