From 96be3de87556d37f94d07eea726f6dd1a5b561b6 Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Mon, 9 Mar 2009 16:27:24 +0000 Subject: Implement profiler mode for bcfg2-info git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5111 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Options.py | 2 ++ src/sbin/bcfg2-info | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/lib/Options.py b/src/lib/Options.py index 2cdc5fcae..b497c138f 100644 --- a/src/lib/Options.py +++ b/src/lib/Options.py @@ -220,6 +220,8 @@ CLIENT_EXTRA_DISPLAY = Option('enable extra entry output', default=False, cmd='-e', ) CLIENT_PARANOID = Option('make automatic backups of config files', default=False, cmd='-P', ) +CORE_PROFILE = Option('profile server core', + default=False, cmd='-p', ) CLIENT_AGENT = Option('run in agent (continuous) mode, wait for reconfigure command from server', default=False, cmd='-A', ) CLIENT_DRIVERS = Option('Specify tool driver set', cmd='-D', cf=('client', 'drivers'), diff --git a/src/sbin/bcfg2-info b/src/sbin/bcfg2-info index 4d4e1aea1..72e6c42e0 100755 --- a/src/sbin/bcfg2-info +++ b/src/sbin/bcfg2-info @@ -2,7 +2,7 @@ '''This tool loads the Bcfg2 core into an interactive debugger''' __revision__ = '$Revision$' -import copy, logging, lxml.etree, sys, cmd +import copy, logging, lxml.etree, sys, cmd, tempfile import Bcfg2.Logger, Bcfg2.Server.Core, os import Bcfg2.Server.Plugins.Metadata, Bcfg2.Server.Plugin import Bcfg2.Options @@ -287,6 +287,16 @@ Usage: [quit|exit]""" continue print cand[0].name +def main(repo, plugins, password, encoding, debug, args=[]): + loop = infoCore(repo, plugins, password, encoding, debug) + if args == ['exit']: + raise SystemExit(0) + elif args: + loop.onecmd(" ".join(args)) + raise SystemExit(0) + else: + loop.do_loop() + if __name__ == '__main__': Bcfg2.Logger.setup_logging('bcfg2-info', to_syslog=False) optinfo = { @@ -297,15 +307,25 @@ if __name__ == '__main__': 'plugins': Bcfg2.Options.SERVER_PLUGINS, 'password': Bcfg2.Options.SERVER_PASSWORD, 'event debug': Bcfg2.Options.DEBUG, + 'profile': Bcfg2.Options.CORE_PROFILE, 'encoding': Bcfg2.Options.ENCODING}) setup = Bcfg2.Options.OptionParser(optinfo) setup.parse(sys.argv[1:]) print setup - loop = infoCore(setup['repo'], setup['plugins'], - setup['password'], setup['encoding'], - '-d' in sys.argv) - if "args" in setup and setup['args']: - loop.onecmd(" ".join(setup['args'])) - raise SystemExit(0) + if not setup['profile']: + main(setup['repo'], setup['plugins'], setup['password'], setup['encoding'], + '-d' in sys.argv, []) else: - loop.do_loop() + import hotshot, hotshot.stats + pfd, pfile = tempfile.mkstemp() + prof = hotshot.Profile(pfile) + try: + prof.runcall(main, setup['repo'], setup['plugins'], setup['password'], + setup['encoding'], '-d' in sys.argv, ['exit']) + except SystemExit: + stats = hotshot.stats.load(pfile) + stats.strip_dirs() + stats.sort_stats('time', 'calls') + stats.print_stats(80) + print pfile + raise -- cgit v1.2.3-1-g7c22