Re: [PATCH 05/13] object-store: allow fetching objects via `has_object()`
- From
Karthik Nayak <karthik.188@gmail.com>
- Date
- Apr 23, 2025, 10:07 UTC
- Message-ID
- <CAOLa=ZRv5WXHQYRg_19ED94+9QVSzi_EP_DAOXNPE4+4sB4P-A@mail.gmail.com>
- In-Reply-To
- <20250423-pks-object-store-cleanups-v1-5-81f8411a5d08@pks.im>
Patrick Steinhardt <ps@pks.im> writes:
Show 40 quoted lines
> We're about to fully remove `repo_has_object_file()` in favor of
> `has_object()` given that the latter has better defaults: it neither
> reloads packfiles by default nor does it fetch any promised objects in
> case they are missing.
>
> The latter usecase keeps us from converting a couple of callsites that
> currently do fetch objects though. It is not really clear whether _all_
> of those callsites should be fetching objects, but for a subset of them
> it is the desired behaviour indeed.
>
> Introduce a new flag `HAS_OBJECT_FETCH_PROMISOR` that causes the
> function to optionally fetch missing objects which are part of a
> promisor pack.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> object-store.c | 9 ++++++---
> object-store.h | 10 +++++++---
> 2 files changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/object-store.c b/object-store.c
> index 0cbad5a19a0..0d873868a6d 100644
> --- a/object-store.c
> +++ b/object-store.c
> @@ -937,12 +937,15 @@ void *read_object_with_reference(struct repository *r,
> int has_object(struct repository *r, const struct object_id *oid,
> unsigned flags)
> {
> - int quick = !(flags & HAS_OBJECT_RECHECK_PACKED);
> - unsigned object_info_flags = OBJECT_INFO_SKIP_FETCH_OBJECT |
> - (quick ? OBJECT_INFO_QUICK : 0);
> + unsigned object_info_flags = 0;
>
> if (!startup_info->have_repository)
> return 0;
> + if (!(flags & HAS_OBJECT_RECHECK_PACKED))
> + object_info_flags |= OBJECT_INFO_QUICK;
> + if (!(flags & HAS_OBJECT_FETCH_PROMISOR))
> + object_info_flags |= OBJECT_INFO_SKIP_FETCH_OBJECT;
> +This already is much easier to read.
Show 30 quoted lines
> return oid_object_info_extended(r, oid, NULL, object_info_flags) >= 0;
> }
>
> diff --git a/object-store.h b/object-store.h
> index 5bbdaba92d1..c6055376f49 100644
> --- a/object-store.h
> +++ b/object-store.h
> @@ -266,12 +266,16 @@ int oid_object_info_extended(struct repository *r,
> const struct object_id *,
> struct object_info *, unsigned flags);
>
> -/* Retry packed storage after checking packed and loose storage */
> -#define HAS_OBJECT_RECHECK_PACKED 1
> +enum {
> + /* Retry packed storage after checking packed and loose storage */
> + HAS_OBJECT_RECHECK_PACKED = (1 << 0),
> + /* Allow fetching the object in case the repository has a promisor remote. */
> + HAS_OBJECT_FETCH_PROMISOR = (1 << 1),
> +};
>
> /*
> * Returns 1 if the object exists. This function will not lazily fetch objects
> - * in a partial clone.
> + * in a partial clone by default.
> */
> int has_object(struct repository *r, const struct object_id *oid,
> unsigned flags);
>
> --
> 2.49.0.901.g37484f566f.dirtyOkay so we add the functionality here, and possibly use it in the future patches. Good.