Skip to content
  • Shawn O. Pearce's avatar
    Correct pack memory leak causing git gc to try to exceed ulimit · eac12e2d
    Shawn O. Pearce authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When recursing to unpack a delta base we must unuse_pack() so that
    the pack window for the current object does not remain pinned in
    memory while the delta base is itself being unpacked and materialized
    for our use.
    
    On a long delta chain of 50 objects we may need to access 6 different
    windows from a very large (>3G) pack file in order to obtain all
    of the delta base content.  If the process ulimit permits us to
    map/allocate only 1.5G we must release windows during this recursion
    to ensure we stay within the ulimit and transition memory from pack
    cache to standard malloc, or other mmap needs.
    
    Inserting an unuse_pack() call prior to the recursion allows us to
    avoid pinning the current window, making it available for garbage
    collection if memory runs low.
    
    This has been broken since at least before 1.5.1-rc1, and very
    likely earlier than that.  Its fixed now.  :)
    
    Signed-off-by: default avatarShawn O. Pearce <spearce@spearce.org>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    eac12e2d