##// END OF EJS Templates
verify: check directory manifests...
verify: check directory manifests In repos with treemanifests, there is no specific verification of directory manifest revlogs. It simply collects all file nodes by reading each manifest delta. With treemanifests, that's means calling the manifest._slowreaddelta(). If there are missing revlog entries in a subdirectory revlog, 'hg verify' will simply report the exception that occurred while trying to read the root manifest: manifest@0: reading delta 1700e2e92882: meta/b/00manifest.i@67688a370455: no node This patch changes the verify code to load only the root manifest at first and verify all revisions of it, then verify all revisions of each direct subdirectory, and so on, recursively. The above message becomes b/@0: parent-directory manifest refers to unknown revision 67688a370455 Since the new algorithm reads a single revlog at a time and in order, 'hg verify' on a treemanifest version of the hg core repo goes from ~50s to ~14s. As expected, there is no significant difference on a repo with flat manifests.

File last commit:

r27618:5a988b3c default
r28203:7297e9e1 default
Show More
lsprofcalltree.py
86 lines | 2.7 KiB | text/x-python | PythonLexer
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024 """
lsprofcalltree.py - lsprof output which is readable by kcachegrind
Authors:
* David Allouche <david <at> allouche.net>
* Jp Calderone & Itamar Shtull-Trauring
* Johan Dahlin
This software may be used and distributed according to the terms
of the GNU General Public License, incorporated herein by reference.
"""
Gregory Szorc
lsprofcalltree: use print function...
r27618 from __future__ import absolute_import, print_function
Gregory Szorc
lsprofcalltree: use absolute_import
r27505
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024 def label(code):
if isinstance(code, str):
return '~' + code # built-in functions ('~' sorts at the end)
else:
return '%s %s:%d' % (code.co_name,
code.co_filename,
code.co_firstlineno)
class KCacheGrind(object):
def __init__(self, profiler):
self.data = profiler.getstats()
self.out_file = None
def output(self, out_file):
self.out_file = out_file
Gregory Szorc
lsprofcalltree: use print function...
r27618 print('events: Ticks', file=out_file)
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024 self._print_summary()
for entry in self.data:
self._entry(entry)
def _print_summary(self):
max_cost = 0
for entry in self.data:
totaltime = int(entry.totaltime * 1000)
max_cost = max(max_cost, totaltime)
Gregory Szorc
lsprofcalltree: use print function...
r27618 print('summary: %d' % max_cost, file=self.out_file)
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024
def _entry(self, entry):
out_file = self.out_file
code = entry.code
if isinstance(code, str):
Gregory Szorc
lsprofcalltree: use print function...
r27618 print('fi=~', file=out_file)
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024 else:
Gregory Szorc
lsprofcalltree: use print function...
r27618 print('fi=%s' % code.co_filename, file=out_file)
print('fn=%s' % label(code), file=out_file)
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024
inlinetime = int(entry.inlinetime * 1000)
if isinstance(code, str):
Gregory Szorc
lsprofcalltree: use print function...
r27618 print('0 ', inlinetime, file=out_file)
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024 else:
Gregory Szorc
lsprofcalltree: use print function...
r27618 print('%d %d' % (code.co_firstlineno, inlinetime), file=out_file)
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024
# recursive calls are counted in entry.calls
if entry.calls:
calls = entry.calls
else:
calls = []
if isinstance(code, str):
lineno = 0
else:
lineno = code.co_firstlineno
for subentry in calls:
self._subentry(lineno, subentry)
Gregory Szorc
lsprofcalltree: use print function...
r27618 print(file=out_file)
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024
def _subentry(self, lineno, subentry):
out_file = self.out_file
code = subentry.code
Gregory Szorc
lsprofcalltree: use print function...
r27618 print('cfn=%s' % label(code), file=out_file)
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024 if isinstance(code, str):
Gregory Szorc
lsprofcalltree: use print function...
r27618 print('cfi=~', file=out_file)
print('calls=%d 0' % subentry.callcount, file=out_file)
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024 else:
Gregory Szorc
lsprofcalltree: use print function...
r27618 print('cfi=%s' % code.co_filename, file=out_file)
print('calls=%d %d' % (
subentry.callcount, code.co_firstlineno), file=out_file)
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024
totaltime = int(subentry.totaltime * 1000)
Gregory Szorc
lsprofcalltree: use print function...
r27618 print('%d %d' % (lineno, totaltime), file=out_file)