Re: [PATCH 8/9] sha1-file: use loose object cache for quick existence check
- From
René Scharfe <l.s.r@web.de>
- Date
- Dec 5, 2018, 18:41 UTC
- Message-ID
- <48ab861b-46c8-2bd5-0508-fa106efd8e56@web.de>
- In-Reply-To
- <20181205081544.GA9271@sigill.intra.peff.net>
Am 05.12.2018 um 09:15 schrieb Jeff King:
Show 12 quoted lines
> On Wed, Dec 05, 2018 at 01:51:36AM -0500, Jeff King wrote: > >>> This >>> function is easily converted to struct object_id, though, as its single >>> caller can pass one on -- this makes the copy unnecessary. >> >> If you mean modifying sha1_loose_object_info() to take an oid, then >> sure, I agree that is a good step forward (and that is exactly the "punt >> until" moment I meant). > > So the simple thing is to do that, and then have it pass oid->hash to > the other functions it uses.
Yes.
> If we start to convert those, there's a > little bit of a rabbit hole, but it's actually not too bad.
You don't need to crawl in just for quick_has_loose(), but eventually everything has to be converted. It seems a bit much for one patch, but perhaps that's just my ever-decreasing attention span speaking.
Converting one function prototype or struct member at a time seems about the right amount of change per patch to me. That's not always possible due to entanglement, of course.
Show 5 quoted lines
> Most of the spill-over is into the dumb-http code. Note that it actually > uses sha1 itself! That probably needs to be the_hash_algo (though I'm > not even sure how we'd negotiate the algorithm across a dumb fetch). At > any rate, I don't think this patch makes anything _worse_ in that > respect.
Right.
Show 10 quoted lines
> diff --git a/sha1-file.c b/sha1-file.c > index 3ddf4c9426..0705709036 100644 > --- a/sha1-file.c > +++ b/sha1-file.c > @@ -333,12 +333,12 @@ int raceproof_create_file(const char *path, create_file_fn fn, void *cb) > return ret; > } > > -static void fill_sha1_path(struct strbuf *buf, const unsigned char *sha1) > +static void fill_loose_path(struct strbuf *buf, const struct object_id *oid)
The new name fits.
Show 8 quoted lines
> @@ -879,15 +879,15 @@ int git_open_cloexec(const char *name, int flags) > * Note that it may point to static storage and is only valid until another > * call to stat_sha1_file(). > */ > -static int stat_sha1_file(struct repository *r, const unsigned char *sha1, > - struct stat *st, const char **path) > +static int stat_loose_object(struct repository *r, const struct object_id *oid, > + struct stat *st, const char **path)
Hmm, read_sha1_file() was renamed to read_object_file() earlier this year, and I'd have expected this to become stat_object_file(). Names..
Anyway, the comment above and one a few lines below should be updated as well.
Show 17 quoted lines
> {
> struct object_directory *odb;
> static struct strbuf buf = STRBUF_INIT;
>
> prepare_alt_odb(r);
> for (odb = r->objects->odb; odb; odb = odb->next) {
> - *path = odb_loose_path(odb, &buf, sha1);
> + *path = odb_loose_path(odb, &buf, oid);
> if (!lstat(*path, st))
> return 0;
> }
> @@ -900,7 +900,7 @@ static int stat_sha1_file(struct repository *r, const unsigned char *sha1,
> * descriptor. See the caveats on the "path" parameter above.
> */
> static int open_sha1_file(struct repository *r,
> - const unsigned char *sha1, const char **path)
> + const struct object_id *oid, const char **path)That function should lose the "sha1" in its name as well.
> -static void *map_sha1_file_1(struct repository *r, const char *path, > - const unsigned char *sha1, unsigned long *size) > +static void *map_loose_object_1(struct repository *r, const char *path, > + const struct object_id *oid, unsigned long *size)
Similarly, map_object_file_1()?
Show 5 quoted lines
> -void *map_sha1_file(struct repository *r, > - const unsigned char *sha1, unsigned long *size) > +void *map_loose_object(struct repository *r, > + const struct object_id *oid, > + unsigned long *size)
Similar.
Show 8 quoted lines
> @@ -1045,7 +1043,9 @@ static int unpack_sha1_header_to_strbuf(git_zstream *stream, unsigned char *map, > return -1; > } > > -static void *unpack_sha1_rest(git_zstream *stream, void *buffer, unsigned long size, const unsigned char *sha1) > +static void *unpack_loose_rest(git_zstream *stream, > + void *buffer, unsigned long size, > + const struct object_id *oid)
Hmm, both old and new name here look weird to me at this point.
Show 6 quoted lines
> -static int sha1_loose_object_info(struct repository *r, > - const unsigned char *sha1, > - struct object_info *oi, int flags) > +static int loose_object_info(struct repository *r, > + const struct object_id *oid, > + struct object_info *oi, int flags)
And nothing of value was lost. :)
René