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

Re: [PATCH 11/20] refs: record the ref_store in ref_cache, not ref_dir

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Mar 20, 2017, 22:39 UTC
Message-ID
<5e015cd9-f53e-b27b-ff73-d95706df3223@alum.mit.edu>
In-Reply-To
<20170320175145.zwfqp7varl4hwink@sigill.intra.peff.net>
On 03/20/2017 06:51 PM, Jeff King wrote:
Show 13 quoted lines
> On Mon, Mar 20, 2017 at 05:33:16PM +0100, Michael Haggerty wrote:
> 
>> Instead of keeping a pointer to the ref_store in every ref_dir entry,
>> store it once in `struct ref_cache`, and change `struct ref_dir` to
>> include a pointer to its containing `ref_cache` instead. This makes it
>> easier to add to the information that is stored in `struct ref_cache`
>> without inflating the size of the individual entries.
> 
> This last sentence confused me. It's a pointer either way, no?
> 
> Do you just mean that we are free to add whatever we like to the
> "ref_cache" without polluting the "ref_store" that is a more public data
> structure?
Yeah, that's explained poorly. It might be clearer as
> This makes it easier to add to the information that is accessible
> from a `ref_dir` without increasing the size of every `ref_dir`
> instance.

It used to be that `ref_dir` contained a pointer to the `ref_store` that contains it. (BTW, such a pointer *can't* be turned into a pointer to the `ref_cache` because (1) the `ref_dir` shouldn't have to know what kind of `ref_store` it is being used with, and (2) a `packed_ref_cache` can be detached from its old `ref_cache` if the stat info indicates that the `packed-refs` file has been modified since it was last read.)

But we want to add a `fill_ref_dir` callback pointer in a place that is reachable from the `ref_dir` so that it can fill itself when necessary. We could add it to the `ref_dir` struct, but that would inflate its size. Instead, it makes more sense for the `ref_dir` to have a pointer to the enclosing `ref_cache`, and store the `fill_ref_dir` pointer in `ref_cache`. The `ref_cache` also gets a pointer to the enclosing `ref_store`; that way a `ref_dir` also has a way to access the `ref_store` that contains it.

An alternative would be to pass a pointer to the `ref_cache` down the call stack when it is being accessed, but that seemed like a lot of work that wouldn't lead to a very clean result.

Michael
Previous: Jeff KingNext: Michael Haggerty
Message 7 of 38 in “Separate `ref_cache` into a separate module”
  1. 00/20 Separate `ref_cache` into a separate moduleMichael Haggerty, Mar 20, 2017
  2. 01/20 get_ref_dir(): don't call read_loose_refs() for "refs/bisect"Michael Haggerty, Mar 20, 2017
  3. 10/20 ref-cache: introduce a new type, ref_cacheMichael Haggerty, Mar 20, 2017
  4. 13/20 refs: handle "refs/bisect/" in `loose_fill_ref_dir()`Michael Haggerty, Mar 20, 2017
  5. 11/20 refs: record the ref_store in ref_cache, not ref_dirMichael Haggerty, Mar 20, 2017
  6. Jeff KingMar 20, 2017
  7. Michael HaggertyMar 20, 2017
  8. 08/20 Rename `remove_entry()` to `remove_entry_from_dir()`Michael Haggerty, Mar 20, 2017
  9. 18/20 commit_packed_refs(): use reference iterationMichael Haggerty, Mar 20, 2017
  10. Jeff KingMar 20, 2017
  11. Michael HaggertyMar 22, 2017
  12. Jeff KingMar 22, 2017
  13. 20/20 do_for_each_entry_in_dir(): delete functionMichael Haggerty, Mar 20, 2017
  14. 16/20 get_loose_ref_cache(): new functionMichael Haggerty, Mar 20, 2017
  15. 15/20 get_loose_ref_dir(): function renamed from get_loose_refs()Michael Haggerty, Mar 20, 2017
  16. 19/20 files_pack_refs(): use reference iterationMichael Haggerty, Mar 20, 2017
  17. 14/20 do_for_each_entry_in_dir(): eliminate `offset` argumentMichael Haggerty, Mar 20, 2017
  18. 03/20 refs_ref_iterator_begin(): new functionMichael Haggerty, Mar 20, 2017
  19. 17/20 cache_ref_iterator_begin(): make function smarterMichael Haggerty, Mar 20, 2017
  20. 07/20 Rename `find_ref()` to `find_ref_entry()`Michael Haggerty, Mar 20, 2017
  21. 12/20 ref-cache: use a callback function to fill the cacheMichael Haggerty, Mar 20, 2017
  22. 09/20 refs: split `ref_cache` code into separate filesMichael Haggerty, Mar 20, 2017
  23. Jeff KingMar 20, 2017
  24. Junio C HamanoMar 20, 2017
  25. Stefan BellerMar 20, 2017
  26. Junio C HamanoMar 20, 2017
  27. 04/20 refs_verify_refname_available(): implement once for all backendsMichael Haggerty, Mar 20, 2017
  28. Jeff KingMar 20, 2017
  29. Michael HaggertyMar 20, 2017
  30. 02/20 refs_read_raw_ref(): new functionMichael Haggerty, Mar 20, 2017
  31. 06/20 Rename `add_ref()` to `add_ref_entry()`Michael Haggerty, Mar 20, 2017
  32. 05/20 refs_verify_refname_available(): use function in more placesMichael Haggerty, Mar 20, 2017
  33. Junio C HamanoMar 20, 2017
  34. Jeff KingMar 20, 2017
  35. Ævar Arnfjörð BjarmasonMar 20, 2017
  36. Jeff KingMar 20, 2017
  37. Junio C HamanoMar 20, 2017
  38. Michael HaggertyMar 20, 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.