Nova Compute定时任务(三)

上篇文章我们分析了update_available_resourced定时任务,这篇文章我们来继续分析Nova Compute定时任务——report_driver_status和publish_service_capabilities定时任务。

一、report_driver_status定时任务

report_driver_status定时任务的主要功能是定时更新ComputeManager对象缓存的计算节点的capabilities信息。一个计算节点上的capabilities信息包括节点的硬件资源信息和hypervisor支持的特性。report_driver_status定时任务对应于ComputeManager类的_report_driver_status周期方法,该方法的定义如下

class ComputeManager(manager.SchedulerDependentManager):@manager.periodic_taskdef _report_driver_status(self, context):#获取当前时间curr_time = time.time()#如果ComputeManager对象缓存的capabilities已经过期if curr_time – self._last_host_check > CONF.host_state_interval:self._last_host_check = curr_time#获取最新的capabilities信息capabilities = self.driver.get_host_stats(refresh=True)for capability in (capabilities if isinstance(capabilities, list)else [capabilities]):capability['host_ip'] = CONF.my_ip#更新ComputeManager对象缓存的capabilities信息self.update_service_capabilities(capabilities)代码中主要涉及到了两个方法,我们逐一来分析一下:

1. LibvirtDriver类的get_host_stats方法

LibvirtDriver类的get_host_stats方法在上一篇文章分析update_available_resource定时任务时,我们详细分析过,这里就不再重复了,大家可以参见我的上一篇博文。

2. ComputeManager类的update_service_capabilities方法

ComputeManager类的update_service_capabilities方法的作用是更新缓存的计算节点的capabilities信息。ComputeManager类继承自SchedulerDependentManager类,update_service_capabilities方法定义在SchedulerDependentManager类中,其定义如下

class SchedulerDependentManager(Manager):def update_service_capabilities(self, capabilities):if not isinstance(capabilities, list):capabilities = [capabilities]self.last_capabilities = capabilities这个方法比较简单,就是更新last_capabilities成员变量。

二、publish_service_capabilities定时任务

publish_service_capabilities定时任务的功能是定时将ComputeManager对象缓存的capabilities信息发送给Nova Scheduler服务,它是和上面的report_driver_status定时任务配合使用的。publish_service_capabilities定时任务对应于publish_service_capabilities周期方法,其定义如下

class SchedulerDependentManager(Manager):@periodic_taskdef publish_service_capabilities(self, context):if self.last_capabilities:            self.scheduler_rpcapi.update_service_capabilities(context,                    self.service_name, self.host, self.last_capabilities)可以看到publish_service_capabilities方法调用了scheduler_rpcapi变量的update_service_capabilities方法。scheduler_rpcapi变量对应于SchedulerAPI类,SchedulerAPI类的update_service_capabilities方法定义如下

class SchedulerAPI(nova.openstack.common.rpc.proxy.RpcProxy):def update_service_capabilities(self, ctxt, service_name, host,            capabilities):        self.fanout_cast(ctxt, self.make_msg('update_service_capabilities',                service_name=service_name, host=host,                capabilities=capabilities), version='2.4')SchedulerAPI类的update_service_capabilities方法调用了fanout_cast方法向Nova Scheduler服务发送RPC请求。fanout_cast会以广播的方式向所有的Nova Scheduler服务发送请求,所有的Nova Scheduler服务都需要处理该请求。

从上面的代码可以看到,通过RPC请求的是SchedulerManager类的update_service_capabilities方法,其定义如下

class SchedulerManager(manager.Manager):def update_service_capabilities(self, context, service_name,                                    host, capabilities):        #将capabilities封装成列表        if not isinstance(capabilities, list):            capabilities = [capabilities]        for capability in capabilities:            if capability is None:                capability = {}            #调用SchedulerDriver的update_service_capabilities方法self.driver.update_service_capabilities(service_name, host,                                                    capability)SchedulerDriver对象是在配置文件中进行配置的,默认为FilterScheduler类。FilterScheduler类继承自Scheduler类,,Scheduler类的update_service_capabilities方法定义如下

巨龟千岁,却也平淡无奇;昙花瞬间,却能绚丽无比。

Nova Compute定时任务(三)

相关文章:

你感兴趣的文章:

标签云: