#!/usr/bin/env python # Copyright (c) 2010-2012 OpenStack Foundation # Copyright (c) 2019 OpenIO SAS # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from __future__ import print_function import sys from optparse import OptionParser from swift.common.utils import parse_options from oioswift.common import wsgi as oiowsgi from swift.common import wsgi from oioswift.server import global_conf_callback GLOBAL_CONF = None def global_conf_callback_wrapper(preloaded_app_conf, global_conf): global GLOBAL_CONF global_conf_callback(preloaded_app_conf, global_conf) GLOBAL_CONF = global_conf orig_run_server = wsgi.run_server def run_server_wrapper(conf, logger, sock, global_conf=None): if global_conf is None and GLOBAL_CONF is not None: global_conf = {k: v for k, v in GLOBAL_CONF.items() if k.startswith('oio')} return orig_run_server(conf, logger, sock, global_conf) wsgi.make_env = oiowsgi.oio_make_env wsgi.make_subrequest = oiowsgi.oio_make_subrequest wsgi.run_server = run_server_wrapper def run_objgraph(types): import objgraph import os import random objgraph.show_most_common_types(limit=50, shortnames=False) for type_ in types: count = objgraph.count(type_) print('%s objects: %d' % (type_, count)) if count: objgraph.show_backrefs( random.choice(objgraph.by_type(type_)), max_depth=20, filename='/tmp/backrefs_%s_%d.dot' % (type_, os.getpid())) if __name__ == '__main__': parser = OptionParser(usage="%prog CONFIG [options]") parser.add_option('--objgraph', action='store_true', help=('Run objgraph, show most common ' 'types before exiting')) parser.add_option('--show-backrefs', action='append', default=list(), help=('Draw backreference graph for one randomly ' 'chosen object of that type. Can be used ' 'multiple times.')) conf_file, options = parse_options(parser) res = wsgi.run_wsgi(conf_file, 'proxy-server', global_conf_callback=global_conf_callback_wrapper, **options) if options.get('objgraph'): run_objgraph(options.get('show_backrefs', list())) sys.exit(res)