nova instance启动中的同步与异步

instance create:
nova/api/servers.create -- self.compute_api.create -- self.compute_task_api.build_instances
-- self.conductor_compute_rpcapi.build_instances(conductorp/api.py) --  cctxt.cast(context, 'build_instances', **kw)
从nova api到conductor的调用为异步
conductor manager 里面:
1. hosts = self._schedule_instances:
-- self.scheduler_client.select_destinations -- self.scheduler_rpcapi.select_destinations -- cctxt.call(ctxt, 'select_destinations'
从conductor调用select_destinations到scheduler采用同步

所以,当FilterScheduler有异常:

            reason = _('There are not enough hosts available.')
            raise exception.NoValidHost(reason=reason)

scheduler manager 中利用@messaging.expected_exceptions(exception.NoValidHost)

把该异常传回给conductor,conductor在这里捕获该异常并把状态设置为ERROR:

        except Exception as exc:
            updates = {'vm_state': vm_states.ERROR, 'task_state': None}
            for instance in instances:
                self._set_vm_state_and_notify(
                    context, instance.uuid, 'build_instances', updates,
                    exc, request_spec)
            return

出错为:

nova.scheduler.utils [^[[01;36mreq-7ceeb23a-1d2e-401b-bbb7-2d8058715e82 ^[[00;36madmin admin^[[01;33m] ^[[01;35m^[[01;33mFailed to compute_task_build_instances: No valid host was found. There are not enough hosts available.
Traceback (most recent call last):

  File "/usr/local/lib/python2.7/dist-packages/oslo_messaging/rpc/server.py", line 150, in inner
    return func(*args, **kwargs)

  File "/opt/stack/nova/nova/scheduler/manager.py", line 71, in select_destinations
    filter_properties)

  File "/opt/stack/nova/nova/scheduler/filter_scheduler.py", line 81, in select_destinations
    raise exception.NoValidHost(reason=reason)

NoValidHost: No valid host was found. There are not enough hosts available.
^[[00m
2016-01-07 02:26:32.496 ^[[01;33mWARNING nova.scheduler.utils [^[[01;36mreq-7ceeb23a-1d2e-401b-bbb7-2d8058715e82 ^[[00;36madmin admin^[[01;33m] ^[[01;35m[instance: 47b93a3e-b7d1-428f-9b7c-edd80c0735db] ^[[01;33mSetting instance to ERROR state.^[[00m

2. self.compute_rpcapi.build_and_run_instance:
cctxt.cast(ctxt, 'build_and_run_instance -- utils.spawn_n -- eventlet.spawn_n
从conductor调用到compute为异步调用

 

其他:

conductor/rpcapi/ComputeTaskAPI中,对conductor的远程调用

migrate_server为同步

其他build_instances/unshelve_instance/rebuild_instance均为异步

 

posted on 2016-01-07 09:33  allcloud  阅读(782)  评论(0编辑  收藏  举报

导航