Re: [PATCH 4/9] odb: lift object existence check out of the "loose" backend

Toon Claes <[email protected]>
Newsgroups org.kernel.vger.git
Message-ID <[email protected]>
Patrick Steinhardt <[email protected]> writes:

> Before writing a new loose object we first check whether the object
> already exists in any of the sources attached to the object database.
> This results in a couple of issues:
>
>   - We have a layering violation, where the source needs to be aware of
>     objects stored in any of the other sources.
>
>   - Every backend would have to reimplement this check, which feels
>     somewhat pointless.
>
>   - It is not possible to easily write an object into a source in case
>     the same object already exists in another source.
>
> Refactor the code and lift up the object existence check from the
> "loose" backend into the generic ODB layer. No callers need adjustment
> as none of them write via a specific source, but via the ODB layer.
>
> Signed-off-by: Patrick Steinhardt <[email protected]>
> ---
>  odb.c              | 7 +++++++
>  odb/source-loose.c | 8 ++------
>  2 files changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/odb.c b/odb.c
> index 4adbdf8a64..bfeca76f4e 100644
> --- a/odb.c
> +++ b/odb.c
> @@ -997,6 +997,13 @@ int odb_write_object_ext(struct object_database *odb,
>  
>  	hash_object_file(odb->repo->hash_algo, buf, len, type, oid);
>  
> +	/*
> +	 * We can skip the write in case we already have the object available.
> +	 * In that case, we only freshen its mtime.
> +	 */
> +	if (odb_freshen_object(odb, oid))
> +		return 0;
> +

For the loose backend, this calls check_and_freshen_file(), which code
comment says:

    /*
     * All of the check_and_freshen functions return 1 if the file exists and was
     * freshened (if freshening was requested), 0 otherwise. If they return
     * 0, you should not assume that it is safe to skip a write of the object (it
     * either does not exist on disk, or has a stale mtime and may be subject to
     * pruning).
     */

And I see similar logic in the packed backend. So a non-zero value skips
the write and the file was freshened. Makes sense.

-- 
Cheers,
Toon
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.