Skip to content
Snippets Groups Projects
  • Pierre-Yves David's avatar
    e9d325cfe071
    revlog: add an experimental option to mitigated delta issues (issue5480) · e9d325cfe071
    Pierre-Yves David authored
    The general delta heuristic to select a delta do not scale with the number of
    branch. The delta base is frequently too far away to be able to reuse a chain
    according to the "distance" criteria. This leads to insertion of larger delta (or
    even full text) that themselves push the bases for the next delta further away
    leading to more large deltas and full texts. This full text and frequent
    recomputation throw Mercurial performance in disarray.
    
    For example of a slightly large repository
    
      280 000 files (2 150 000 versions)
      430 000 changesets (10 000 topological heads)
    
    Number below compares repository with and without the distance criteria:
    
    manifest size:
        with:    21.4 GB
        without:  0.3 GB
    
    store size:
        with:    28.7 GB
        without   7.4 GB
    
    bundle last 15 00 revisions:
        with:    800 seconds
                 971 MB
        without:  50 seconds
                  73 MB
    
    unbundle time (of the last 15K revisions):
        with:    1150 seconds (~19 minutes)
        without:   35 seconds
    
    Similar issues has been observed in other repositories.
    
    
    Adding a new option or "feature" on stable is uncommon. However, given that this
    issues is making Mercurial practically unusable, I'm exceptionally targeting
    this patch for stable.
    
    What is actually needed is a full rework of the delta building and reading
    logic. However, that will be a longer process and churn not suitable for stable.
    
    In the meantime, we introduces a quick and dirty mitigation of this in the
    'experimental' config space. The new option introduces a way to set the maximum
    amount of memory usable to store a diff in memory. This extend the ability for
    Mercurial to create chains without removing all safe guard regarding memory
    access. The option should be phased out when core has a more proper solution
    available.
    
    Setting the limit to '0' remove all limits, setting it to '-1' use the default
    limit (textsize x 4).
    e9d325cfe071
    History
    revlog: add an experimental option to mitigated delta issues (issue5480)
    Pierre-Yves David authored
    The general delta heuristic to select a delta do not scale with the number of
    branch. The delta base is frequently too far away to be able to reuse a chain
    according to the "distance" criteria. This leads to insertion of larger delta (or
    even full text) that themselves push the bases for the next delta further away
    leading to more large deltas and full texts. This full text and frequent
    recomputation throw Mercurial performance in disarray.
    
    For example of a slightly large repository
    
      280 000 files (2 150 000 versions)
      430 000 changesets (10 000 topological heads)
    
    Number below compares repository with and without the distance criteria:
    
    manifest size:
        with:    21.4 GB
        without:  0.3 GB
    
    store size:
        with:    28.7 GB
        without   7.4 GB
    
    bundle last 15 00 revisions:
        with:    800 seconds
                 971 MB
        without:  50 seconds
                  73 MB
    
    unbundle time (of the last 15K revisions):
        with:    1150 seconds (~19 minutes)
        without:   35 seconds
    
    Similar issues has been observed in other repositories.
    
    
    Adding a new option or "feature" on stable is uncommon. However, given that this
    issues is making Mercurial practically unusable, I'm exceptionally targeting
    this patch for stable.
    
    What is actually needed is a full rework of the delta building and reading
    logic. However, that will be a longer process and churn not suitable for stable.
    
    In the meantime, we introduces a quick and dirty mitigation of this in the
    'experimental' config space. The new option introduces a way to set the maximum
    amount of memory usable to store a diff in memory. This extend the ability for
    Mercurial to create chains without removing all safe guard regarding memory
    access. The option should be phased out when core has a more proper solution
    available.
    
    Setting the limit to '0' remove all limits, setting it to '-1' use the default
    limit (textsize x 4).