• 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均为异步

  • 相关阅读:
    反射API(二)
    反射API(一)
    session一二事
    自定义session的存储机制
    JavaScript 入门笔记
    PHP引用赋值
    九九乘法口诀表
    PHP流程控制笔记
    PHP函数总结 (七)
    Linux程序编辑器习题汇总
  • 原文地址:https://www.cnblogs.com/allcloud/p/5108718.html
Copyright © 2020-2023  润新知