Table of Contents
使用log_helpers.log_method_call的方式查看各个函数调用关系... 6
使用timeutils.time_it的方式查看各个函数的耗时... 6
调用过程分析
-> neutron/api/v2/base.py: Controller.create
-> neutron/api/v2/base.py: Controller._create
-> neutron/api/v2/base.py: Controller.prepare_request_body
-> neutron/api/v2/base.py: Controller._create: do_create
-> neutron_lbaas/services/loadbalancer/plugin.py: create_loadbalancer
-> db.create_loadbalancer
-> neutron_lbaas/services/loadbalancer/plugin.py: _call_driver_operation
-> LOADBALANCERV2:F5Networks:neutron_lbaas.drivers.f5.driver_v2.F5LBaaSV2Driver:default
=> LoadBalancerManger:create
-> db.get_loadbalancer
单步跟踪调试过程
/usr/bin/python2 -m pdb /usr/bin/neutron-server --config-file /usr/share/neutron/neutron-dist.conf --config-dir /usr/share/neutron/server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini --config-dir /etc/neutron/conf.d/common --config-dir /etc/neutron/conf.d/neutron-server --log-file /var/log/neutron/server.log
b /usr/lib/python2.7/site-packages/neutron/api/v2/base.py:507
b /usr/lib/python2.7/site-packages/neutron_lbaas/services/loadbalancer/plugin.py:371
b /usr/lib/python2.7/site-packages/neutron_lbaas/services/loadbalancer/plugin.py:170
b /usr/lib/python2.7/site-packages/neutron/api/v2/base.py:507
430
431 def create(self, request, body=None, **kwargs):
432 self._notifier.info(request.context,
433 self._resource + '.create.start',
434 body)
435 return self._create(request, body, **kwargs)
436
437 @db_api.retry_db_errors
438 def _create(self, request, body, **kwargs):
439 """Creates a new instance of the requested entity."""
440 parent_id = kwargs.get(self._parent_id_name)
441 body = Controller.prepare_request_body(request.context,
442 body, True,
443 self._resource, self._attr_info,
444 allow_bulk=self._allow_bulk)
445 action = self._plugin_handlers[self.CREATE]
446 # Check authz
447 if self._collection in body:
448 # Have to account for bulk create
449 items = body[self._collection]
450 else:
451 items = [body]
452 # Ensure policy engine is initialized
453 policy.init()
454 # Store requested resource amounts grouping them by tenant
455 # This won't work with multiple resources. However because of the
456 # current structure of this controller there will hardly be more than
457 # one resource for which reservations are being made
458 request_deltas = collections.defaultdict(int)
459 for item in items:
460 self._validate_network_tenant_ownership(request,
461 item[self._resource])
462 policy.enforce(request.context,
463 action,
464 item[self._resource],
465 pluralized=self._collection)
466 if 'tenant_id' not in item[self._resource]:
467 # no tenant_id - no quota check
468 continue
469 tenant_id = item[self._resource]['tenant_id']
470 request_deltas[tenant_id] += 1
471 # Quota enforcement
472 reservations = []
473 try:
474 for (tenant, delta) in request_deltas.items():
475 reservation = quota.QUOTAS.make_reservation(
476 request.context,
477 tenant,
478 {self._resource: delta},
479 self._plugin)
480 reservations.append(reservation)
481 except n_exc.QuotaResourceUnknown as e:
482 # We don't want to quota this resource
483 LOG.debug(e)
...
506 def do_create(body, bulk=False, emulated=False):
507 kwargs = {self._parent_id_name: parent_id} if parent_id else {}
508 if bulk and not emulated:
509 obj_creator = getattr(self._plugin, "%s_bulk" % action)
510 else:
511 obj_creator = getattr(self._plugin, action)
512 try:
513 if emulated:
514 return self._emulate_bulk_create(obj_creator, request,
515 body, parent_id)
516 else:
517 if self._collection in body:
518 # This is weird but fixing it requires changes to the
519 # plugin interface
520 kwargs.update({self._collection: body})
521 else:
522 kwargs.update({self._resource: body})
523 return obj_creator(request.context, **kwargs)
524 except Exception:
525 # In case of failure the plugin will always raise an
526 # exception. Cancel the reservation
527 with excutils.save_and_reraise_exception():
528 for reservation in reservations:
529 quota.QUOTAS.cancel_reservation(
530 request.context, reservation.reservation_id)
b /usr/lib/python2.7/site-packages/neutron_lbaas/services/loadbalancer/plugin.py:371
370 def create_loadbalancer(self, context, loadbalancer):
371 loadbalancer = loadbalancer.get('loadbalancer')
372 if loadbalancer['flavor_id'] != n_constants.ATTR_NOT_SPECIFIED:
373 self._insert_provider_name_from_flavor(context, loadbalancer)
374 else:
375 del loadbalancer['flavor_id']
376 provider_name = self._get_provider_name(loadbalancer)
377 driver = self.drivers[provider_name]
378 lb_db = self.db.create_loadbalancer(
379 context, loadbalancer,
380 allocate_vip=not driver.load_balancer.allocates_vip)
381 self.service_type_manager.add_resource_association(
382 context,
383 constants.LOADBALANCERV2,
384 provider_name, lb_db.id)
385 create_method = (driver.load_balancer.create_and_allocate_vip
386 if driver.load_balancer.allocates_vip
387 else driver.load_balancer.create)
388 try:
389 self._call_driver_operation(context, create_method, lb_db)
390 except (lbaas_agentschedulerv2.NoEligibleLbaasAgent,
391 lbaas_agentschedulerv2.NoActiveLbaasAgent) as no_agent:
392 self.db.delete_loadbalancer(context, lb_db.id)
393 raise no_agent
394 return self.db.get_loadbalancer(context, lb_db.id).to_api_dict()
b /usr/lib/python2.7/site-packages/neutron_lbaas/services/loadbalancer/plugin.py:170
168 def _call_driver_operation(self, context, driver_method, db_entity,
169 old_db_entity=None, **kwargs):
170 manager_method = "%s.%s" % (driver_method.__self__.__class__.__name__,
171 driver_method.__name__)
172 LOG.info("Calling driver operation %s" % manager_method)
173 try:
174 if old_db_entity:
175 driver_method(context, old_db_entity, db_entity, **kwargs)
176 else:
177 driver_method(context, db_entity, **kwargs)
178 # catching and reraising agent issues
179 except (lbaas_agentschedulerv2.NoEligibleLbaasAgent,
180 lbaas_agentschedulerv2.NoActiveLbaasAgent) as no_agent:
181 raise no_agent
182 # Pass these exceptions through to neutron
183 except (exceptions.ConflictException,
184 exceptions.NotFoundException,
185 exceptions.NotAuthorizedException,
186 exceptions.BadRequestException,
187 exceptions.ServiceUnavailableException):
188 raise
189 except Exception as e:
190 LOG.exception("There was an error in the driver")
191 self._handle_driver_error(context, db_entity)
192 raise loadbalancerv2.DriverError(msg=e)
使用log_helpers.log_method_call的方式查看各个函数调用关系
neutron/api/v2/base.py:24:from oslo_log import helpers as log_helpers
neutron/api/v2/base.py:432: @log_helpers.log_method_call
neutron/api/v2/base.py:508: @log_helpers.log_method_call
Binary file neutron/api/v2/base.pyc matches
neutron_lbaas/services/loadbalancer/plugin.py:33:from oslo_log import helpers as log_helpers
neutron_lbaas/services/loadbalancer/plugin.py:371: @log_helpers.log_method_call
使用timeutils.time_it的方式查看各个函数的耗时
neutron/api/v2/base.py:28:from oslo_utils import timeutils
neutron/api/v2/base.py:433: @timeutils.time_it(LOG)
neutron/api/v2/base.py:510: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:33:from oslo_utils import timeutils
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:65: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:215: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:223: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:248: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:254: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:280: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:341: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:370: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:377: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:389: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:402: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:408: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:415: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:420: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:538: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:572: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:597: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:603: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:610: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:615: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:652: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:671: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:709: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:726: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:732: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:737: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:754: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:762: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:768: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:776: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:781: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:787: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:803: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:812: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:820: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:829: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:834: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:842: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:852: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:859: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:892: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:921: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:930: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:935: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:942: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:957: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:981: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:987: @timeutils.time_it(LOG)
neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:995: @timeutils.time_it(LOG)
neutron_lbaas/services/loadbalancer/plugin.py:36:from oslo_utils import timeutils
neutron_lbaas/services/loadbalancer/plugin.py:170: @timeutils.time_it(LOG)
neutron_lbaas/services/loadbalancer/plugin.py:373: @timeutils.time_it(LOG)
neutron_lbaas/services/loadbalancer/plugin.py:401: @timeutils.time_it(LOG)
neutron_lbaas/services/loadbalancer/plugin.py:551: @timeutils.time_it(LOG)
neutron_lbaas/services/loadbalancer/plugin.py:670: @timeutils.time_it(LOG)
neutron_lbaas/services/loadbalancer/plugin.py:771: @timeutils.time_it(LOG)