目录
这里以instance.save函数为例进行说明。
nova组件中compute服务访问DB的方式是通过Conductor服务来实现的,即通过indirection_api重定向到Conductor服务。
compute服务启动方法:
nova.cmd.compute.main
在该函数中初始化重定向api方法:
- cmd_common.block_db_access('nova-compute')
- objects_base.NovaObject.indirection_api = conductor_rpcapi.ConductorAPI()
同时在nova.service.Service函数中,会等待conductor服务正常运行:
- if objects_base.NovaObject.indirection_api:
- conductor_api = conductor.API()
- conductor_api.wait_until_ready(context.get_admin_context())
因为构造Instance实例的时候,类的继承关系是:
- oslo_versionedobjects.base.VersionedObject
- --> nova.objects.base.NovaObject
- --> nova.objects.instance.Instance
而indirection_api作为oslo_versionedobjects.base.VersionedObject成员变量,在nova.objects.instance.Instance中也是起到作用的,即调用instance的save()方法时,有一个@base.remotable装饰器,位于/nova/objects/instance.py
- @base.remotable
- def save(self, expected_vm_state=None,
- expected_task_state=None, admin_state_reset=False):
通过这个装饰器,会判断self.indirection_api是否存在,上面已经赋值,因此可以在compute服务中通过indirection_api重定向到nova-conductor中。
- @base.remotable装饰器源码位于:
- oslo_versionedobjects.base.remotable
- if self.indirection_api:
- updates, result = self.indirection_api.object