From: Christian Couder <christian.couder@gmail.com> To: Jonathan Tan <jonathantanmy@google.com> Cc: git <git@vger.kernel.org>, Junio C Hamano <gitster@pobox.com>, Jeff Hostetler <git@jeffhostetler.com>, Ben Peart <peartben@gmail.com> Subject: Re: [PATCH 07/18] sha1_file: support lazily fetching missing objects Date: Thu, 12 Oct 2017 16:42:10 +0200 [thread overview] Message-ID: <CAP8UFD2THRj7+RXmismUtUOpXQv4wM7aZsejpd_FHEOycP+ZJA@mail.gmail.com> (raw) In-Reply-To: <5a9242024013345d7a3b0f63580360cdc8cc1c43.1506714999.git.jonathantanmy@google.com> On Fri, Sep 29, 2017 at 10:11 PM, Jonathan Tan <jonathantanmy@google.com> wrote: > diff --git a/sha1_file.c b/sha1_file.c > index b4a67bb83..77aa0ffdf 100644 > --- a/sha1_file.c > +++ b/sha1_file.c > @@ -29,6 +29,7 @@ > #include "mergesort.h" > #include "quote.h" > #include "packfile.h" > +#include "fetch-object.h" > > const unsigned char null_sha1[GIT_MAX_RAWSZ]; > const struct object_id null_oid; > @@ -1149,6 +1150,8 @@ static int sha1_loose_object_info(const unsigned char *sha1, > return (status < 0) ? status : 0; > } > > +int fetch_if_missing = 1; > + > int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, unsigned flags) > { > static struct object_info blank_oi = OBJECT_INFO_INIT; > @@ -1157,6 +1160,7 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, > const unsigned char *real = (flags & OBJECT_INFO_LOOKUP_REPLACE) ? > lookup_replace_object(sha1) : > sha1; > + int already_retried = 0; > > if (!oi) > oi = &blank_oi; > @@ -1181,28 +1185,36 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, > } > } > > - if (!find_pack_entry(real, &e)) { > - /* Most likely it's a loose object. */ > - if (!sha1_loose_object_info(real, oi, flags)) > - return 0; > +retry: > + if (find_pack_entry(real, &e)) > + goto found_packed; > > - /* Not a loose object; someone else may have just packed it. */ > - if (flags & OBJECT_INFO_QUICK) { > - return -1; > - } else { > - reprepare_packed_git(); > - if (!find_pack_entry(real, &e)) > - return -1; > - } > + /* Most likely it's a loose object. */ > + if (!sha1_loose_object_info(real, oi, flags)) > + return 0; > + > + /* Not a loose object; someone else may have just packed it. */ > + reprepare_packed_git(); > + if (find_pack_entry(real, &e)) > + goto found_packed; > + > + /* Check if it is a missing object */ > + if (fetch_if_missing && repository_format_partial_clone && > + !already_retried) { > + fetch_object(repository_format_partial_clone, real); > + already_retried = 1; > + goto retry; > } > > + return -1; > + > +found_packed: > if (oi == &blank_oi) > /* > * We know that the caller doesn't actually need the > * information below, so return early. > */ > return 0; > - > rtype = packed_object_info(e.p, e.offset, oi); > if (rtype < 0) { > mark_bad_packed_object(e.p, real); Instead of adding labels and gotos, I would suggest adding a new function like the following does on top of your changes: diff --git a/sha1_file.c b/sha1_file.c index cc1aa0bd7f..02a6ed1e9b 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1171,18 +1171,40 @@ static int sha1_loose_object_info(const unsigned char *sha1, return (status < 0) ? status : 0; } +int try_find_packed_entry_or_loose_object(const unsigned char *real, struct object_info *oi, + unsigned flags, struct pack_entry *e, int retry) +{ + if (find_pack_entry(real, e)) + return 1; + + /* Most likely it's a loose object. */ + if (!sha1_loose_object_info(real, oi, flags)) + return 0; + + /* Not a loose object; someone else may have just packed it. */ + reprepare_packed_git(); + if (find_pack_entry(real, e)) + return 1; + + /* Check if it is a missing object */ + if (fetch_if_missing && repository_format_partial_clone && retry) { + fetch_object(repository_format_partial_clone, real); + return try_find_packed_entry_or_loose_object(real, oi, flags, e, 0); + } + + return -1; +} + int fetch_if_missing = 1; int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, unsigned flags) { static struct object_info blank_oi = OBJECT_INFO_INIT; struct pack_entry e; - int rtype; + int rtype, res; const unsigned char *real = (flags & OBJECT_INFO_LOOKUP_REPLACE) ? lookup_replace_object(sha1) : sha1; - int already_retried = 0; - if (!oi) oi = &blank_oi; @@ -1206,30 +1228,10 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, } } -retry: - if (find_pack_entry(real, &e)) - goto found_packed; - - /* Most likely it's a loose object. */ - if (!sha1_loose_object_info(real, oi, flags)) - return 0; - - /* Not a loose object; someone else may have just packed it. */ - reprepare_packed_git(); - if (find_pack_entry(real, &e)) - goto found_packed; - - /* Check if it is a missing object */ - if (fetch_if_missing && repository_format_partial_clone && - !already_retried) { - fetch_object(repository_format_partial_clone, real); - already_retried = 1; - goto retry; - } - - return -1; + res = try_find_packed_entry_or_loose_object(real, oi, flags, &e, 1); + if (res < 1) + return res; -found_packed: if (oi == &blank_oi) /* * We know that the caller doesn't actually need the
next prev parent reply other threads:[~2017-10-12 14:42 UTC|newest] Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-09-29 20:11 [PATCH 00/18] Partial clone (from clone to lazy fetch in 18 patches) Jonathan Tan 2017-09-29 20:11 ` [PATCH 01/18] fsck: introduce partialclone extension Jonathan Tan 2017-09-29 20:11 ` [PATCH 02/18] fsck: support refs pointing to promisor objects Jonathan Tan 2017-09-29 20:11 ` [PATCH 03/18] fsck: support referenced " Jonathan Tan 2017-09-29 20:11 ` [PATCH 04/18] fsck: support promisor objects as CLI argument Jonathan Tan 2017-09-29 20:11 ` [PATCH 05/18] index-pack: refactor writing of .keep files Jonathan Tan 2017-09-29 20:11 ` [PATCH 06/18] introduce fetch-object: fetch one promisor object Jonathan Tan 2017-09-29 20:11 ` [PATCH 07/18] sha1_file: support lazily fetching missing objects Jonathan Tan 2017-10-12 14:42 ` Christian Couder [this message] 2017-10-12 15:45 ` Christian Couder 2017-09-29 20:11 ` [PATCH 08/18] rev-list: support termination at promisor objects Jonathan Tan 2017-09-29 20:11 ` [PATCH 09/18] gc: do not repack promisor packfiles Jonathan Tan 2017-09-29 20:11 ` [PATCH 10/18] pack-objects: rename want_.* to ignore_.* Jonathan Tan 2017-09-29 20:11 ` [PATCH 11/18] pack-objects: support --blob-max-bytes Jonathan Tan 2017-09-29 20:11 ` [PATCH 12/18] fetch-pack: support excluding large blobs Jonathan Tan 2017-09-29 20:11 ` [PATCH 13/18] fetch: refactor calculation of remote list Jonathan Tan 2017-09-29 20:11 ` [PATCH 14/18] fetch: support excluding large blobs Jonathan Tan 2017-09-29 20:11 ` [PATCH 15/18] clone: " Jonathan Tan 2017-09-29 20:11 ` [PATCH 16/18] clone: configure blobmaxbytes in created repos Jonathan Tan 2017-09-29 20:11 ` [PATCH 17/18] unpack-trees: batch fetching of missing blobs Jonathan Tan 2017-09-29 20:11 ` [PATCH 18/18] fetch-pack: restore save_commit_buffer after use Jonathan Tan 2017-09-29 21:08 ` [PATCH 00/18] Partial clone (from clone to lazy fetch in 18 patches) Johannes Schindelin 2017-10-02 4:23 ` Junio C Hamano 2017-10-03 6:15 ` Christian Couder 2017-10-03 8:50 ` Junio C Hamano 2017-10-03 14:39 ` Jeff Hostetler 2017-10-03 23:42 ` Jonathan Tan 2017-10-04 13:30 ` Jeff Hostetler
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: http://vger.kernel.org/majordomo-info.html * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=CAP8UFD2THRj7+RXmismUtUOpXQv4wM7aZsejpd_FHEOycP+ZJA@mail.gmail.com \ --to=christian.couder@gmail.com \ --cc=git@jeffhostetler.com \ --cc=git@vger.kernel.org \ --cc=gitster@pobox.com \ --cc=jonathantanmy@google.com \ --cc=peartben@gmail.com \ --subject='Re: [PATCH 07/18] sha1_file: support lazily fetching missing objects' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Code repositories for project(s) associated with this inbox: https://80x24.org/mirrors/git.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).