comparison mercurial/changegroup.py @ 19708:fd4f612f7cb6 stable

bundle: fix performance regression when bundling file changes (issue4031) Somewhere before 2.7, a change [ec896f9e8894] was committed that entailed a large performance regression when bundling (and therefore remote cloning) repositories. For each file in the repository, it would recompute the set of needed changesets even though it is the same for all files. This computation would dominate bundle runtimes according to profiler output (by 10x or more).
author Antoine Pitrou <solipsis@pitrou.net>
date Sat, 07 Sep 2013 21:20:00 +0200
parents 95a49112e7ab
children f8d50add83e1 bfb40168391c
comparison
equal deleted inserted replaced
19706:26ddce1a2a55 19708:fd4f612f7cb6
352 reorder=reorder): 352 reorder=reorder):
353 yield chunk 353 yield chunk
354 progress(msgbundling, None) 354 progress(msgbundling, None)
355 355
356 mfs.clear() 356 mfs.clear()
357 needed = set(cl.rev(x) for x in clnodes)
357 358
358 def linknodes(filerevlog, fname): 359 def linknodes(filerevlog, fname):
359 if fastpathlinkrev: 360 if fastpathlinkrev:
360 ln, llr = filerevlog.node, filerevlog.linkrev 361 ln, llr = filerevlog.node, filerevlog.linkrev
361 needed = set(cl.rev(x) for x in clnodes)
362 def genfilenodes(): 362 def genfilenodes():
363 for r in filerevlog: 363 for r in filerevlog:
364 linkrev = llr(r) 364 linkrev = llr(r)
365 if linkrev in needed: 365 if linkrev in needed:
366 yield filerevlog.node(r), cl.node(linkrev) 366 yield filerevlog.node(r), cl.node(linkrev)