目录
这里以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.ob