# HG changeset patch # User Valentin Gatien-Baron # Date 1548107178 -3600 # Node ID c1c1872d25d18ec33ff0f62ef4ed516f5d3023b2 # Parent 465f2d0df9ae1f36e18fd42e33317a1e38e2f602 deltas: skip if projected compressed size does not match text size constraint If we have a delta, we check constraints against a lower bound estimate of the resulting compressed delta. We then checks this projected size against the ?? size constraints. This allows to exclude potential base candidates before doing any expensive computation. This only apply to the intermediate-snapshot case since this constraint only apply to them. For some pathological cases of a private repository this step provide a further performance boost (timing from `hg perfrevlogwrite`): before: 3.145906 seconds after: 3.010646 seconds diff -r 465f2d0df9ae -r c1c1872d25d1 mercurial/revlogutils/deltas.py --- a/mercurial/revlogutils/deltas.py Mon Jan 21 22:37:30 2019 +0100 +++ b/mercurial/revlogutils/deltas.py Mon Jan 21 22:46:18 2019 +0100 @@ -960,6 +960,12 @@ delta = revinfo.cachedelta[1] if delta is None: delta = self._builddeltadiff(base, revinfo, fh) + # snapshotdept need to be neither None nor 0 level snapshot + if revlog.upperboundcomp is not None and snapshotdepth: + lowestrealisticdeltalen = len(delta) // revlog.upperboundcomp + snapshotlimit = revinfo.textlen >> snapshotdepth + if snapshotlimit < lowestrealisticdeltalen: + return None header, data = revlog.compress(delta) deltalen = len(header) + len(data) offset = revlog.end(len(revlog) - 1)