Skip to content

Commit

Permalink
Don't query nova-network on startup.
Browse files Browse the repository at this point in the history
Fix bug 999698.

nova-compute requested network info for each instance on startup via rpc.
If all services get (re)started at the same time, nova-network may not
be available to take this request, resulting in a lost request.  To
combat this issue, get the network info from the cache in the database
on startup.  If by some chance this information is not correct, it will
get fixed up by a periodic task.

Change-Id: I0bbd475e078ac2a67c99c2be4711e86d617c609a
  • Loading branch information
russellb committed Jun 7, 2012
1 parent 7b7febb commit 8db54f3
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 18 deletions.
10 changes: 2 additions & 8 deletions nova/api/openstack/common.py
Expand Up @@ -26,11 +26,11 @@
from nova.api.openstack import wsgi
from nova.api.openstack import xmlutil
from nova.compute import task_states
from nova.compute import utils as compute_utils
from nova.compute import vm_states
from nova import exception
from nova import flags
from nova import log as logging
from nova.network import model as network_model
from nova import quota


Expand Down Expand Up @@ -321,12 +321,6 @@ def get_networks_for_instance_from_nw_info(nw_info):
return networks


def get_nw_info_for_instance(context, instance):
info_cache = instance['info_cache'] or {}
cached_nwinfo = info_cache.get('network_info') or []
return network_model.NetworkInfo.hydrate(cached_nwinfo)


def get_networks_for_instance(context, instance):
"""Returns a prepared nw_info list for passing into the view builders
Expand All @@ -338,7 +332,7 @@ def get_networks_for_instance(context, instance):
{'addr': '172.16.2.1', 'version': 4}]},
...}
"""
nw_info = get_nw_info_for_instance(context, instance)
nw_info = compute_utils.get_nw_info_for_instance(instance)
return get_networks_for_instance_from_nw_info(nw_info)


Expand Down
4 changes: 2 additions & 2 deletions nova/api/openstack/compute/contrib/cloudpipe.py
Expand Up @@ -16,13 +16,13 @@

import os

from nova.api.openstack import common
from nova.api.openstack import extensions
from nova.api.openstack import wsgi
from nova.api.openstack import xmlutil
from nova.auth import manager
from nova.cloudpipe import pipelib
from nova import compute
from nova.compute import utils as compute_utils
from nova.compute import vm_states
from nova import db
from nova import exception
Expand Down Expand Up @@ -91,7 +91,7 @@ def _vpn_dict(self, context, project_id, instance):
return rv
rv['instance_id'] = instance['uuid']
rv['created_at'] = utils.isotime(instance['created_at'])
nw_info = common.get_nw_info_for_instance(elevated, instance)
nw_info = compute_utils.get_nw_info_for_instance(instance)
if not nw_info:
return rv
vif = nw_info[0]
Expand Down
2 changes: 1 addition & 1 deletion nova/compute/manager.py
Expand Up @@ -287,7 +287,7 @@ def init_host(self):
LOG.debug(_('Current state is %(drv_state)s, state in DB is '
'%(db_state)s.'), locals(), instance=instance)

net_info = self._get_instance_nw_info(context, instance)
net_info = compute_utils.get_nw_info_for_instance(instance)
if ((expect_running and FLAGS.resume_guests_state_on_host_boot) or
FLAGS.start_guests_on_host_boot):
LOG.info(_('Rebooting instance after nova-compute restart.'),
Expand Down
7 changes: 7 additions & 0 deletions nova/compute/utils.py
Expand Up @@ -19,6 +19,7 @@
from nova import db
from nova import flags
from nova import log
from nova.network import model as network_model
from nova import notifications
from nova.notifier import api as notifier_api

Expand Down Expand Up @@ -100,3 +101,9 @@ def notify_about_instance_usage(context, instance, event_suffix,
notifier_api.notify(context, 'compute.%s' % host,
'compute.instance.%s' % event_suffix,
notifier_api.INFO, usage_info)


def get_nw_info_for_instance(instance):
info_cache = instance['info_cache'] or {}
cached_nwinfo = info_cache.get('network_info') or []
return network_model.NetworkInfo.hydrate(cached_nwinfo)
14 changes: 7 additions & 7 deletions nova/tests/api/openstack/compute/contrib/test_cloudpipe.py
Expand Up @@ -15,9 +15,9 @@

from lxml import etree

from nova.api.openstack import common
from nova.api.openstack.compute.contrib import cloudpipe
from nova.api.openstack import wsgi
from nova.compute import utils as compute_utils
from nova import db
from nova import flags
from nova import test
Expand Down Expand Up @@ -65,11 +65,11 @@ def setUp(self):

def test_cloudpipe_list_no_network(self):

def common_get_nw_info_for_instance(context, instance):
def fake_get_nw_info_for_instance(instance):
return {}

self.stubs.Set(common, "get_nw_info_for_instance",
common_get_nw_info_for_instance)
self.stubs.Set(compute_utils, "get_nw_info_for_instance",
fake_get_nw_info_for_instance)
self.stubs.Set(self.controller.compute_api, "get_all",
compute_api_get_all)
req = fakes.HTTPRequest.blank('/v2/fake/os-cloudpipe')
Expand All @@ -86,12 +86,12 @@ def network_api_get(context, network_id):
return {'vpn_public_address': '127.0.0.1',
'vpn_public_port': 22}

def common_get_nw_info_for_instance(context, instance):
def fake_get_nw_info_for_instance(instance):
return fake_network.fake_get_instance_nw_info(self.stubs,
spectacular=True)

self.stubs.Set(common, "get_nw_info_for_instance",
common_get_nw_info_for_instance)
self.stubs.Set(compute_utils, "get_nw_info_for_instance",
fake_get_nw_info_for_instance)
self.stubs.Set(self.controller.network_api, "get",
network_api_get)
self.stubs.Set(self.controller.compute_api, "get_all",
Expand Down

0 comments on commit 8db54f3

Please sign in to comment.