summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorRussell Bryant <rbryant@redhat.com>2013-01-11 14:11:08 -0500
committerRussell Bryant <rbryant@redhat.com>2013-01-11 18:06:57 -0500
commitf5a94c7c2cdf090659689fb3194e7e045a1ea2d4 (patch)
treec9b37275202805db8fb716bb04920ef1ae8ce222 /nova
parentb09dabae177d4eb1dc5ba19d0c7962c7fec9faad (diff)
downloadnova-f5a94c7c2cdf090659689fb3194e7e045a1ea2d4.tar.gz
nova-f5a94c7c2cdf090659689fb3194e7e045a1ea2d4.tar.xz
nova-f5a94c7c2cdf090659689fb3194e7e045a1ea2d4.zip
Handle waiting for conductor in nova.service.
Previously we were waiting for conductor to respond to a ping() in the compute manager. This patch moves this down to the base Service class. A nova service binary can indicate that db access is not allowed and if so, as soon as the service gets created, it will block while waiting for conductor to respond. The compute service has been updated to use this. This should not result in any real functional difference. The reason for this is that there is some database access that needs to be avoided down at this level. This allows us to divert these actions to conductor if needed. Part of bp no-db-compute. Change-Id: Idd6387b9428e3f9f4e4dbfe51293693238b2daf0
Diffstat (limited to 'nova')
-rw-r--r--nova/compute/manager.py7
-rw-r--r--nova/service.py13
-rw-r--r--nova/tests/compute/test_compute.py8
3 files changed, 16 insertions, 12 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 98ed1286e..a517f8ffb 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -478,15 +478,12 @@ class ComputeManager(manager.SchedulerDependentManager):
LOG.warning(_('Hypervisor driver does not support '
'firewall rules'), instance=instance)
- def _get_instances_at_startup(self, context):
- self.conductor_api.wait_until_ready(context)
- return self.conductor_api.instance_get_all_by_host(context, self.host)
-
def init_host(self):
"""Initialization for a standalone compute service."""
self.driver.init_host(host=self.host)
context = nova.context.get_admin_context()
- instances = self._get_instances_at_startup(context)
+ instances = self.conductor_api.instance_get_all_by_host(context,
+ self.host)
if CONF.defer_iptables_apply:
self.driver.filter_defer_apply_on()
diff --git a/nova/service.py b/nova/service.py
index 86f022f61..05049d464 100644
--- a/nova/service.py
+++ b/nova/service.py
@@ -30,6 +30,7 @@ import time
import eventlet
import greenlet
+from nova import conductor
from nova import context
from nova import db
from nova import exception
@@ -38,6 +39,7 @@ from nova.openstack.common import eventlet_backdoor
from nova.openstack.common import importutils
from nova.openstack.common import log as logging
from nova.openstack.common import rpc
+from nova.openstack.common.rpc import common as rpc_common
from nova import servicegroup
from nova import utils
from nova import version
@@ -392,7 +394,7 @@ class Service(object):
def __init__(self, host, binary, topic, manager, report_interval=None,
periodic_enable=None, periodic_fuzzy_delay=None,
- periodic_interval_max=None,
+ periodic_interval_max=None, db_allowed=True,
*args, **kwargs):
self.host = host
self.binary = binary
@@ -407,6 +409,9 @@ class Service(object):
self.saved_args, self.saved_kwargs = args, kwargs
self.timers = []
self.backdoor_port = None
+ self.db_allowed = db_allowed
+ self.conductor_api = conductor.API(use_local=db_allowed)
+ self.conductor_api.wait_until_ready(context.get_admin_context())
self.servicegroup_api = servicegroup.API()
def start(self):
@@ -481,7 +486,8 @@ class Service(object):
@classmethod
def create(cls, host=None, binary=None, topic=None, manager=None,
report_interval=None, periodic_enable=None,
- periodic_fuzzy_delay=None, periodic_interval_max=None):
+ periodic_fuzzy_delay=None, periodic_interval_max=None,
+ db_allowed=True):
"""Instantiates class and passes back application object.
:param host: defaults to CONF.host
@@ -514,7 +520,8 @@ class Service(object):
report_interval=report_interval,
periodic_enable=periodic_enable,
periodic_fuzzy_delay=periodic_fuzzy_delay,
- periodic_interval_max=periodic_interval_max)
+ periodic_interval_max=periodic_interval_max,
+ db_allowed=db_allowed)
return service_obj
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index 23df703be..2239e243a 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -3175,8 +3175,8 @@ class ComputeTestCase(BaseTestCase):
def _do_mock_calls(defer_iptables_apply):
self.compute.driver.init_host(host=our_host)
context.get_admin_context().AndReturn(fake_context)
- self.compute._get_instances_at_startup(fake_context).AndReturn(
- startup_instances)
+ self.compute.conductor_api.instance_get_all_by_host(
+ fake_context, our_host).AndReturn(startup_instances)
if defer_iptables_apply:
self.compute.driver.filter_defer_apply_on()
self.compute._destroy_evacuated_instances(fake_context)
@@ -3193,8 +3193,8 @@ class ComputeTestCase(BaseTestCase):
'filter_defer_apply_on')
self.mox.StubOutWithMock(self.compute.driver,
'filter_defer_apply_off')
- self.mox.StubOutWithMock(self.compute,
- '_get_instances_at_startup')
+ self.mox.StubOutWithMock(self.compute.conductor_api,
+ 'instance_get_all_by_host')
self.mox.StubOutWithMock(context, 'get_admin_context')
self.mox.StubOutWithMock(self.compute,
'_destroy_evacuated_instances')