• Jeff King's avatar
    upload-pack: avoid parsing tag destinations · 90108a24
    Jeff King authored
    When upload-pack advertises refs, it dereferences any tags
    it sees, and shows the resulting sha1 to the client. It does
    this by calling deref_tag. That function must load and parse
    each tag object to find the sha1 of the tagged object.
    However, it also ends up parsing the tagged object itself,
    which is not strictly necessary for upload-pack's use.
    Each tag produces two object loads (assuming it is not a
    recursive tag), when it could get away with only a single
    one. Dropping the second load halves the effort we spend.
    The downside is that we are no longer verifying the
    resulting object by loading it. In particular:
      1. We never cross-check the "type" field given in the tag
         object with the type of the pointed-to object.  If the
         tag says it points to a tag but doesn't, then we will
         keep peeling and realize the error.  If the tag says it
         points to a non-tag but actually points to a tag, we
         will stop peeling and just advertise the pointed-to
      2. If we are missing the pointed-to object, we will not
         realize (because we never even look it up in the object
    However, both of these are errors in the object database,
    and both will be detected if a client actually requests the
    broken objects in question. So we are simply pushing the
    verification away from the advertising stage, and down to
    the actual fetching stage.
    On my test repo with 120K refs, this drops the time to
    advertise the refs from ~3.2s to ~2.0s.
    Signed-off-by: default avatarJeff King <[email protected]>
    Signed-off-by: default avatarJunio C Hamano <[email protected]>
tag.c 3.92 KB