• Vicent Marti's avatar
    pack-bitmap: implement optional name_hash cache · ae4f07fb
    Vicent Marti authored
    When we use pack bitmaps rather than walking the object
    graph, we end up with the list of objects to include in the
    packfile, but we do not know the path at which any tree or
    blob objects would be found.
    
    In a recently packed repository, this is fine. A fetch would
    use the paths only as a heuristic in the delta compression
    phase, and a fully packed repository should not need to do
    much delta compression.
    
    As time passes, though, we may acquire more objects on top
    of our large bitmapped pack. If clients fetch frequently,
    then they never even look at the bitmapped history, and all
    works as usual. However, a client who has not fetched since
    the last bitmap repack will have "have" tips in the
    bitmapped history, but "want" newer objects.
    
    The bitmaps themselves degrade gracefully in this
    circumstance. We manually walk the more recent bits of
    history, and then use bitmaps when we hit them.
    
    But we would also like to perform delta compression between
    the newer objects and the bitmapped objects (both to delta
    against what we know the user already has, but also between
    "new" and "old" objects that the user is fetching). The lack
    of pathnames makes our delta heuristics much less effective.
    
    This patch adds an optional cache of the 32-bit name_hash
    values to the end of the bitmap file. If present, a reader
    can use it to match bitmapped and non-bitmapped names during
    delta compression.
    
    Here are perf results for p5310:
    
    Test                      origin/master       HEAD^                      HEAD
    -------------------------------------------------------------------------------------------------
    5310.2: repack to disk    36.81(37.82+1.43)   47.70(48.74+1.41) +29.6%   47.75(48.70+1.51) +29.7%
    5310.3: simulated clone   30.78(29.70+2.14)   1.08(0.97+0.10) -96.5%     1.07(0.94+0.12) -96.5%
    5310.4: simulated fetch   3.16(6.10+0.08)     3.54(10.65+0.06) +12.0%    1.70(3.07+0.06) -46.2%
    5310.6: partial bitmap    36.76(43.19+1.81)   6.71(11.25+0.76) -81.7%    4.08(6.26+0.46) -88.9%
    
    You can see that the time spent on an incremental fetch goes
    down, as our delta heuristics are able to do their work.
    And we save time on the partial bitmap clone for the same
    reason.
    Signed-off-by: default avatarVicent Marti <[email protected]>
    Signed-off-by: default avatarJeff King <[email protected]>
    Signed-off-by: default avatarJunio C Hamano <[email protected]>
    ae4f07fb
pack-bitmap.h 1.84 KB